From 1b49f60ded6b11b51667c48dd714fdf4264ccff0 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 29 Jan 2019 15:00:07 -0800 Subject: [PATCH 1/7] warning fix The new code provoked several warnings; this fixes one of them. Moving the declaration of 'rolecount' would have been sufficient, but I've gone another way. --- include/extern.h | 2 +- src/pray.c | 14 ++++++-------- src/role.c | 15 +++++++++++---- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/include/extern.h b/include/extern.h index f67d09c85..6b5da1758 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2122,7 +2122,7 @@ E boolean FDECL(validrole, (int)); E boolean FDECL(validrace, (int, int)); E boolean FDECL(validgend, (int, int, int)); E boolean FDECL(validalign, (int, int, int)); -E int NDECL(randrole); +E int FDECL(randrole, (BOOLEAN_P)); E int FDECL(randrace, (int)); E int FDECL(randgend, (int, int)); E int FDECL(randalign, (int, int)); diff --git a/src/pray.c b/src/pray.c index ff9532fbd..29cf878a4 100644 --- a/src/pray.c +++ b/src/pray.c @@ -2095,15 +2095,13 @@ aligntyp alignment; if (!Hallucination) return align_gname(alignment); - /* Count the roles, so that we can pick one at random. */ - int rolecount = 0; - while (roles[rolecount].filecode) - rolecount++; - - /* The priest may not have initialized god names. If this is the - case, and we roll priest, we need to try again. */ + /* Some roles (Priest) don't have a pantheon unless we're playing as + that role, so keep trying until we get a role which does have one. + [If playing a Priest, the current pantheon will be twice as likely + to get picked as any of the others. That's not significant enough + to bother dealing with.] */ do - which = rn2_on_display_rng(rolecount); + which = randrole(TRUE); while (!roles[which].lgod); switch (rn2_on_display_rng(9)) { diff --git a/src/role.c b/src/role.c index 2a2acce53..f263609a1 100644 --- a/src/role.c +++ b/src/role.c @@ -787,9 +787,16 @@ int rolenum; } int -randrole() +randrole(for_display) +boolean for_display; { - return rn2(SIZE(roles) - 1); + int res = SIZE(roles) - 1; + + if (for_display) + res = rn2_on_display_rng(res); + else + res = rn2(res); + return res; } STATIC_OVL int @@ -805,7 +812,7 @@ randrole_filtered() && ok_gend(i, ROLE_NONE, ROLE_RANDOM, ROLE_NONE) && ok_align(i, ROLE_NONE, ROLE_NONE, ROLE_RANDOM)) set[n++] = i; - return n ? set[rn2(n)] : randrole(); + return n ? set[rn2(n)] : randrole(FALSE); } int @@ -2088,7 +2095,7 @@ role_init() if (flags.pantheon == -1) { /* new game */ flags.pantheon = flags.initrole; /* use own gods */ while (!roles[flags.pantheon].lgod) /* unless they're missing */ - flags.pantheon = randrole(); + flags.pantheon = randrole(FALSE); } if (!urole.lgod) { urole.lgod = roles[flags.pantheon].lgod; From 39b6a7e5154081b13a24707f8a768bfb6b5fef9a Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 29 Jan 2019 15:18:17 -0800 Subject: [PATCH 2/7] another warning fix Comparison between signed and unsigned. Compiler stupidity since the range of possible values that signed 'i' can take is limited and never negative. --- src/rnd.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/rnd.c b/src/rnd.c index fa8ce0e20..8f92e42ab 100644 --- a/src/rnd.c +++ b/src/rnd.c @@ -17,16 +17,16 @@ struct rnglist_t { isaac64_ctx rng_state; }; -enum {CORE = 0, DISP}; +enum { CORE = 0, DISP = 1 }; static struct rnglist_t rnglist[] = { - {rn2, FALSE, {0}}, /* CORE */ - {rn2_on_display_rng, FALSE, {0}}, /* DISP */ + { rn2, FALSE, { 0 } }, /* CORE */ + { rn2_on_display_rng, FALSE, { 0 } }, /* DISP */ }; int whichrng(fn) -int (*fn)(int); +int FDECL((*fn), (int)); { int i; @@ -39,19 +39,21 @@ int (*fn)(int); void init_isaac64(seed, fn) unsigned long seed; -int FDECL((*fn),(int)); +int FDECL((*fn), (int)); { - unsigned char new_rng_state[sizeof(seed)]; - int i, rngindx = whichrng(fn); + unsigned char new_rng_state[sizeof seed]; + unsigned i; + int rngindx = whichrng(fn); if (rngindx < 0) panic("Bad rng function passed to init_isaac64()."); - for (i=0; i>= 8; } - isaac64_init(&rnglist[rngindx].rng_state, new_rng_state, sizeof(seed)); + isaac64_init(&rnglist[rngindx].rng_state, new_rng_state, + (int) sizeof seed); } static int From cf49b6fe8714000f94f486c032e6b2f560ccace1 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 29 Jan 2019 15:27:22 -0800 Subject: [PATCH 3/7] last warning fix Compiler gave four diagnostics about 'seed' being used uninitialized if 'no_seed' were false, but two of those were alternate suggestions for how to suppress them. --- sys/unix/unixmain.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 1d6500b68..c800c4919 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -768,18 +768,18 @@ error: unsigned long sys_random_seed() { - unsigned long seed; + unsigned long seed = 0L; unsigned long pid = (unsigned long) getpid(); boolean no_seed = TRUE; #ifdef DEV_RANDOM - FILE *fptr = NULL; + FILE *fptr; fptr = fopen(DEV_RANDOM, "r"); if (fptr) { - fread(&seed, sizeof(long), 1, fptr); + fread(&seed, sizeof long, 1, fptr); has_strong_rngseed = TRUE; /* decl.c */ no_seed = FALSE; - fclose(fptr); + (void) fclose(fptr); } else { /* leaves clue, doesn't exit */ paniclog("sys_random_seed", "falling back to weak seed"); From f7b6723053c6b176871fd24e18ee314997afbff8 Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 29 Jan 2019 20:01:31 -0500 Subject: [PATCH 4/7] update the long version info generated by makedefs --- util/makedefs.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/util/makedefs.c b/util/makedefs.c index 44a04a4ff..daaecd61d 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -1628,6 +1628,27 @@ static const char *build_opts[] = { #endif /* pattern matching method will be substituted by nethack at run time */ "pattern matching via :PATMATCH:", +#ifdef USE_ISAAC64 + "pseudo random numbers generated by ISAAC64", +#ifdef DEV_RANDOM +#ifdef __STDC__ + /* include which specific one */ + "strong PRNG seed available from " DEV_RANDOM, +#else + "strong PRNG seed available from DEV_RANDOM", +#endif +#else +#ifdef WIN32 + "strong PRNG seed available from CNG BCryptGenRandom()", +#endif +#endif /* DEV_RANDOM */ +#else /* ISAAC64 */ +#ifdef RANDOM + "pseudo random numbers generated by random()", +#else + "pseudo random numbers generated by C rand()", +#endif +#endif #ifdef SELECTSAVED "restore saved games via menu", #endif From 37e5a9cad2db6800c516d0e79a92df674749886c Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 29 Jan 2019 17:14:55 -0800 Subject: [PATCH 5/7] randrole() fix Give all the calls to randrole() its new argument. --- sys/amiga/winami.c | 10 +++++----- sys/mac/macmenu.c | 2 +- sys/wince/mswproc.c | 6 +++--- win/curses/cursinit.c | 2 +- win/gem/wingem.c | 4 ++-- win/gnome/gnbind.c | 2 +- win/tty/wintty.c | 4 ++-- win/win32/mswproc.c | 6 +++--- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/sys/amiga/winami.c b/sys/amiga/winami.c index 1819ccde3..cd1854eb8 100644 --- a/sys/amiga/winami.c +++ b/sys/amiga/winami.c @@ -451,7 +451,7 @@ amii_player_selection() if (validrole(flags.initrole)) return; else { - flags.initrole=randrole(); + flags.initrole = randrole(FALSE); return; } #if 0 /* Don't query the user ... instead give random character -jhsa */ @@ -518,7 +518,7 @@ amii_player_selection() } else if( code == ' ' || code == '\n' || code == '\r' ) { - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); #if 0 /* OBSOLETE */ strcpy( pl_character, roles[ rnd( 11 ) ] ); #endif @@ -543,7 +543,7 @@ amii_player_selection() switch( gd->GadgetID ) { case 1: /* Random Character */ - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); #if 0 /* OBSOLETE */ strcpy( pl_character, roles[ rnd( 11 ) ] ); #endif @@ -1380,7 +1380,7 @@ amii_player_selection() flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { amii_putstr(WIN_MESSAGE, 0, "Incompatible role!"); - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); } } else { /* Prompt for a role */ @@ -1416,7 +1416,7 @@ amii_player_selection() any.a_int = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM) + 1; if (any.a_int == 0) /* must be non-zero */ - any.a_int = randrole() + 1; + any.a_int = randrole(FALSE) + 1; add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", MENU_UNSELECTED); any.a_int = i + 1; /* must be non-zero */ diff --git a/sys/mac/macmenu.c b/sys/mac/macmenu.c index 2c28aa0dc..11675000e 100644 --- a/sys/mac/macmenu.c +++ b/sys/mac/macmenu.c @@ -549,7 +549,7 @@ mac_askname() currrole = flags.initrole; /* Check for backward compatibility */ else if ((currrole = str2role(pl_character)) < 0) - currrole = randrole(); + currrole = randrole(FALSE); /* Initialize the race popup menu */ if (!(askmenu[RSRC_ASK_RACE] = NewMenu(RSRC_ASK_RACE, "\p"))) diff --git a/sys/wince/mswproc.c b/sys/wince/mswproc.c index d04c2156c..c140a8b58 100644 --- a/sys/wince/mswproc.c +++ b/sys/wince/mswproc.c @@ -225,7 +225,7 @@ mswin_player_selection(void) flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { raw_print("Incompatible role!"); - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); } } @@ -358,7 +358,7 @@ prompt_for_player_selection(void) flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { /* tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); */ - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); } } else { /* tty_clear_nhwindow(BASE_WINDOW); */ @@ -396,7 +396,7 @@ prompt_for_player_selection(void) any.a_int = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM) + 1; if (any.a_int == 0) /* must be non-zero */ - any.a_int = randrole() + 1; + any.a_int = randrole(FALSE) + 1; add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", MENU_UNSELECTED); any.a_int = i + 1; /* must be non-zero */ diff --git a/win/curses/cursinit.c b/win/curses/cursinit.c index 6c5c42b83..5f53df4ed 100644 --- a/win/curses/cursinit.c +++ b/win/curses/cursinit.c @@ -543,7 +543,7 @@ curses_choose_character() sel = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM); if (sel < 0) - sel = randrole(); + sel = randrole(FALSE); } flags.initrole = sel; diff --git a/win/gem/wingem.c b/win/gem/wingem.c index 8cd33ca2a..09567cda6 100644 --- a/win/gem/wingem.c +++ b/win/gem/wingem.c @@ -234,7 +234,7 @@ Gem_player_selection() if (flags.initrole < 0) { mar_add_message("Incompatible role!"); mar_display_nhwindow(WIN_MESSAGE); - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); } } else { /* Prompt for a role */ @@ -256,7 +256,7 @@ Gem_player_selection() any.a_int = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM) + 1; if (any.a_int == 0) /* must be non-zero */ - any.a_int = randrole() + 1; + any.a_int = randrole(FALSE) + 1; add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", MENU_UNSELECTED); any.a_int = i + 1; /* must be non-zero */ diff --git a/win/gnome/gnbind.c b/win/gnome/gnbind.c index 42152eeb9..43e067891 100644 --- a/win/gnome/gnbind.c +++ b/win/gnome/gnbind.c @@ -159,7 +159,7 @@ gnome_player_selection() sel = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM); if (sel < 0) - sel = randrole(); + sel = randrole(FALSE); } flags.initrole = sel; diff --git a/win/tty/wintty.c b/win/tty/wintty.c index 50e67c500..0cdb63ab5 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -512,7 +512,7 @@ tty_player_selection() k = pick_role(RACE, GEND, ALGN, PICK_RANDOM); if (k < 0) { tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); - k = randrole(); + k = randrole(FALSE); } } else { /* Prompt for a role */ @@ -574,7 +574,7 @@ tty_player_selection() } else if (choice == ROLE_RANDOM) { k = pick_role(RACE, GEND, ALGN, PICK_RANDOM); if (k < 0) - k = randrole(); + k = randrole(FALSE); } else { k = choice - 1; } diff --git a/win/win32/mswproc.c b/win/win32/mswproc.c index 8c37b3fd5..b637c463f 100644 --- a/win/win32/mswproc.c +++ b/win/win32/mswproc.c @@ -271,7 +271,7 @@ mswin_player_selection(void) flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { raw_print("Incompatible role!"); - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); } } @@ -395,7 +395,7 @@ prompt_for_player_selection(void) flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { /* tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); */ - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); } } else { /* tty_clear_nhwindow(BASE_WINDOW); */ @@ -433,7 +433,7 @@ prompt_for_player_selection(void) any.a_int = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM) + 1; if (any.a_int == 0) /* must be non-zero */ - any.a_int = randrole() + 1; + any.a_int = randrole(FALSE) + 1; add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", MENU_UNSELECTED); any.a_int = i + 1; /* must be non-zero */ From c598da8de4cbd09bac6a6fe4cf77886c8bf72151 Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 29 Jan 2019 20:29:56 -0500 Subject: [PATCH 6/7] fix build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ../sys/unix/unixmain.c: In function ‘sys_random_seed’: ../sys/unix/unixmain.c:779:29: error: expected expression before ‘long’ fread(&seed, sizeof long, 1, fptr); --- sys/unix/unixmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index c800c4919..50610d43c 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -776,7 +776,7 @@ sys_random_seed() fptr = fopen(DEV_RANDOM, "r"); if (fptr) { - fread(&seed, sizeof long, 1, fptr); + fread(&seed, sizeof (long), 1, fptr); has_strong_rngseed = TRUE; /* decl.c */ no_seed = FALSE; (void) fclose(fptr); From f2071a66f785949b13afec64e7621cef2916d55f Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 29 Jan 2019 22:12:09 -0500 Subject: [PATCH 7/7] fix a likely typo/transcription error in integer.h --- include/integer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/integer.h b/include/integer.h index c6983e544..b420a708f 100644 --- a/include/integer.h +++ b/include/integer.h @@ -7,7 +7,7 @@ #ifndef INTEGER_H #define INTEGER_H -#if defined(__STDC__) && __STDC_VERSION__ >= 199101L +#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) /* The compiler claims to conform to C99. Use stdint.h */ #include #define SKIP_STDINT_WORKAROUND