Files
nethack/util/panic.c
PatR b30fce4f88 flag panic() and terminate() as "no return"
Mark panic() as never returning so that code analysis might be able
to do a smarter job.  It required splitting done() into two routines
since the first part really can return (but not if PANICKED was the
reason it got called).  done() is now much shorter and ends with a
call to new really_done(), and panic() skips done()'s might-return
part by calling really_done() directly.

Noticed in passing:  the "report error to <list of SYSCF WIZARDS>"
code calls a routine which uses alloc(), which won't work very well
if the reason for panic was because malloc() ran out of memory.
2015-11-22 08:33:42 -08:00

63 lines
1.4 KiB
C

/* NetHack 3.6 panic.c $NHDT-Date: 1448210012 2015/11/22 16:33:32 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
/*
* This code was adapted from the code in end.c to run in a standalone
* mode for the makedefs / drg code.
*/
#define NEED_VARARGS
#include "config.h"
#ifdef AZTEC
#define abort() exit()
#endif
#ifdef VMS
extern void NDECL(vms_abort);
#endif
/*VARARGS1*/
boolean panicking;
void VDECL(panic, (char *, ...));
void panic
VA_DECL(char *, str)
{
VA_START(str);
VA_INIT(str, char *);
if (panicking++)
#ifdef SYSV
(void)
#endif
abort(); /* avoid loops - this should never happen*/
(void) fputs(" ERROR: ", stderr);
Vfprintf(stderr, str, VA_ARGS);
(void) fflush(stderr);
#if defined(UNIX) || defined(VMS)
#ifdef SYSV
(void)
#endif
abort(); /* generate core dump */
#endif
VA_END();
exit(EXIT_FAILURE); /* redundant */
}
#ifdef ALLOCA_HACK
/*
* In case bison-generated foo_yacc.c tries to use alloca(); if we don't
* have it then just use malloc() instead. This may not work on some
* systems, but they should either use yacc or get a real alloca routine.
*/
long *
alloca(cnt)
unsigned cnt;
{
return cnt ? alloc(cnt) : (long *) 0;
}
#endif
/*panic.c*/