The preliminary implementation of PANICTRACE on VMS had a "Fixme"
that this fixes, and a "TODO" that this makes moot, but the main reason
for this patch is that vmsmisc.c had been changed to call vms_define(),
which resides in vmsunix.c. Since vmsmisc.obj is linked into progarms
in util/ and vmsunix.obj isn't, enabling PANICTRACE caused linking
problems for those. This moves the code that wants to call vms_define()
into vmsunix.c (despite the fact that it's not even vaguely related to
Unix emulation), so that it only matters to nethack and doesn't impact
the utility programs anymore.
This uses a VMS facility called LIB$INITIALIZE to call code before
main() starts. It's rather messy--at least when written in something
other than assembler or Bliss--and shouldn't be needed for nethack,
but I couldn't figure out how to trap the condition signalled by
lib$signal(SS$_DEBUG) when the debugger isn't available to do so, so I
needed a way to make issuing that signal be conditional upon debugger
availability. One of the arguments passed to LIB$INITIALIZE-invoked
routines contains information that makes if feasible to deduce whether
the debugger is available.
Even when PANICTRACE is disabled, that's useful for handling abort
due to panic while in running in wizard mode.
48 lines
1.2 KiB
C
48 lines
1.2 KiB
C
/* NetHack 3.5 vmsmisc.c $Date$ $Revision$ */
|
|
/* NetHack may be freely redistributed. See license for details. */
|
|
|
|
#include "config.h"
|
|
#undef exit
|
|
#include <ssdef.h>
|
|
#include <stsdef.h>
|
|
|
|
int debuggable = 0; /* 1 if we can debug or show a call trace */
|
|
|
|
void FDECL(vms_exit, (int));
|
|
void NDECL(vms_abort);
|
|
|
|
/* first arg should be unsigned long but <lib$routines.h> has unsigned int */
|
|
extern void VDECL(lib$signal, (unsigned,...));
|
|
|
|
/* terminate, converting Unix-style exit code into VMS status code */
|
|
void
|
|
vms_exit(status)
|
|
int status;
|
|
{
|
|
/* convert non-zero to failure, zero to success */
|
|
exit(status ? (SS$_ABORT | STS$M_INHIB_MSG) : SS$_NORMAL);
|
|
/* NOT REACHED */
|
|
}
|
|
|
|
/* put the user into the debugger; used for abort() when in wizard mode */
|
|
void
|
|
vms_abort()
|
|
{
|
|
if (debuggable)
|
|
lib$signal(SS$_DEBUG);
|
|
|
|
/* we'll get here if the debugger isn't available, or if the user
|
|
uses GO to resume execution instead of EXIT to quit */
|
|
vms_exit(2); /* don't return to caller (2==arbitrary non-zero) */
|
|
/* NOT REACHED */
|
|
}
|
|
|
|
/*
|
|
* Caveat: the VERYOLD_VMS configuration hasn't been tested in many years.
|
|
*/
|
|
#ifdef VERYOLD_VMS
|
|
#include "oldcrtl.c"
|
|
#endif
|
|
|
|
/*vmsmisc.c*/
|