The HP C compiler for VMS issued a pair of diagnostics for both *_lex.c
files, about an expression of the form (unsigned_var <= 0) maybe not
being what was really intended, and it was right. Changing that to
'< 1' would have suppressed the diagnostic but left the bug, which was
in code that performed a subtraction and then checked for a negative
result. It worked in older flex versions when the variables were
signed, but got broken when they were changed to unsigned (no doubt in
respose to gcc complaining about comparing signed and unsigned in some
other spot where one of them was used).
The bug is in flex's original skeleton, so was inherited by our new
custom skeleton. I've fixed it in the custom skeleton, which means
that sys/share/*_lex.c became out of date even though util/*_comp.l
remain unchanged.
Apparently tty doesn't mind if you use add_menu() without preceding
it with start_menu(), because doclassdisco() (the new with 3.6.0 '`'
command) works for me with all four settings of menustyle.
Changes to be committed:
modified: win/win32/winhack.c
sys_early_init was never called for win32 GUI. That was causing "rnd(0) -
program in disorder" in tt_oname.
SYSCF is enabled by default, but nethack won't run without the required
sysconf file. sys/vms/install.com expects to find a template one in
sys/vms/sysconf so create that.
Since the tarball will need repackaging, fix a comment typo (dyslexic
spelling of "nymph") in sys/unix/sysconf. Also, move DEBUGFILES to the
bottom so that more useful entries move up. And expand the comment for
the PANICTRACE options.
Generated with flex 2.6.0 and a new custom skeleton for that version
(which almost certainly won't work with any older or newer version of
flex, but that limitation has no effect on the usefulness of the
generated scanner code).
Function definitions are oldstyle:
int foo(bar)
char *bar;
{...}
rather than ANSI, like nethack's core code. Advance declarations use
FDECL for prototypes, so should also fit nethack, although the usage
'FDECL(, (arglist))' makes me feel a bit uneasy. gcc doesn't mind the
omitted first argument but other compilers might not like it.
The system headers (stdlib.h and a few others) that flex has been
insisting on including are gone (with this skeleton). It starts out
including "config.h" and that header has the responsibility for any
definitions and declarations necessary. That shouldn't be a big deal
since config.h -> XXXconf.h -> system.h is what we're already relying
on for everything else, but it does need testing for any configuration
that uses sys/share/{dgn,lev}_{lex,yacc}.c.
I'll be checking the skeleton into the NHinternals repository after
adding some documentation, but I'm wondering whether it should really
become part of the source distribution.
Fix the situation where disabling PANICTRACE, which happened implicitly
when BETA got disabled, caused SYSCF option processing to complain and
quit if the 'sysconf' file contained any PANICTRACE settings.
Now accept all the PANICTRACE options (assuming SYSCF is defined) even
if PANICTRACE is not defined. Their values are recorded in the 'sysopt'
struct, but only validated when the appropriate macros (PANICTRACE,
PANICTRACE_LIB) are defined.
Change
|Bad option line: "foo
|"
to
|Bad option line: "foo"
by stripping away the input line's newline before processing it.
(This doesn't address the PANICTRACE options processing issue.)
With DEBUG suppressed, I started getting
16 warning: empty body in an if-statement
and 2 warning: empty body in an else-statement
from gcc.
Using braces for an empty block instead of just ';' avoids the warning:
if (foo)
debugpline("foo");
is bad,
if (bar) {
debugpline("bar");
}
is good. ;-)
The changes to lint.h are just precautionary.
modified:
include/lint.h
src/attrib.c, bones.c, dbridge.c, dig.c, eat.c,
makemon.c, mkmaze.c, mon.c, sp_lev.c
This regenerates the scanner and parser files. I'm checking them
into master only. If they work for everyone using them, they can be
merged into 3.6.0.
dgn_yacc.c: I reconstructed our 3.4.3 patch for byacc 1.9 (the original,
not the one used to create the set of files being replaced here) by
comparing dgn_yacc.c made with vanilla byacc and dgn_yacc.c from 3.4.3.
(Unlike lev_comp.l, dgn_comp.l has hardly changed at all.) There's no
dynamic memory use in that version, so declarations for malloc and/or
realloc and/or inclusion of <stdlib.h> aren't an issue. The fixed size
stack it uses is big enough for 'make update' to run to completion.
lev_yacc: I built it with [modified] byacc to replace one built with
bison. sys/share/lev_comp.h was from byacc, not bison, so something has
gotten screwed up recently.
*_lex.c: I used the same version of flex (2.5.37) as the one used to
create the set being replaced, so build prospects are the same. But I
used -L to suppress #line directives and my Makefile has an extra 'sed'
pass that strips trailing spaces, producing extra bands in the diff.
*_comp.h: They're the same as far as git is concerned (ie, only the
file creation/modification dates changed), so there's no update.
Shorten a function name in sp_lev.c that exceeded 31 characters.
That's a limit imposed by the VMS linker and the compiler complains
that it will be truncated.
Make all sp_lev.c functions which aren't listed in extern.h be static
and give all of them a declaration at the top of the file. I reordered
the ones already declared there in the same order as they occur in the
source, so the diff is quite a bit bigger than the actual changes.
(Once the one with the long name became static, the length of its name
no longer mattered, but I've shortened it anyway.)
Indent a couple of #pragma directives. Some pre-ANSI compiler didn't
like '#' in column 1 followed by something it didn't understand, even
when that occurred in a conditional block which was in the midst of
being excluded. (util/*_comp.y recently reminded me of that. files.c
should get a fix like this too.)
This could use a bit of reformatting. I stripped off trailing spaces
from a handful of lines but otherwise have kept it as is since the
formatting issue is minor.
Another issue from old beta-tester mail: #annotate and #overview were
missing from the list of extended commands. M-A and M-O were listed
but marked "(if supported)" even though they've become unconditional.
Same for M-R, although in its case #ride wasn't missing.
Some old beta-tester mail suggested mentioning the implicit_uncursed
option in the "Curses and Blessings" section; this patch does that.
It also mentions that option in the "Configuring Menu Colors" section
since anyone trying to specify a color for " uncursed " will want
objects to be explicitly described as "uncursed".
The changes to the LaTeX version haven't been tested. The generated
plain text version has a lot of spurious changes due to the padding
method it uses to right-justify short lines.
Reported by a beta tester months ago: it was possible to recognize
your god's temple on the Astral Plane by stepping into its doorway,
since #overview would show "temple of <your god>" (only if just one
temple had been entered and the altar in it was the only one you'd
seen and it was for your own god; #overview doesn't show "temple of
<other god>", just "a temple"). After this fix it will just show
"a temple" even when you can see the temple's altar, so #overview
can't be used as a shortcut to finding the right temple.
While testing the fix I discovered that amnesia wasn't handled when
forgetting the current level's map, only when other levels got
flagged as forgotten. The number of altars, fountains, and so on
are recalculated when #overview is executed, so current-level amnesia
worked for those. But data about known rooms is not recalculated,
so the number of temples and shops you'd visited on the level stayed
instead of being forgotten. The fix is a bit iffy for the case where
you only forget random spots scattered across the level's map rather
than the whole thing; this just wipes #overview memory of every room
even if parts of rooms are still remembered.