1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-18 00:50:44 -08:00
emacs/mps/src/assert.c
Richard Brooksby e2ea14a3f7 Mail.richard.1996-02-08.10-26
Copied from Perforce
 Change: 15204
 ServerID: perforce.ravenbrook.com
1996-02-08 14:20:19 +00:00

83 lines
1.8 KiB
C

/* impl.c.assert: ASSERTION IMPLEMENTATION
*
* $HopeName: MMsrc!assert.c(trunk.2) $
*
* When DEBUG is defined (see debug.h) this source provides
* the AssertFail function which is invoked by the assertion macros
* (see impl.h.assert). It also provides for user-installed
* assertion failure handlers.
*
* Notes
*
* 3. To be really solid, assert should write the information into a
* buffer before reaching the handler, so that it can be recovered
* even if printing fails. richard 1994-11-15
*/
#include "std.h"
#include "assert.h"
#include "lib.h"
#include <stdarg.h>
static void AssertLib(const char *cond, const char *id,
const char *file, unsigned line)
{
LibFormat(LibStreamErr(),
"\nMPS ASSERTION FAILURE\n\n"
"Id: %s\n"
"File: %s\n"
"Line: %u\n"
"Condition: %s\n\n",
id, file, line, cond);
LibAbort();
}
static AssertHandler handler = AssertLib;
AssertHandler AssertDefault(void)
{
return AssertLib;
}
AssertHandler AssertInstall(AssertHandler new)
{
AssertHandler prev = handler;
handler = new;
return prev;
}
#ifdef DEBUG
/* === FAIL ASSERTION ===
*
* This function is called when an ASSERT macro fails a test. It
* calls the installed assertion handler, if it is not NULL, then
* exits the program.
*/
void AssertFail(const char *cond, const char *id,
const char *file, unsigned line)
{
if(handler != NULL) {
(*handler)(cond, id, file, line);
LibAbort();
/* not reached, but we can't assert that */
}
}
/* === UNREACHABLE STATEMENT ===
*
* This function is called by the NOTREACHED macro.
*/
void AssertReach(const char *file, unsigned line)
{
AssertFail("unreachable statement", "no id", file, line);
}
#endif