diff --git a/include/decl.h b/include/decl.h
index a34550ef9..f66c0f5a8 100644
--- a/include/decl.h
+++ b/include/decl.h
@@ -725,7 +725,8 @@ struct instance_globals_o {
/* options.c */
- int opt_phase; /* builtin_opt, syscf_, rc_file_, environ_, play_opt */
+ /* builtin_opt, syscf_, rc_file_, environ_, play_opt */
+ enum option_phases opt_phase;
boolean opt_initial;
boolean opt_from_file;
boolean opt_need_redraw; /* for doset() */
diff --git a/include/extern.h b/include/extern.h
index 8ed1b0f0f..b3206b015 100644
--- a/include/extern.h
+++ b/include/extern.h
@@ -335,6 +335,8 @@ extern boolean parse_conf_file(FILE *fp, boolean (*proc)(char *arg));
extern void set_configfile_name(const char *);
extern char *get_configfile(void);
extern const char *get_default_configfile(void);
+extern void rcfile(void);
+extern void rcfile_interface_options(void);
/* ### coloratt.c ### */
@@ -2320,6 +2322,10 @@ extern int msgtype_type(const char *, boolean) NONNULLARG1;
extern void hide_unhide_msgtypes(boolean, int);
extern void msgtype_free(void);
extern void options_free_window_colors(void);
+extern void set_all_options_heeded(void);
+extern void set_all_options_disregarded(void);
+extern void heed_this_option(enum opt);
+extern void disregard_this_option(enum opt);
#ifdef TTY_PERM_INVENT
extern void check_perm_invent_again(void);
#endif
@@ -2345,6 +2351,7 @@ extern int dowhatdoes(void);
extern char *dowhatdoes_core(char, char *) NONNULLARG2; /*might return NULL*/
extern int dohelp(void);
extern int dohistory(void);
+void allopt_array_init(void);
/* ### xxmain.c ### */
diff --git a/include/global.h b/include/global.h
index 21b00fe46..1439044f1 100644
--- a/include/global.h
+++ b/include/global.h
@@ -102,8 +102,6 @@ typedef unsigned readLenType;
#endif
#define BOOL_RANDOM (-1)
-enum optchoice { opt_in, opt_out};
-
/*
* type nhsym: loadable symbols go into this type
*/
@@ -153,6 +151,16 @@ typedef uchar nhsym;
#endif /* __GNUC__ || _MSC_VER */
#endif /* !__clang__ */
+#define SET__IS_VALUE_VALID(s) ((s < set_in_sysconf) || (s > set_wiznofuz))
+#include "optlist.h"
+enum opt {
+ opt_prefix_only = -1,
+#define NHOPT_ENUM
+#include "optlist.h"
+#undef NHOPT_ENUM
+ OPTCOUNT
+};
+
/*
* Automatic inclusions for the subsidiary files.
* Please don't change the order. It does matter.
diff --git a/include/hack.h b/include/hack.h
index bb9f9d642..f655a8961 100644
--- a/include/hack.h
+++ b/include/hack.h
@@ -702,22 +702,6 @@ enum nhcb_calls {
NUM_NHCB
};
-/*
- * option setting restrictions
- */
-
-enum optset_restrictions {
- set_in_sysconf = 0, /* system config file option only */
- set_in_config = 1, /* config file option only */
- set_viaprog = 2, /* may be set via extern program, not seen in game */
- set_gameview = 3, /* may be set via extern program, displayed in game */
- set_in_game = 4, /* may be set via extern program or set in the game */
- set_wizonly = 5, /* may be set in the game if wizmode */
- set_wiznofuz = 6, /* wizard-mode only, but not by fuzzer */
- set_hidden = 7 /* placeholder for prefixed entries, never show it */
-};
-#define SET__IS_VALUE_VALID(s) ((s < set_in_sysconf) || (s > set_wiznofuz))
-
struct plinemsg_type {
xint16 msgtype; /* one of MSGTYP_foo */
struct nhregex *regex;
diff --git a/include/optlist.h b/include/optlist.h
index b920048ac..9322bee7e 100644
--- a/include/optlist.h
+++ b/include/optlist.h
@@ -4,10 +4,6 @@
#ifndef OPTLIST_H
#define OPTLIST_H
-#ifdef OPTIONS_C
-static int optfn_boolean(int, int, boolean, char *, char *);
-#endif
-
/*
* NOTE: If you add (or delete) an option, please review:
* doc/options.txt
@@ -16,6 +12,37 @@ static int optfn_boolean(int, int, boolean, char *, char *);
* updates that should accompany your change.
*/
+#define BACKWARD_COMPAT
+
+extern int optfn_boolean(int, int, boolean, char *, char *);
+enum optchoice { opt_in, opt_out };
+
+/*
+ * option setting restrictions
+ */
+enum optset_restrictions {
+ set_in_sysconf = 0, /* system config file option only */
+ set_in_config = 1, /* config file option only */
+ set_viaprog = 2, /* may be set via extern program, not seen in game */
+ set_gameview = 3, /* may be set via extern program, displayed in game */
+ set_in_game = 4, /* may be set via extern program or set in the game */
+ set_wizonly = 5, /* may be set in the game if wizmode */
+ set_wiznofuz = 6, /* wizard-mode only, but not by fuzzer */
+ set_hidden = 7 /* placeholder for prefixed entries, never show it */
+};
+
+/* these aren't the same as set_xxx */
+enum option_phases {
+ phase_not_set = 0,
+ builtin_opt = 1, /* compiled-in default value of an option */
+ syscf_opt, /* sysconf setting of an option, overrides builtin */
+ rc_file_opt, /* player's run-time config file setting, overrides syscf */
+ environ_opt, /* player's environment NETHACKOPTIONS, overrides rc_file */
+ cmdline_opt, /* program invocation command-line, overrides environ */
+ play_opt, /* 'O' command, interactively set so overrides all */
+ num_opt_phases
+};
+
enum OptType { BoolOpt, CompOpt, OthrOpt };
enum Y_N { No, Yes };
enum Off_On { Off, On };
@@ -45,7 +72,7 @@ struct allopt_t {
const char *alias;
const char *descr;
const char *prefixgw;
- boolean initval, has_handler, dupdetected;
+ boolean initval, has_handler, dupdetected, disregarded;
};
#endif /* OPTLIST_H */
@@ -74,16 +101,16 @@ static int optfn_##a(int, int, boolean, char *, char *);
#elif defined(NHOPT_PARSE)
#define NHOPTB(a, sec, b, c, s, i, n, v, d, al, bp, termp, desc) \
{ #a, OptS_##sec, 0, b, opt_##a, s, BoolOpt, n, v, d, No, termp, c, \
- bp, &optfn_boolean, al, desc, (const char *) 0, i, 0, 0 },
+ bp, &optfn_boolean, al, desc, (const char *) 0, i, 0, 0 , 0 },
#define NHOPTC(a, sec, b, c, s, n, v, d, h, al, z) \
{ #a, OptS_##sec, 0, b, opt_##a, s, CompOpt, n, v, d, No, 0, c, \
- (boolean *) 0, &optfn_##a, al, z, (const char *) 0, Off, h, 0 },
+ (boolean *) 0, &optfn_##a, al, z, (const char *) 0, Off, h, 0, 0 },
#define NHOPTP(a, sec, b, c, s, n, v, d, h, al, z) \
{ #a, OptS_##sec, 0, b, pfx_##a, s, CompOpt, n, v, d, Yes, 0, c, \
- (boolean *) 0, &pfxfn_##a, al, z, #a, Off, h, 0 },
+ (boolean *) 0, &pfxfn_##a, al, z, #a, Off, h, 0, 0 },
#define NHOPTO(m, sec, a, b, c, s, n, v, d, al, z) \
{ m, OptS_##sec, 0, b, opt_##a, s, OthrOpt, n, v, d, No, 0, c, \
- (boolean *) 0, &optfn_##a, al, z, (const char *) 0, On, On, 0 },
+ (boolean *) 0, &optfn_##a, al, z, (const char *) 0, On, On, 0, 0 },
/* this is not reliable because TILES_IN_GLYPHMAP might be defined
* in a multi-interface binary but not apply to the current interface */
diff --git a/include/windconf.h b/include/windconf.h
index bd30f8a6b..b7330668c 100644
--- a/include/windconf.h
+++ b/include/windconf.h
@@ -32,6 +32,8 @@
#define OPTIONS_AT_RUNTIME /* build info done at runtime not text file */
+#define EARLY_CONFIGFILE_PASS
+
/*
* -----------------------------------------------------------------
* The remaining code shouldn't need modification.
diff --git a/include/winprocs.h b/include/winprocs.h
index 688d76138..014ee1e09 100644
--- a/include/winprocs.h
+++ b/include/winprocs.h
@@ -415,79 +415,4 @@ struct chain_procs {
};
#endif /* WINCHAIN */
-#ifdef SAFEPROCS
-/*
- * window port routines available in sys/share/safeproc.c
- */
-extern struct window_procs *get_safe_procs(int);
-extern void safe_init_nhwindows(int *, char **);
-extern void safe_player_selection(void);
-extern void safe_askname(void);
-extern void safe_get_nh_event(void);
-extern void safe_exit_nhwindows(const char *);
-extern void safe_suspend_nhwindows(const char *);
-extern void safe_resume_nhwindows(void);
-extern winid safe_create_nhwindow(int);
-extern void safe_clear_nhwindow(winid);
-extern void safe_display_nhwindow(winid, boolean);
-extern void safe_destroy_nhwindow(winid);
-extern void safe_curs(winid, int, int);
-extern void safe_putstr(winid, int, const char *);
-extern void safe_putmixed(winid, int, const char *);
-extern void safe_display_file(const char *, boolean);
-extern void safe_start_menu(winid, unsigned long);
-extern void safe_add_menu(winid, const glyph_info *, const ANY_P *,
- char, char, int, int, const char *,
- unsigned int);
-extern void safe_end_menu(winid, const char *);
-extern int safe_select_menu(winid, int, MENU_ITEM_P **);
-extern char safe_message_menu(char, int, const char *);
-extern void safe_mark_synch(void);
-extern void safe_wait_synch(void);
-#ifdef CLIPPING
-extern void safe_cliparound(int, int);
-#endif
-#ifdef POSITIONBAR
-extern void safe_update_positionbar(char *);
-#endif
-extern void safe_print_glyph(winid, coordxy, coordxy,
- const glyph_info *, const glyph_info *);
-extern void safe_raw_print(const char *);
-extern void safe_raw_print_bold(const char *);
-extern int safe_nhgetch(void);
-extern int safe_nh_poskey(coordxy *, coordxy *, int *);
-extern void safe_nhbell(void);
-extern int safe_doprev_message(void);
-extern char safe_yn_function(const char *, const char *, char);
-extern void safe_getlin(const char *, char *);
-extern int safe_get_ext_cmd(void);
-extern void safe_number_pad(int);
-extern void safe_delay_output(void);
-#ifdef CHANGE_COLOR
-extern void safe_change_color(int, long, int);
-#ifdef MAC
-extern void safe_change_background(int);
-extern short safe_set_font_name(winid, char *);
-#endif
-extern char *safe_get_color_string(void);
-#endif
-extern void safe_outrip(winid, int, time_t);
-extern void safe_preference_update(const char *);
-extern char *safe_getmsghistory(boolean);
-extern void safe_putmsghistory(const char *, boolean);
-extern void safe_status_init(void);
-extern void safe_status_finish(void);
-extern void safe_status_enablefield(int, const char *, const char *,
- boolean);
-extern void safe_status_update(int, genericptr_t, int, int, int,
- unsigned long *);
-extern boolean safe_can_suspend(void);
-extern void stdio_raw_print(const char *);
-extern void stdio_nonl_raw_print(const char *);
-extern void stdio_raw_print_bold(const char *);
-extern void stdio_wait_synch(void);
-extern void safe_update_inventory(int);
-extern win_request_info *safe_ctrl_nhwindow(winid, int, win_request_info *);
-extern int stdio_nhgetch(void);
-#endif /* SAFEPROCS */
#endif /* WINPROCS_H */
diff --git a/src/cfgfiles.c b/src/cfgfiles.c
index 1b4715a4f..439747127 100644
--- a/src/cfgfiles.c
+++ b/src/cfgfiles.c
@@ -1881,6 +1881,85 @@ vconfig_error_add(const char *str, va_list the_args)
config_erradd(buf);
}
+void
+rcfile(void)
+{
+ char *opts = 0, *xtraopts = 0;
+ const char *envname, *namesrc, *nameval;
+
+ go.opt_phase = environ_opt;
+ /* getenv() instead of nhgetenv(): let total length of options be long;
+ parseoptions() will check each individually */
+ envname = "NETHACKOPTIONS";
+ opts = getenv(envname);
+ if (!opts) {
+ /* fall back to original name; discouraged */
+ envname = "HACKOPTIONS";
+ opts = getenv(envname);
+ }
+
+ if (gc.cmdline_rcfile) {
+ namesrc = "command line";
+ nameval = gc.cmdline_rcfile;
+ xtraopts = opts;
+ if (opts && (*opts == '/' || *opts == '\\' || *opts == '@'))
+ xtraopts = 0; /* NETHACKOPTIONS is a file name; ignore it */
+ } else if (opts && (*opts == '/' || *opts == '\\' || *opts == '@')) {
+ /* NETHACKOPTIONS is a file name; use that instead of the default */
+ if (*opts == '@')
+ ++opts; /* @filename */
+ namesrc = envname;
+ nameval = opts;
+ xtraopts = 0;
+ } else {
+ /* either no NETHACKOPTIONS or it wasn't a file name;
+ read the default configuration file */
+ nameval = namesrc = 0;
+ xtraopts = opts;
+ }
+
+ go.opt_phase = rc_file_opt;
+ /* seemingly arbitrary name length restriction is to prevent error
+ messages, if any were to be delivered while accessing the file,
+ from potentially overflowing buffers */
+ if (nameval && (int) strlen(nameval) >= BUFSZ / 2) {
+ config_error_init(TRUE, namesrc, FALSE);
+ config_error_add(
+ "nethackrc file name \"%.40s\"... too long; using default",
+ nameval);
+ config_error_done();
+ nameval = namesrc = 0; /* revert to default nethackrc */
+ }
+
+ config_error_init(TRUE, nameval, nameval ? CONFIG_ERROR_SECURE : FALSE);
+ (void) read_config_file(nameval, set_in_config);
+ config_error_done();
+ if (xtraopts) {
+ /* NETHACKOPTIONS is present and not a file name */
+ go.opt_phase = environ_opt;
+ config_error_init(FALSE, envname, FALSE);
+ (void) parseoptions(xtraopts, TRUE, FALSE);
+ config_error_done();
+ }
+
+ if (gc.cmdline_rcfile)
+ free((genericptr_t) gc.cmdline_rcfile), gc.cmdline_rcfile = 0;
+ /*[end of nethackrc handling]*/
+}
+
+void
+rcfile_interface_options(void)
+{
+ allopt_array_init();
+ set_all_options_disregarded();
+ heed_this_option(opt_windowtype);
+ heed_this_option(opt_soundlib);
+ rcfile();
+ set_all_options_heeded();
+ disregard_this_option(opt_windowtype);
+ disregard_this_option(opt_soundlib);
+}
+
#ifdef SYSCF
#ifdef SYSCF_FILE
void
diff --git a/src/decl.c b/src/decl.c
index cc1e8a3b6..f229de737 100644
--- a/src/decl.c
+++ b/src/decl.c
@@ -592,7 +592,7 @@ static const struct instance_globals_o g_init_o = {
/* o_init.c */
DUMMY, /* oclass_prob_totals */
/* options.c */
- 0, /* opt_phase */
+ phase_not_set, /* opt_phase */
FALSE, /* opt_initial */
FALSE, /* opt_from_file */
FALSE, /* opt_need_redraw */
diff --git a/src/options.c b/src/options.c
index c22105c03..8bfe77d97 100644
--- a/src/options.c
+++ b/src/options.c
@@ -56,21 +56,13 @@ NEARDATA struct accessibility_data a11y;
#include "optlist.h"
#undef NHOPT_PROTO
-#define NHOPT_ENUM
-enum opt {
- opt_prefix_only = -1,
-#include "optlist.h"
- OPTCOUNT
-};
-#undef NHOPT_ENUM
-
#define NHOPT_PARSE
static struct allopt_t allopt_init[] = {
#include "optlist.h"
{(const char *) 0, OptS_Advanced, 0, 0, 0, set_in_sysconf, BoolOpt,
No, No, No, No, Term_False, 0, (boolean *) 0,
(int (*)(int, int, boolean, char *, char *)) 0,
- (char *) 0, (const char *) 0, (const char *) 0, 0, 0, 0 }
+ (char *) 0, (const char *) 0, (const char *) 0, 0, 0, 0, TRUE }
};
#undef NHOPT_PARSE
@@ -94,16 +86,6 @@ enum optn_result {
enum requests {
do_nothing, do_init, do_set, do_handler, get_val, get_cnf_val
};
-/* these aren't the same as set_xxx in optlist.h */
-enum option_phases {
- builtin_opt=1,/* compiled-in default value of an option */
- syscf_opt, /* sysconf setting of an option, overrides builtin */
- rc_file_opt, /* player's run-time config file setting, overrides syscf */
- environ_opt, /* player's environment NETHACKOPTIONS, overrides rc_file */
- cmdline_opt, /* program invocation command-line, overrides environ */
- play_opt, /* 'O' command, interactively set so overrides all */
- num_opt_phases
-};
static struct allopt_t allopt[SIZE(allopt_init)];
@@ -124,6 +106,7 @@ extern char ttycolors[CLR_MAX]; /* in sys/msdos/video.c */
static char empty_optstr[] = { '\0' };
static boolean duplicate, using_alias;
static boolean give_opt_msg = TRUE;
+static boolean restricted_options_mode = FALSE;
enum { MAX_ROLEOPT = 4 }; /* 4: role,race,gend,algn */
static boolean opt_set_in_config[OPTCOUNT];
@@ -357,6 +340,7 @@ static const menu_cmd_t default_menu_cmd_info[] = {
static const char n_currently_set[] = "(%d currently set)";
+staticfn void allopt_array_init(void);
staticfn void nmcpy(char *, const char *, int);
staticfn void escapes(const char *, char *);
staticfn void rejectoption(const char *);
@@ -595,7 +579,7 @@ parseoptions(
* placed that number into each option's allopt[n].minmatch.
*
*/
- if (!got_match)
+ if (!got_match && allopt[i].name)
got_match = match_optname(opts, allopt[i].name,
allopt[i].minmatch, TRUE);
if (got_match) {
@@ -634,7 +618,8 @@ parseoptions(
/* allow optfn's to test whether they were called from parseoptions() */
program_state.in_parseoptions++;
- if (got_match && matchidx >= 0) {
+ if (got_match && (matchidx >= 0 && matchidx < OPTCOUNT)
+ && !allopt[matchidx].disregarded) {
duplicate = duplicate_opt_detection(matchidx);
if (duplicate && !allopt[matchidx].dupeok)
complain_about_duplicate(matchidx);
@@ -684,7 +669,7 @@ parseoptions(
}
}
- if (optresult == optn_silenterr)
+ if (optresult == optn_silenterr || restricted_options_mode)
return FALSE;
if (pfx_match && optresult == optn_err) {
char pfxbuf[BUFSZ], *pfxp;
@@ -4971,17 +4956,20 @@ optfn_windowtype(
* _end_ because comma-separated option strings are processed from
* right to left.
*/
- if (iflags.windowtype_locked)
- return optn_ok;
+ if (!iflags.window_inited) {
+ if (iflags.windowtype_locked)
+ return optn_ok;
- if ((op = string_for_env_opt(allopt[optidx].name, opts, FALSE))
- != empty_optstr) {
- nmcpy(gc.chosen_windowtype, op, WINTYPELEN);
- if (!iflags.windowtype_deferred) {
- choose_windows(gc.chosen_windowtype);
+ if ((op = string_for_env_opt(allopt[optidx].name, opts, FALSE))
+ != empty_optstr) {
+ nmcpy(gc.chosen_windowtype, op, WINTYPELEN);
+ if (!iflags.windowtype_deferred) {
+ choose_windows(gc.chosen_windowtype);
+ }
+ } else {
+ return optn_err;
}
- } else
- return optn_err;
+ }
return optn_ok;
}
if (req == get_val || req == get_cnf_val) {
@@ -7066,29 +7054,14 @@ txt2key(char *txt)
void
initoptions(void)
{
- int i;
-
/*
* Most places that call initoptions_init()/initoptions() would
* have the calls next to each other, so instead of adding
* initoptions_init() everywhere, just add it where it's needed in
* a non-adjacent place and call it here for all the other cases.
*/
- if(go.opt_phase != builtin_opt)
+ if (go.opt_phase != builtin_opt)
initoptions_init();
-
- /*
- * Call each option function with an init flag and give it a chance
- * to make any preparations that it might require. We do this
- * whether or not the option itself is ever specified; that's
- * irrelevant for the init call. Doing this allows the prep code for
- * option settings to remain adjacent to, and in the same function as,
- * the code that processes those options.
- */
- for (i = 0; i < OPTCOUNT; ++i) {
- if (allopt[i].optfn)
- (*allopt[i].optfn)(i, do_init, FALSE, empty_optstr, empty_optstr);
- }
#ifdef SYSCF
/* someday there may be other SYSCF alternatives besides text file */
#ifdef SYSCF_FILE
@@ -7130,9 +7103,7 @@ initoptions_init(void)
go.opt_phase = builtin_opt; /* Did I need to move this here? */
/* initialize the function pointers for saving the game */
sf_init();
- memcpy(allopt, allopt_init, sizeof(allopt));
- determine_ambiguities();
-
+ allopt_array_init();
/* if windowtype has been specified on the command line, set it up
early so windowtype-specific options use it as their base */
if (gc.cmdline_windowsys) {
@@ -7286,6 +7257,28 @@ initoptions_init(void)
/* since this is done before init_objects(), do partial init here */
objects[SLIME_MOLD].oc_name_idx = SLIME_MOLD;
nmcpy(svp.pl_fruit, OBJ_NAME(objects[SLIME_MOLD]), PL_FSIZ);
+
+#ifdef SYSCF
+/* someday there may be other SYSCF alternatives besides text file */
+#ifdef SYSCF_FILE
+ /* If SYSCF_FILE is specified, it _must_ exist... */
+ assure_syscf_file();
+ config_error_init(TRUE, SYSCF_FILE, FALSE);
+
+ /* ... and _must_ parse correctly. */
+ go.opt_phase = syscf_opt;
+ if (!read_config_file(SYSCF_FILE, set_in_sysconf)) {
+ if (config_error_done() && !iflags.initoptions_noterminate)
+ nh_terminate(EXIT_FAILURE);
+ }
+ config_error_done();
+ /*
+ * TODO [maybe]: parse the sysopt entries which are space-separated
+ * lists of usernames into arrays with one name per element.
+ */
+#endif
+#endif /* SYSCF */
+ initoptions_finish();
}
/*
@@ -7306,72 +7299,69 @@ initoptions_init(void)
*/
void
initoptions_finish(void)
-{
- nhsym sym = 0;
- char *opts = 0, *xtraopts = 0;
-#ifndef MAC
- const char *envname, *namesrc, *nameval;
+{ nhsym sym = 0;
- /* getenv() instead of nhgetenv(): let total length of options be long;
- parseoptions() will check each individually */
- envname = "NETHACKOPTIONS";
- opts = getenv(envname);
- if (!opts) {
- /* fall back to original name; discouraged */
- envname = "HACKOPTIONS";
- opts = getenv(envname);
+ rcfile();
+
+ (void) fruitadd(svp.pl_fruit, (struct fruit *) 0);
+ /*
+ * Remove "slime mold" from list of object names. This will
+ * prevent it from being wished unless it's actually present
+ * as a named (or default) fruit. Wishing for "fruit" will
+ * result in the player's preferred fruit. [Once upon a time
+ * the override value used was "\033" which prevented wishing
+ * for the slime mold object at all except by asking for a
+ * specific named fruit.] Note that there are multiple fruit
+ * object types (apple, melon, &c) but the "fruit" object is
+ * slime mold or whatever custom name player assigns to that.
+ */
+ obj_descr[SLIME_MOLD].oc_name = "fruit";
+
+ sym = get_othersym(SYM_BOULDER,
+ Is_rogue_level(&u.uz) ? ROGUESET : PRIMARYSET);
+ if (sym)
+ gs.showsyms[SYM_BOULDER + SYM_OFF_X] = sym;
+ reglyph_darkroom();
+ reset_glyphmap(gm_optionchange);
+#ifdef STATUS_HILITES
+ /*
+ * A multi-interface binary might only support status highlighting
+ * for some of the interfaces; check whether we asked for it but are
+ * using one which doesn't.
+ *
+ * Option processing can take place before a user-decided WindowPort
+ * is even initialized, so check for that too.
+ */
+ if (!WINDOWPORT(safestartup)) {
+ if (iflags.hilite_delta && !wc2_supported("statushilites")) {
+ raw_printf("Status highlighting not supported for %s interface.",
+ windowprocs.name);
+ iflags.hilite_delta = 0;
+ }
}
+#endif
+ update_rest_on_space();
- if (gc.cmdline_rcfile) {
- namesrc = "command line";
- nameval = gc.cmdline_rcfile;
- xtraopts = opts;
- if (opts && (*opts == '/' || *opts == '\\' || *opts == '@'))
- xtraopts = 0; /* NETHACKOPTIONS is a file name; ignore it */
- } else if (opts && (*opts == '/' || *opts == '\\' || *opts == '@')) {
- /* NETHACKOPTIONS is a file name; use that instead of the default */
- if (*opts == '@')
- ++opts; /* @filename */
- namesrc = envname;
- nameval = opts;
- xtraopts = 0;
- } else
-#endif /* !MAC */
- /*else*/ {
- /* either no NETHACKOPTIONS or it wasn't a file name;
- read the default configuration file */
- nameval = namesrc = 0;
- xtraopts = opts;
- }
+ /* these can't rely on compile-time initialization for their defaults
+ because a multi-interface binary might need different values for
+ different interfaces; if neither tiled_map nor ascii_map pass the
+ wc_supported() test, assume ascii_map */
+ if (iflags.wc_tiled_map && !wc_supported("tiled_map"))
+ iflags.wc_tiled_map = FALSE, iflags.wc_ascii_map = TRUE;
+ else if (iflags.wc_ascii_map && !wc_supported("ascii_map")
+ && wc_supported("tiled_map"))
+ iflags.wc_ascii_map = FALSE, iflags.wc_tiled_map = TRUE;
- /* seemingly arbitrary name length restriction is to prevent error
- messages, if any were to be delivered while accessing the file,
- from potentially overflowing buffers */
- if (nameval && (int) strlen(nameval) >= BUFSZ / 2) {
- go.opt_phase = rc_file_opt;
- config_error_init(TRUE, namesrc, FALSE);
- config_error_add(
- "nethackrc file name \"%.40s\"... too long; using default",
- nameval);
- config_error_done();
- nameval = namesrc = 0; /* revert to default nethackrc */
- }
-
- config_error_init(TRUE, nameval, nameval ? CONFIG_ERROR_SECURE : FALSE);
- (void) read_config_file(nameval, set_in_config);
- config_error_done();
- if (xtraopts) {
- /* NETHACKOPTIONS is present and not a file name */
- go.opt_phase = environ_opt;
- config_error_init(FALSE, envname, FALSE);
- (void) parseoptions(xtraopts, TRUE, FALSE);
- config_error_done();
- }
-
- if (gc.cmdline_rcfile)
- free((genericptr_t) gc.cmdline_rcfile), gc.cmdline_rcfile = 0;
- /*[end of nethackrc handling]*/
+#ifdef ENHANCED_SYMBOLS
+ if (glyphid_cache_status())
+ free_glyphid_cache();
+ apply_customizations(gc.currentgraphics, do_custom_symbols);
+#endif
+ go.opt_initial = FALSE;
+ return;
+}
+#if 0
(void) fruitadd(svp.pl_fruit, (struct fruit *) 0);
/*
* Remove "slime mold" from list of object names. This will
@@ -7449,6 +7439,37 @@ initoptions_finish(void)
}
return;
}
+#endif
+void
+allopt_array_init(void)
+{
+ int i;
+ static boolean options_array_inited_already = FALSE;
+
+ if (!options_array_inited_already) {
+ memcpy(allopt, allopt_init, sizeof(allopt));
+ determine_ambiguities();
+ for (i = 0; allopt[i].name; i++) {
+ if (allopt[i].addr)
+ *(allopt[i].addr) = allopt[i].initval;
+ }
+ set_all_options_heeded();
+ /*
+ * Call each option function with an init flag and give it a chance
+ * to make any preparations that it might require. We do this
+ * whether or not the option itself is ever specified; that's
+ * irrelevant for the init call. Doing this allows the prep code for
+ * option settings to remain adjacent to, and in the same function as,
+ * the code that processes those options.
+ */
+ for (i = 0; i < OPTCOUNT; ++i) {
+ if (allopt[i].optfn)
+ (*allopt[i].optfn)(i, do_init, FALSE, empty_optstr,
+ empty_optstr);
+ }
+ options_array_inited_already = TRUE;
+ }
+}
/*
*******************************************
@@ -8966,6 +8987,7 @@ doset(void) /* changing options via menu by Per Liboriussen */
if (opt_indx < -1)
opt_indx++; /* -1 offset for select_menu() */
opt_indx -= indexoffset;
+ assert(IndexOk(opt_indx, allopt));
if (allopt[opt_indx].opttyp == BoolOpt) {
/* boolean option */
Sprintf(buf, "%s%s", *allopt[opt_indx].addr ? "!" : "",
@@ -10220,6 +10242,41 @@ enhance_menu_text(
return;
}
+void
+set_all_options_heeded(void)
+{
+ int i;
+
+ for (i = 0; i < OPTCOUNT; i++)
+ allopt[i].disregarded = FALSE;
+ restricted_options_mode = FALSE;
+}
+
+void
+set_all_options_disregarded(void)
+{
+ int i;
+
+ for (i = 0; i < OPTCOUNT ; i++)
+ allopt[i].disregarded = TRUE;
+ restricted_options_mode = TRUE;
+}
+
+void
+heed_this_option(enum opt optidx)
+{
+ if (optidx >= 0 && optidx < (enum opt) OPTCOUNT)
+ allopt[optidx].disregarded = FALSE;
+}
+void
+disregard_this_option(enum opt optidx)
+{
+ if (optidx >= 0 && optidx < (enum opt) OPTCOUNT)
+ allopt[optidx].disregarded = TRUE;
+ if (!restricted_options_mode)
+ restricted_options_mode = TRUE;
+}
+
#undef OPTIONS_HEADING
#undef CONFIG_SLOT
diff --git a/sys/windows/GNUmakefile b/sys/windows/GNUmakefile
index 3ea5c777b..4bc3df970 100644
--- a/sys/windows/GNUmakefile
+++ b/sys/windows/GNUmakefile
@@ -1239,14 +1239,14 @@ COREOBJS = $(addsuffix .o, allmain alloc apply artifact attrib ball bones botl \
nhlobj nhlsel nhlua windsound o_init objects objnam options \
pager pickup pline polyself potion pray priest quest questpgr \
random read rect region report restore rip rnd role rumors \
- safeproc save sfbase sfstruct shk shknam sit selvar sounds sp_lev \
+ save sfbase sfstruct shk shknam sit selvar sounds sp_lev \
spell stairs steal steed strutil \
symbols sys teleport timeout topten track trap u_init uhitm utf8map \
vault version vision weapon were wield windmain windows windsys wizard \
wizcmds worm worn write zap $(SOUNDLIBOBJS))
-CFLAGSW = $(CFLAGS) $(CFLAGSXTRA) $(SOUNDLIBINCL) $(COMMONDEF) $(DLBFLG) -DTILES -D_WINDOWS -DMSWIN_GRAPHICS -DSAFEPROCS -DNOTTYGRAPHICS $(SOUNDLIBDEFS)
-CPPFLAGSW = $(CFLAGS) $(CPPFLAGSXTRA) $(COMMONDEF) $(DLBFLG) -DTILES -D_WINDOWS -DMSWIN_GRAPHICS -DSAFEPROCS -DNOTTYGRAPHICS $(SOUNDLIBDEFS)
+CFLAGSW = $(CFLAGS) $(CFLAGSXTRA) $(SOUNDLIBINCL) $(COMMONDEF) $(DLBFLG) -DTILES -D_WINDOWS -DMSWIN_GRAPHICS -DNOTTYGRAPHICS $(SOUNDLIBDEFS)
+CPPFLAGSW = $(CFLAGS) $(CPPFLAGSXTRA) $(COMMONDEF) $(DLBFLG) -DTILES -D_WINDOWS -DMSWIN_GRAPHICS -DNOTTYGRAPHICS $(SOUNDLIBDEFS)
ONHW = $(O)nethackw
NHWONLY = $(addsuffix .o, mhaskyn mhdlg mhfont mhinput mhmain mhmap mhmenu \
@@ -1348,8 +1348,8 @@ CLEAN_FILE += $(NHWTARGETS) $(NHWOBJS) $(NHWRES) $(BMPS) $(WAV)
#==========================================
# nethack
#==========================================
-CFLAGSNH = $(CFLAGSU) $(CFLAGSXTRA) $(SOUNDLIBINCL) -DNO_TILE_C -DSAFEPROCS -D_LIB -DWIN32CON $(SOUNDLIBDEFS)
-CPPFLAGSNH = $(CFLAGSU) $(CPPFLAGSXTRA) -DNO_TILE_C -DSAFEPROCS -D_LIB -DWIN32CON $(SOUNDLIBDEFS)
+CFLAGSNH = $(CFLAGSU) $(CFLAGSXTRA) $(SOUNDLIBINCL) -DNO_TILE_C -D_LIB -DWIN32CON $(SOUNDLIBDEFS)
+CPPFLAGSNH = $(CFLAGSU) $(CPPFLAGSXTRA) -DNO_TILE_C -D_LIB -DWIN32CON $(SOUNDLIBDEFS)
ONH = $(O)nethack
diff --git a/sys/windows/Makefile.nmake b/sys/windows/Makefile.nmake
index 2097d7183..fe481ecc2 100644
--- a/sys/windows/Makefile.nmake
+++ b/sys/windows/Makefile.nmake
@@ -847,8 +847,7 @@ REGEXTTY = $(OTTY)cppregex.o
LUAOBJTTY = $(OTTY)nhlua.o $(OTTY)nhlsel.o $(OTTY)nhlobj.o
VVOBJTTY = $(OTTY)version.o
-SOBJTTY = $(OTTY)windmain.o $(OTTY)windsys.o $(OTTY)win10.o \
- $(OTTY)safeproc.o
+SOBJTTY = $(OTTY)windmain.o $(OTTY)windsys.o $(OTTY)win10.o
TTYOBJTTY = $(OTTY)topl.o $(OTTY)getline.o $(OTTY)wintty.o
@@ -908,8 +907,7 @@ REGEXGUI = $(OGUI)cppregex.o
LUAOBJGUI = $(OGUI)nhlua.o $(OGUI)nhlsel.o $(OGUI)nhlobj.o
VVOBJGUI = $(OGUI)version.o
-SOBJGUI = $(OGUI)windmain.o $(OGUI)windsys.o $(OGUI)win10.o \
- $(OGUI)safeproc.o
+SOBJGUI = $(OGUI)windmain.o $(OGUI)windsys.o $(OGUI)win10.o
GUIOBJ = $(OGUI)mhaskyn.o $(OGUI)mhdlg.o \
$(OGUI)mhfont.o $(OGUI)mhinput.o $(OGUI)mhmain.o $(OGUI)mhmap.o \
@@ -1364,8 +1362,8 @@ INCLUSIONS= /I$(R_INCL) /I$(R_MSWSYS) $(R_LUAINCL) $(R_SOUNDLIBINCL)
# Util and console builds
#==========================================
-CFLAGS = $(ctmpflags) $(INCLUSIONS) $(DLBDEF) -DSAFEPROCS $(SOUNDLIBDEFS)
-CPPFLAGS = $(cpptmpflags) $(INCLUSIONS) $(DLBDEF) -DSAFEPROCS $(SOUNDLIBDEFS)
+CFLAGS = $(ctmpflags) $(INCLUSIONS) $(DLBDEF) $(SOUNDLIBDEFS)
+CPPFLAGS = $(cpptmpflags) $(INCLUSIONS) $(DLBDEF) $(SOUNDLIBDEFS)
LFLAGS = $(lflags) $(conlibs) $(MACHINE)
#==========================================
@@ -2390,14 +2388,12 @@ $(OTTY)windsys.o: $(MSWSYS)windsys.c $(WINDHDR) $(HACK_H)
$(OTTY)windsound.o: $(WINDSOUNDDIR)windsound.c $(HACK_H)
#$(OTTY)sample.o: $(SOUNDDIR)sample.c $(HACK_H)
$(OTTY)windmain.o: $(MSWSYS)windmain.c $(WINDHDR) $(HACK_H)
-$(OTTY)safeproc.o: $(WSHR)safeproc.c $(WINDHDR) $(HACK_H)
$(OGUI)consoletty.o: $(MSWSYS)consoletty.c $(WINDHDR) $(HACK_H) $(TILE_H)
$(OGUI)win10.o: $(MSWSYS)win10.c $(WINDHDR) $(HACK_H)
$(OGUI)windsys.o: $(MSWSYS)windsys.c $(WINDHDR) $(HACK_H)
$(OGUI)windsound.o: $(WINDSOUNDDIR)windsound.c $(HACK_H)
$(OGUI)windmain.o: $(MSWSYS)windmain.c $(WINDHDR) $(HACK_H)
-$(OGUI)safeproc.o: $(WSHR)safeproc.c $(WINDHDR) $(HACK_H)
#===================================================================
# win/win32 dependencies
diff --git a/sys/windows/consoletty.c b/sys/windows/consoletty.c
index 34489430f..bceb98132 100644
--- a/sys/windows/consoletty.c
+++ b/sys/windows/consoletty.c
@@ -156,7 +156,6 @@ static boolean check_font_widths(void);
#endif
static void set_known_good_console_font(void);
static void restore_original_console_font(void);
-extern void safe_routines(void);
void tty_ibmgraphics_fixup(void);
#ifdef VIRTUAL_TERMINAL_SEQUENCES
extern void (*ibmgraphics_mode_callback)(void); /* symbols.c */
@@ -1189,8 +1188,6 @@ consoletty_open(int mode UNUSED)
void
consoletty_exit(void)
{
- /* go back to using the safe routines */
- safe_routines();
free_custom_colors();
free((genericptr_t) console.front_buffer);
free((genericptr_t) console.back_buffer);
@@ -2546,9 +2543,13 @@ void early_raw_print(const char *s)
void nethack_enter_consoletty(void)
{
+ int width;
#ifdef VIRTUAL_TERMINAL_SEQUENCES
char buf[BUFSZ], *bp, *localestr;
BOOL apisuccess;
+// DWORD unused;
+// int i = 0;
+
#endif /* VIRTUAL_TERMINAL_SEQUENCES */
#if 0
/* set up state needed by early_raw_print() */
@@ -2562,13 +2563,38 @@ void nethack_enter_consoletty(void)
GetWindowLong(console.hWnd, GWL_STYLE)
& ~WS_MAXIMIZEBOX & ~WS_SIZEBOX);
#endif
+
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
+ if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
+ /* srWindow identifies the visible area; dwSize identifies the buffer
+ */
+ width = csbi.srWindow.Right - csbi.srWindow.Left + 1;
+ fprintf(stdout, "width = %d\n", width);
+ }
+
console.hConOut = GetStdHandle(STD_OUTPUT_HANDLE);
nhassert(console.hConOut != NULL); // NOTE: this assert will not print
GetConsoleScreenBufferInfo(console.hConOut, &console.orig_csbi);
+ //COORD screencheck = GetLargestConsoleWindowSize(console.hConOut);
+
+ GetConsoleMode(console.hConOut, &console.orig_out_cmode);
+ console.out_cmode = console.orig_out_cmode;
+ console.out_cmode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
+ SetConsoleMode(console.hConOut, console.out_cmode);
+#if 0
+ /* tests */
+ WriteConsoleA(console.hConOut, "\033[8;;133t",9, &unused, NULL);
+ for (i = 0; i < 13; ++i) {
+ WriteConsoleA(console.hConOut, "0123456789", 10, &unused, NULL);
+ }
+ WriteConsoleA(console.hConOut, "\033[3;133ftest", 12, &unused, NULL);
+ GetConsoleScreenBufferInfo(console.hConOut, &console.orig_csbi);
/* Testing of widths != COLNO has not turned up any problems. Need
* to do a bit more testing and then we are likely to enable having
* console width match window width.
*/
+#endif
+
#if 0
console.width = console.orig_csbi.srWindow.Right -
console.orig_csbi.srWindow.Left + 1;
diff --git a/sys/windows/vs/NetHack/NetHack.vcxproj b/sys/windows/vs/NetHack/NetHack.vcxproj
index 131a4cf05..c6f2df87c 100644
--- a/sys/windows/vs/NetHack/NetHack.vcxproj
+++ b/sys/windows/vs/NetHack/NetHack.vcxproj
@@ -74,7 +74,7 @@
Speed
true
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);%(AdditionalIncludeDirectories)
- WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;SND_SOUNDEFFECTS_AUTOMAP;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)
+ WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;SND_SOUNDEFFECTS_AUTOMAP;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)
stdclatest
@@ -218,7 +218,6 @@
-
diff --git a/sys/windows/vs/NetHackW/NetHackW.vcxproj b/sys/windows/vs/NetHackW/NetHackW.vcxproj
index fce2d2a1d..cc3ec2563 100644
--- a/sys/windows/vs/NetHackW/NetHackW.vcxproj
+++ b/sys/windows/vs/NetHackW/NetHackW.vcxproj
@@ -87,7 +87,7 @@
Disabled
true
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);%(AdditionalIncludeDirectories)
- TILES;_WINDOWS;DLB;MSWIN_GRAPHICS;SAFEPROCS;NOTTYGRAPHICS;SND_LIB_WINDSOUND;USER_SOUNDS;SND_SOUNDEFFECTS_AUTOMAP;HAS_STDINT_H;HAS_INTTYPES_H;PDC_WIDE;%(PreprocessorDefinitions)
+ TILES;_WINDOWS;DLB;MSWIN_GRAPHICS;NOTTYGRAPHICS;SND_LIB_WINDSOUND;USER_SOUNDS;SND_SOUNDEFFECTS_AUTOMAP;HAS_STDINT_H;HAS_INTTYPES_H;PDC_WIDE;%(PreprocessorDefinitions)
stdclatest
stdclatest
stdclatest
@@ -263,7 +263,6 @@
-
diff --git a/sys/windows/vs/sfctool/sfctool.vcxproj b/sys/windows/vs/sfctool/sfctool.vcxproj
index 5dff90066..ad1971969 100644
--- a/sys/windows/vs/sfctool/sfctool.vcxproj
+++ b/sys/windows/vs/sfctool/sfctool.vcxproj
@@ -150,7 +150,7 @@
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
Level3
stdclatest
true
@@ -166,7 +166,7 @@
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)
- WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
+ WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
Level3
stdclatest
true
@@ -186,7 +186,7 @@
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
Level3
stdclatest
true
@@ -202,7 +202,7 @@
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
Level3
stdclatest
true
@@ -218,7 +218,7 @@
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)
- WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
+ WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
Level3
stdclatest
true
@@ -238,7 +238,7 @@
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)
- WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
+ WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
Level3
stdclatest
true
@@ -258,4 +258,4 @@
-
\ No newline at end of file
+
diff --git a/sys/windows/vs/sftags/sftags.vcxproj b/sys/windows/vs/sftags/sftags.vcxproj
index 43f024c24..52c63d47a 100644
--- a/sys/windows/vs/sftags/sftags.vcxproj
+++ b/sys/windows/vs/sftags/sftags.vcxproj
@@ -110,7 +110,7 @@
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
Level3
true
true
@@ -125,7 +125,7 @@
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
Level3
true
true
@@ -144,7 +144,7 @@
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
Level3
true
true
@@ -159,7 +159,7 @@
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
Level3
true
true
@@ -174,7 +174,7 @@
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
Level3
true
true
@@ -194,7 +194,7 @@
$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)
Level3
true
true
@@ -223,4 +223,4 @@
-
\ No newline at end of file
+
diff --git a/sys/windows/windmain.c b/sys/windows/windmain.c
index 9e34152ac..c50a6d292 100644
--- a/sys/windows/windmain.c
+++ b/sys/windows/windmain.c
@@ -14,10 +14,6 @@
#include
#include
-#if !defined(SAFEPROCS)
-#error You must #define SAFEPROCS to build windmain.c
-#endif
-
static void nhusage(void);
char *exename(void);
boolean fakeconsole(void);
@@ -67,7 +63,6 @@ char windows_yn_function(const char *, const char *, char);
#ifdef WIN32CON
extern int windows_console_custom_nhgetch(void);
-void safe_routines(void);
int tty_self_recover_prompt(void);
#endif
@@ -106,6 +101,13 @@ void update_file(const char *, const char *,
const char *, const char *, BOOL);
void windows_raw_print_bold(const char *);
+staticfn void set_emergency_io(void);
+staticfn void stdio_wait_synch(void);
+staticfn void stdio_raw_print(const char *str);
+staticfn void stdio_nonl_raw_print(const char *str);
+staticfn void stdio_raw_print_bold(const char *str);
+staticfn int stdio_nhgetch(void);
+
#ifdef PORT_HELP
void port_help(void);
#endif
@@ -159,18 +161,9 @@ MAIN(int argc, char *argv[])
char *dir = NULL;
#ifdef _MSC_VER
- _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
+ _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif
-#ifdef WIN32CON
- /*
- * Get a set of valid safe windowport function
- * pointers during early startup initialization.
- */
-// safe_routines();
-#endif /* WIN32CON */
-
-
/* setting iflags.colorcount has to be after early_init()
* because it zeros out all of iflags */
hwnd = GetDesktopWindow();
@@ -208,8 +201,9 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
#ifndef MSWIN_GRAPHICS
early_init(argc, argv); /* already in WinMain for MSWIN_GRAPHICS */
#endif
- set_default_prefix_locations(argv[0]); /* must be re-done after initoptions_init()
- * which clears out gp.fqn_prefix[] */
+ set_default_prefix_locations(
+ argv[0]); /* must be re-done after initoptions_init()
+ * which clears out gp.fqn_prefix[] */
copy_sysconf_content();
copy_symbols_content();
/* Now that sysconf has had a chance to set the TROUBLEPREFIX, don't
@@ -217,13 +211,20 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
fqn_prefix_locked[TROUBLEPREFIX] = TRUE;
copy_config_content();
- // if (iflags.windowtype_deferred && gc.chosen_windowtype[0])
- // windowtype = gc.chosen_windowtype;
- // windowtype = gc.chosen_windowtype;
+ // if (iflags.windowtype_deferred && gc.chosen_windowtype[0])
+ // windowtype = gc.chosen_windowtype;
+ // windowtype = gc.chosen_windowtype;
#if !defined(MSWIN_GRAPHICS)
- consoletty_open(1);
nethack_enter_consoletty();
+ consoletty_open(1);
+#endif
+ set_emergency_io();
+
+#ifdef EARLY_CONFIGFILE_PASS
+ rcfile_interface_options();
+ if (gc.chosen_windowtype && *gc.chosen_windowtype)
+ windowtype = gc.chosen_windowtype;
#endif
if (!windowtype) {
@@ -233,7 +234,10 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
windowtype = "tty";
#endif
}
- choose_windows(windowtype); /* sets all the window port function pointers */
+ choose_windows(
+ windowtype); /* sets all the window port function pointers */
+
+ init_nhwindows(&argc, argv);
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
/* Save current directory and make sure it gets restored when
@@ -243,8 +247,9 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
error("NetHack: current directory path too long");
#endif
initoptions_init(); // This allows OPTIONS in syscf on Windows.
- set_default_prefix_locations(argv[0]); /* must be re-done after initoptions_init()
- * which clears out gp.fqn_prefix[] */
+ set_default_prefix_locations(
+ argv[0]); /* must be re-done after initoptions_init()
+ * which clears out gp.fqn_prefix[] */
iflags.windowtype_deferred = TRUE;
program_state.early_options = 1;
@@ -286,7 +291,6 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
&& (strstri(argv[0], "nethackw.exe") || GUILaunched))
iflags.windowtype_locked = TRUE;
#endif
- windowtype = default_window_sys;
#ifdef DLB
if (!dlb_init()) {
@@ -301,18 +305,6 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
}
#endif
- if (!iflags.windowtype_locked) {
-#if defined(TTY_GRAPHICS)
- Strcpy(default_window_sys, "tty");
-#else
-#if defined(CURSES_GRAPHICS) && !defined(MSWIN_GRAPHICS)
- Strcpy(default_window_sys, "curses");
-#endif /* CURSES */
-#endif /* TTY */
- // if (iflags.windowtype_deferred && gc.chosen_windowtype[0])
- // windowtype = gc.chosen_windowtype;
- }
- // choose_windows(windowtype);
#if defined(SND_LIB_FMOD)
assign_soundlib(soundlib_fmod);
#elif defined(SND_LIB_WINDSOUND)
@@ -322,19 +314,14 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
u.uhp = 1; /* prevent RIP on early quits */
u.ux = 0; /* prevent flush_screen() */
- nethack_enter(argc, argv);
iflags.use_background_glyph = FALSE;
if (WINDOWPORT(mswin))
iflags.use_background_glyph = TRUE;
-#ifdef WIN32CON
- if (WINDOWPORT(tty))
- consoletty_open(1);
-#endif
#ifdef WINCHAIN
commit_windowchain();
#endif
- init_nhwindows(&argc, argv);
+// init_nhwindows(&argc, argv);
#ifdef WIN32CON
if (WINDOWPORT(tty))
@@ -837,20 +824,6 @@ copy_hack_content(void)
gf.fqn_prefix[DATAPREFIX], OPTIONFILE, FALSE);
}
-#ifdef WIN32CON
-void
-safe_routines(void)
-{
- /*
- * Get a set of valid safe windowport function
- * pointers during early startup initialization.
- */
- if (!WINDOWPORT(safestartup))
- windowprocs = *get_safe_procs(1);
- if (!GUILaunched)
- windowprocs.win_nhgetch = windows_console_custom_nhgetch;
-}
-#endif
#ifdef PORT_HELP
void
@@ -1205,9 +1178,7 @@ tty_self_recover_prompt(void)
c = 'n';
ct = 0;
saved_procs = windowprocs;
- if (!WINDOWPORT(safestartup))
- windowprocs = *get_safe_procs(2); /* arg 2 uses no-newline variant */
- windowprocs.win_nhgetch = windows_console_custom_nhgetch;
+
raw_print("\n");
raw_print("\n");
raw_print("\n");
@@ -1340,4 +1311,60 @@ chdirx(const char *dir, boolean wr)
}
#endif /* CHDIR */
-/*windmain.c*/
+void
+set_emergency_io(void)
+{
+ windowprocs.win_raw_print = stdio_raw_print;
+ windowprocs.win_raw_print_bold = stdio_raw_print_bold;
+ windowprocs.win_nhgetch = stdio_nhgetch;
+ windowprocs.win_wait_synch = stdio_wait_synch;
+}
+
+
+/* Add to your code: windowprocs.win_raw_print = stdio_wait_synch; */
+void
+stdio_wait_synch(void)
+{
+ char valid[] = { ' ', '\n', '\r', '\033', '\0' };
+
+ fprintf(stdout, "--More--");
+ (void) fflush(stdout);
+ while (!strchr(valid, nhgetch()))
+ ;
+}
+
+/* Add to your code: windowprocs.win_raw_print = stdio_raw_print; */
+void
+stdio_raw_print(const char *str)
+{
+ if (str)
+ fprintf(stdout, "%s\n", str);
+ return;
+}
+
+/* no newline variation, add to your code:
+ windowprocs.win_raw_print = stdio_nonl_raw_print; */
+void
+stdio_nonl_raw_print(const char *str)
+{
+ if (str)
+ fprintf(stdout, "%s", str);
+ return;
+}
+
+/* Add to your code: windowprocs.win_raw_print_bold = stdio_raw_print_bold; */
+void
+stdio_raw_print_bold(const char *str)
+{
+ stdio_raw_print(str);
+ return;
+}
+
+/* Add to your code: windowprocs.win_nhgetch = stdio_nhgetch; */
+int
+stdio_nhgetch(void)
+{
+ return getchar();
+}
+
+ /*windmain.c*/
diff --git a/sys/windows/windsys.c b/sys/windows/windsys.c
index 88f1a69bf..aca0cfe9e 100644
--- a/sys/windows/windsys.c
+++ b/sys/windows/windsys.c
@@ -73,7 +73,6 @@ static HWND GetConsoleHwnd(void);
extern void backsp(void);
#endif
int windows_console_custom_nhgetch(void);
-extern void safe_routines(void);
int windows_early_options(const char *window_opt);
unsigned long sys_random_seed(void);
#if 0
@@ -293,10 +292,6 @@ win32_abort(void)
exit_nhwindows((char *) 0);
iflags.window_inited = FALSE;
}
-#ifdef WIN32CON
- if (!WINDOWPORT(mswin) && !WINDOWPORT(safestartup))
- safe_routines();
-#endif
if (wizard) {
raw_print("Execute debug breakpoint wizard?");
if ((c = nhgetch()) == 'y' || c == 'Y')
@@ -522,15 +517,6 @@ nethack_exit(int code)
* GUILaunched is defined and set in consoletty.c.
*/
-
-#ifdef WIN32CON
- if (!GUILaunched) {
- windowprocs = *get_safe_procs(1);
- /* use our custom version which works
- a little cleaner than the stdio one */
- windowprocs.win_nhgetch = windows_console_custom_nhgetch;
- } else
-#endif
if (getreturn_enabled) {
raw_print("\n");
if (iflags.window_inited)
@@ -580,10 +566,6 @@ getreturn(const char *str)
initializing the window port */
void nethack_enter_windows(void)
{
-#ifdef WIN32CON
- if (WINDOWPORT(tty))
- nethack_enter_consoletty();
-#endif
}
/* CP437 to Unicode mapping according to the Unicode Consortium */
diff --git a/win/share/safeproc.c b/win/share/safeproc.c
deleted file mode 100644
index 19e9aa9b6..000000000
--- a/win/share/safeproc.c
+++ /dev/null
@@ -1,596 +0,0 @@
-/* NetHack 3.7 safeproc.c */
-/* Copyright (c) Michael Allison, 2018 */
-/* NetHack may be freely redistributed. See license for details. */
-
-/* must #define SAFEPROCS in xxxconf.h or via CFLAGS or this won't compile */
-#include "hack.h"
-
-/*
- * ***********************************************************
- * This is a complete WindowPort implementation that can be
- * assigned to the windowproc function pointers very early
- * in the startup initialization, perhaps immediately even.
- * It requires only the following call:
- * windowprocs = *get_safe_procs(0);
- *
- * The game startup can trigger functions in other modules
- * that make assumptions on a WindowPort being available
- * and bad things can happen if any function pointers are
- * null at that time.
- *
- * Some ports prior to 3.6.2 made attempts to early init
- * various pieces of one of their WindowPorts, but that
- * caused conflicts if that particular WindowPort wasn't
- * the one that the user ended up selecting in their
- * config file later. The WindowPort interfaced was designed
- * to allow multiple WindowPorts to be linked into the same
- * game binary.
- *
- * The base functions established by a call to get_safe_procs()
- * accomplish the goal of preventing crashes, but not much
- * else.
- *
- * There are also a few additional functions provided in here
- * that can be selected optionally to provide some startup
- * functionality for getting messages out to the user about
- * issues that are being experienced during startup in
- * general or during options parsing. The ones in here are
- * deliberately free from any platforms or OS specific code.
- * Please leave them using stdio C routines as much as
- * possible. That isn't to say you can't do fancier functions
- * prior to initialization of the primary WindowPort, but you
- * can provide those platform-specific functions elsewhere,
- * and assign them the same way that these more generic versions
- * are assigned.
- *
- * The additional platform-independent, but more functional
- * routines provided in here should be assigned after the
- * windowprocs = *get_safe_procs(n)
- * call.
- *
- * Usage:
- *
- * windowprocs = *get_safe_procs(0);
- * initializes a set of winprocs function pointers that ensure
- * none of the function pointers are left null, but that's all
- * it does.
- *
- * windowprocs = *get_safe_procs(1);
- * initializes a set of winprocs functions pointers that ensure
- * none of the function pointers are left null, but also
- * provides some basic output and input functionality using
- * nothing other than C stdio routines (no platform-specific
- * or OS-specific code).
- *
- * ***********************************************************
- */
-
-void safe_dismiss_nhwindow(winid);
-void safe_putstr(winid, int, const char *);
-void win_safe_init(int);
-void safe_number_pad(int);
-
-struct window_procs safe_procs = {
- WPID(safestartup),
- (0
-#ifdef TTY_PERM_INVENT
- | WC_PERM_INVENT
-#endif
-#ifdef MSDOS
- | WC_TILED_MAP | WC_ASCII_MAP
-#endif
-#if defined(WIN32CON)
- | WC_MOUSE_SUPPORT
-#endif
- | WC_COLOR | WC_HILITE_PET | WC_INVERSE | WC_EIGHT_BIT_IN),
- (0
-#if defined(SELECTSAVED)
- | WC2_SELECTSAVED
-#endif
-#if defined(STATUS_HILITES)
- | WC2_HILITE_STATUS | WC2_HITPOINTBAR | WC2_FLUSH_STATUS
- | WC2_RESET_STATUS
-#endif
- | WC2_DARKGRAY | WC2_SUPPRESS_HIST | WC2_URGENT_MESG | WC2_STATUSLINES
- | WC2_U_UTF8STR | WC2_PETATTR
-#if !defined(NO_TERMS) || defined(WIN32CON)
- | WC2_EXTRACOLORS
-#endif
- ),
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* color availability */
- safe_init_nhwindows, safe_player_selection, safe_askname,
- safe_get_nh_event,
- safe_exit_nhwindows, safe_suspend_nhwindows, safe_resume_nhwindows,
- safe_create_nhwindow, safe_clear_nhwindow, safe_display_nhwindow,
- safe_destroy_nhwindow, safe_curs, safe_putstr, safe_putmixed,
- safe_display_file, safe_start_menu, safe_add_menu, safe_end_menu,
- safe_select_menu, safe_message_menu,
- safe_mark_synch,
- safe_wait_synch,
-#ifdef CLIPPING
- safe_cliparound,
-#endif
-#ifdef POSITIONBAR
- safe_update_positionbar,
-#endif
- safe_print_glyph, safe_raw_print, safe_raw_print_bold, safe_nhgetch,
- safe_nh_poskey, safe_nhbell, safe_doprev_message, safe_yn_function,
- safe_getlin, safe_get_ext_cmd, safe_number_pad, safe_delay_output,
-#ifdef CHANGE_COLOR /* the Mac uses a palette device */
- safe_change_color,
-#ifdef MAC
- safe_change_background, set_safe_font_name,
-#endif
- safe_get_color_string,
-#endif
- safe_outrip,
- safe_preference_update,
- safe_getmsghistory, safe_putmsghistory,
- safe_status_init,
- safe_status_finish, safe_status_enablefield,
- safe_status_update,
- safe_can_suspend,
- safe_update_inventory,
- safe_ctrl_nhwindow,
-};
-
-struct window_procs *
-get_safe_procs(int optn)
-{
- if (optn) {
- /* include the slightly more functional stdc versions */
- safe_procs.win_raw_print = stdio_raw_print;
- safe_procs.win_raw_print_bold = stdio_raw_print_bold;
- safe_procs.win_nhgetch = stdio_nhgetch;
- safe_procs.win_wait_synch = stdio_wait_synch;
- if (optn == 2)
- safe_procs.win_raw_print = stdio_nonl_raw_print;
- }
- return &safe_procs;
-}
-
-/*ARGSUSED*/
-void
-safe_init_nhwindows(int *argcp UNUSED, char **argv UNUSED)
-{
- return;
-}
-
-void
-safe_player_selection(void)
-{
- return;
-}
-
-void
-safe_askname(void)
-{
- return;
-}
-
-void
-safe_get_nh_event(void)
-{
- return;
-}
-
-void
-safe_suspend_nhwindows(const char *str UNUSED)
-{
- return;
-}
-
-void
-safe_resume_nhwindows(void)
-{
- return;
-}
-
-void
-safe_exit_nhwindows(const char *str UNUSED)
-{
- return;
-}
-
-winid
-safe_create_nhwindow(int type UNUSED)
-{
- return WIN_ERR;
-}
-
-void
-safe_clear_nhwindow(winid window UNUSED)
-{
- return;
-}
-
-/*ARGSUSED*/
-void
-safe_display_nhwindow(winid window UNUSED, boolean blocking UNUSED)
-{
- return;
-}
-
-void
-safe_dismiss_nhwindow(winid window UNUSED)
-{
- return;
-}
-
-void
-safe_destroy_nhwindow(winid window UNUSED)
-{
- return;
-}
-
-void
-safe_curs(winid window UNUSED, int x UNUSED, int y UNUSED)
-{
- return;
-}
-
-void
-safe_putstr(winid window UNUSED, int attr UNUSED, const char *str UNUSED)
-{
- return;
-}
-
-void
-safe_putmixed(winid window UNUSED, int attr UNUSED, const char *str UNUSED)
-{
- return;
-}
-
-void
-safe_display_file(const char * fname UNUSED, boolean complain UNUSED)
-{
- return;
-}
-
-void
-safe_start_menu(winid window UNUSED, unsigned long mbehavior UNUSED)
-{
- return;
-}
-
-/*ARGSUSED*/
-/*
- * Add a menu item to the beginning of the menu list. This list is reversed
- * later.
- */
-void
-safe_add_menu(
- winid window UNUSED, /* window to use, must be of type NHW_MENU */
- const glyph_info *glyphinfo UNUSED, /* glyph plus glyph info */
- const anything *identifier UNUSED, /* what to return if selected */
- char ch UNUSED, /* keyboard accelerator (0 = pick our own) */
- char gch UNUSED, /* group accelerator (0 = no group) */
- int attr UNUSED, /* attribute for string (like safe_putstr()) */
- int clr UNUSED, /* colour for string */
- const char *str UNUSED, /* menu string */
- unsigned int itemflags UNUSED) /* itemflags such as marked as selected */
-{
- return;
-}
-
-/*
- * End a menu in this window, window must a type NHW_MENU.
- */
-void
-safe_end_menu(
- winid window UNUSED, /* menu to use */
- const char *prompt UNUSED) /* prompt to for menu */
-{
- return;
-}
-
-int
-safe_select_menu(
- winid window UNUSED,
- int how UNUSED,
- menu_item **menu_list UNUSED)
-{
- return 0;
-}
-
-/* special hack for treating top line --More-- as a one item menu */
-char
-safe_message_menu(
- char let UNUSED,
- int how UNUSED,
- const char *mesg UNUSED)
-{
- return '\033';
-}
-
-void
-safe_mark_synch(void)
-{
-}
-
-void
-safe_wait_synch(void)
-{
-}
-
-#ifdef CLIPPING
-void
-safe_cliparound(int x UNUSED, int y UNUSED)
-{
-}
-#endif /* CLIPPING */
-
-/*
- * safe_print_glyph
- *
- * Print the glyph to the output device. Don't flush the output device.
- */
-void
-safe_print_glyph(
- winid window UNUSED,
- coordxy x UNUSED,
- coordxy y UNUSED,
- const glyph_info *glyphinfo UNUSED,
- const glyph_info *bkglyphinfo UNUSED)
-{
- return;
-}
-
-void
-safe_raw_print(const char *str UNUSED)
-{
- return;
-}
-
-void
-safe_raw_print_bold(const char *str UNUSED)
-{
- return;
-}
-
-int
-safe_nhgetch(void)
-{
- return '\033';
-}
-
-/*
- * return a key, or 0, in which case a mouse button was pressed
- * mouse events should be returned as character positions in the map window.
- * Since normal tty's don't have mice, just return a key.
- */
-/*ARGSUSED*/
-int
-safe_nh_poskey(coordxy *x UNUSED, coordxy *y UNUSED, int *mod UNUSED)
-{
- return '\033';
-}
-
-void
-win_safe_init(int dir UNUSED)
-{
- return;
-}
-
-#ifdef POSITIONBAR
-void
-safe_update_positionbar(char *posbar UNUSED)
-{
- return;
-}
-#endif /* POSITIONBAR */
-
-/*
- * safe_status_init()
- * -- initialize the port-specific data structures.
- */
-void
-safe_status_init(void)
-{
- return;
-}
-
-boolean
-safe_can_suspend(void)
-{
- return FALSE;
-}
-
-void
-safe_nhbell(void)
-{
- return;
-}
-
-int
-safe_doprev_message(void)
-{
- return 0;
-}
-
-char
-safe_yn_function(const char *query UNUSED,
- const char *resp UNUSED, char def UNUSED)
-{
- return '\033';
-}
-
-/*ARGSUSED*/
-void
-safe_getlin(const char* prompt UNUSED, char *outbuf)
-{
- Strcpy(outbuf, "\033");
-}
-
-int
-safe_get_ext_cmd(void)
-{
- return '\033';
-}
-
-void
-safe_number_pad(int mode UNUSED)
-{
- return;
-}
-
-void
-safe_delay_output(void)
-{
- return;
-}
-
-void
-safe_outrip(winid tmpwin UNUSED, int how UNUSED, time_t when UNUSED)
-{
- return;
-}
-
-/*ARGSUSED*/
-void
-safe_preference_update(const char *pref UNUSED)
-{
- return;
-}
-
-char *
-safe_getmsghistory(boolean init UNUSED)
-{
- return (char *) 0;
-}
-
-void
-safe_putmsghistory(
- const char *msg UNUSED,
- boolean is_restoring UNUSED)
-{
-}
-
-void
-safe_status_finish(void)
-{
-}
-
-void
-safe_status_enablefield(
- int fieldidx UNUSED,
- const char *nm UNUSED,
- const char *fmt UNUSED,
- boolean enable UNUSED)
-{
-}
-
-/* call once for each field, then call with BL_FLUSH to output the result */
-void
-safe_status_update(
- int idx UNUSED,
- genericptr_t ptr UNUSED,
- int chg UNUSED,
- int percent UNUSED,
- int color UNUSED,
- unsigned long *colormasks UNUSED)
-{
-}
-
-void
-safe_update_inventory(int arg UNUSED)
-{
- return;
-}
-
-#ifdef WIN32CON
-extern win_request_info *tty_ctrl_nhwindow(winid window UNUSED,
- int request UNUSED,
- win_request_info *wri UNUSED);
-#endif
-
-win_request_info *
-safe_ctrl_nhwindow(
- winid window UNUSED,
- int request UNUSED,
- win_request_info *wri UNUSED)
-{
-#ifdef WIN32CON
- return (*tty_ctrl_nhwindow)(window, request, wri);
-#else
- return (win_request_info *) 0;
-#endif
-}
-
-/**************************************************************
- * These are some optionally selectable routines that add
- * some base functionality over the safe_* versions above.
- * The safe_* versions are primarily designed to ensure that
- * there are no null function pointers remaining at early
- * game startup/initialization time.
- *
- * The slightly more functional versions in here should be kept
- * free of platform-specific code or OS-specific code. If you
- * want to use versions that involve platform-specific or
- * OS-specific code, go right ahead but use your own replacement
- * version of the functions in a platform-specific or
- * OS-specific source file, not in here.
- ***************************************************************/
-
-/* Add to your code: windowprocs.win_raw_print = stdio_wait_synch; */
-void
-stdio_wait_synch(void)
-{
- char valid[] = {' ', '\n', '\r', '\033', '\0'};
-
- fprintf(stdout, "--More--");
- (void) fflush(stdout);
- while (!strchr(valid, nhgetch()))
- ;
-}
-
-/* Add to your code: windowprocs.win_raw_print = stdio_raw_print; */
-void
-stdio_raw_print(const char *str)
-{
- if (str)
- fprintf(stdout, "%s\n", str);
- return;
-}
-
-/* no newline variation, add to your code:
- windowprocs.win_raw_print = stdio_nonl_raw_print; */
-void
-stdio_nonl_raw_print(const char *str)
-{
- if (str)
- fprintf(stdout, "%s", str);
- return;
-}
-
-/* Add to your code: windowprocs.win_raw_print_bold = stdio_raw_print_bold; */
-void
-stdio_raw_print_bold(const char *str)
-{
- stdio_raw_print(str);
- return;
-}
-
-/* Add to your code: windowprocs.win_nhgetch = stdio_nhgetch; */
-int
-stdio_nhgetch(void)
-{
- return getchar();
-}
-
-#ifdef CHANGE_COLOR
-void
-safe_change_color(int color UNUSED, long rgb UNUSED, int reverse UNUSED)
-{
-}
-
-char *
-safe_get_color_string(void)
-{
- return ("");
-}
-
-
-#endif
-
-/* safeprocs.c */
diff --git a/win/tty/wintty.c b/win/tty/wintty.c
index 61338542b..4cbe65a2a 100644
--- a/win/tty/wintty.c
+++ b/win/tty/wintty.c
@@ -3559,8 +3559,9 @@ assesstty(
short *offx, short *offy, long *rows, long *cols,
long *maxcol, long *minrow, long *maxrow)
{
- boolean inuse_only = (invmode & InvInUse) != 0,
- show_gold = (invmode & InvShowGold) != 0 && !inuse_only;
+ boolean inuse_only = (invmode & (int) InvInUse) != 0,
+ show_gold = (invmode & (int) InvShowGold) != 0
+ && !inuse_only;
int perminv_minrow = tty_perminv_minrow + (show_gold ? 1 : 0);
if (!ttyDisplay) {
diff --git a/win/win32/NetHackW.c b/win/win32/NetHackW.c
index 92b851c7a..56d8bb7c7 100644
--- a/win/win32/NetHackW.c
+++ b/win/win32/NetHackW.c
@@ -15,10 +15,6 @@
#include "mhmain.h"
#include "mhmap.h"
-#if !defined(SAFEPROCS)
-#error You must #define SAFEPROCS to build NetHackW.c
-#endif
-
/* Borland and MinGW redefine "boolean" in shlwapi.h,
so just use the little bit we need */
typedef struct _DLLVERSIONINFO {
@@ -99,32 +95,6 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
UNREFERENCED_PARAMETER(lpCmdLine);
UNREFERENCED_PARAMETER(nCmdShow);
- /*
- * Get a set of valid safe windowport function
- * pointers during early startup initialization.
- *
- * When get_safe_procs is called with 0 as the param,
- * non-functional, but safe function pointers are set
- * for all windowport routines.
- *
- * When get_safe_procs is called with 1 as the param,
- * raw_print, raw_print_bold, and wait_synch, and nhgetch
- * are set to use C stdio routines via stdio_raw_print,
- * stdio_raw_print_bold, stdio_wait_synch, and
- * stdio_nhgetch.
- */
- windowprocs = *get_safe_procs(0);
-
- /*
- * Now we are going to override a couple
- * of the windowprocs functions so that
- * error messages are handled in a suitable
- * way for the graphical version.
- */
- windowprocs.win_raw_print = mswin_raw_print;
- windowprocs.win_raw_print_bold = mswin_raw_print_bold;
- windowprocs.win_wait_synch = mswin_wait_synch;
-
win10_init();
early_init(0, NULL); /* Change as needed to support CRASHREPORT */
diff --git a/win/win32/mswproc.c b/win/win32/mswproc.c
index abef776da..55ba2f696 100644
--- a/win/win32/mswproc.c
+++ b/win/win32/mswproc.c
@@ -734,9 +734,6 @@ mswin_exit_nhwindows(const char *str)
/* Write Window settings to the registry */
mswin_write_reg();
- /* set things back to failsafes */
- windowprocs = *get_safe_procs(0);
-
/* and make sure there is still a way to communicate something */
windowprocs.win_raw_print = mswin_raw_print;
windowprocs.win_raw_print_bold = mswin_raw_print_bold;