From 9e47a53bb7b2baac539059a439fa0f977f2535fb Mon Sep 17 00:00:00 2001 From: cuz Date: Tue, 1 Aug 2000 15:01:21 +0000 Subject: [PATCH] Move the check module to common/ git-svn-id: svn://svn.cc65.org/cc65/trunk@247 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/common/abend.h | 2 +- src/common/check.c | 100 ++++++++++++++++++++++++++++++++++++ src/common/check.h | 101 +++++++++++++++++++++++++++++++++++++ src/common/make/gcc.mak | 2 + src/common/make/watcom.mak | 1 + 5 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 src/common/check.c create mode 100644 src/common/check.h diff --git a/src/common/abend.h b/src/common/abend.h index 9b2df73bd..7b5fefaf0 100644 --- a/src/common/abend.h +++ b/src/common/abend.h @@ -48,7 +48,7 @@ -void AbEnd (const char* Format, ...) attribute ((format (printf, 1, 2))); +void AbEnd (const char* Format, ...) attribute ((format (printf, 1, 2), noreturn)); /* Print a message preceeded by the program name and terminate the program * with an error exit code. */ diff --git a/src/common/check.c b/src/common/check.c new file mode 100644 index 000000000..52e24271f --- /dev/null +++ b/src/common/check.c @@ -0,0 +1,100 @@ +/*****************************************************************************/ +/* */ +/* check.c */ +/* */ +/* Assert like macros */ +/* */ +/* */ +/* */ +/* (C) 1998 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@musoftware.de */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#include + +#include "abend.h" +#include "check.h" + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +/* Predefined messages */ +const char* MsgInternalError = "Internal error: "; +const char* MsgPrecondition = "Precondition violated: "; +const char* MsgCheckFailed = "Check failed: "; +const char* MsgProgramAborted = "Program aborted: "; + + + +static void DefaultCheckFailed (const char* msg, const char* cond, + int code, const char* file, unsigned line) + attribute ((noreturn)); + +void (*CheckFailed) (const char* Msg, const char* Cond, int Code, + const char* File, unsigned Line) attribute ((noreturn)) + = DefaultCheckFailed; +/* Function pointer that is called from check if the condition code is true. */ + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +static void DefaultCheckFailed (const char* Msg, const char* Cond, + int Code, const char* File, unsigned Line) +{ + /* Log the error */ + if (Code) { + AbEnd ("%s%s (= %d), file `%s', line %u", Msg, Cond, Code, File, Line); + } else { + AbEnd ("%s%s, file `%s', line %u", Msg, Cond, File, Line); + } +} + + + +void Check (const char* Msg, const char* Cond, int Code, + const char* File, unsigned Line) +/* This function is called from all check macros (see below). It checks, + * wether the given Code is true (!= 0). If so, it calls the CheckFailed + * vector with the given strings. If not, it simply returns. + */ +{ + if (Code != 0) { + CheckFailed (Msg, Cond, Code, File, Line); + } +} + + + diff --git a/src/common/check.h b/src/common/check.h new file mode 100644 index 000000000..1049c4bf4 --- /dev/null +++ b/src/common/check.h @@ -0,0 +1,101 @@ +/*****************************************************************************/ +/* */ +/* check.h */ +/* */ +/* Assert like macros */ +/* */ +/* */ +/* */ +/* (C) 1998 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@musoftware.de */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#ifndef CHECK_H +#define CHECK_H + + + +#include "attrib.h" + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +extern const char* MsgInternalError; /* "Internal error: " */ +extern const char* MsgPrecondition; /* "Precondition violated: " */ +extern const char* MsgCheckFailed; /* "Check failed: " */ +extern const char* MsgProgramAborted; /* "Program aborted: " */ + + + +extern void (*CheckFailed) (const char* Msg, const char* Cond, + int Code, const char* File, unsigned Line) + attribute ((noreturn)); +/* Function pointer that is called from check if the condition code is true. */ + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +void Check (const char* Msg, const char* Cond, int Code, + const char* File, unsigned Line); +/* This function is called from all check macros (see below). It checks, + * wether the given Code is true (!= 0). If so, it calls the CheckFailed + * vector with the given strings. If not, it simply returns. + */ + + + +#define FAIL(s) CheckFailed (MsgInternalError, s, 0, __FILE__, __LINE__) +/* Fail macro. Is used if something evil happens, calls checkfailed directly. */ + +#define ABORT(s) CheckFailed (MsgProgramAborted, s, 0, __FILE__, __LINE__) +/* Use this one instead of FAIL if there is no internal program error but an + * error condition that is caused by the user or operating system (FAIL and + * ABORT are essentially the same but the message differs). + */ + +#define PRECONDITION(c) Check (MsgPrecondition, #c, !(c), __FILE__, __LINE__) + +#define CHECK(c) Check (MsgCheckFailed, #c, !(c), __FILE__, __LINE__) + +#define ZCHECK(c) Check (MsgCheckFailed, #c, c, __FILE__, __LINE__) + + + +/* End of check.h */ +#endif + + + diff --git a/src/common/make/gcc.mak b/src/common/make/gcc.mak index ce194ab85..26c2e8ccd 100644 --- a/src/common/make/gcc.mak +++ b/src/common/make/gcc.mak @@ -11,6 +11,7 @@ LIB = common.a OBJS = abend.o \ bitops.o \ + check.o \ cmdline.o \ exprdefs.o \ fname.o \ @@ -52,3 +53,4 @@ depend dep: $(OBJS:.o=.c) $(CC) -MM $^ > .depend + diff --git a/src/common/make/watcom.mak b/src/common/make/watcom.mak index 5c5d6a03e..e8caa558f 100644 --- a/src/common/make/watcom.mak +++ b/src/common/make/watcom.mak @@ -67,6 +67,7 @@ CCCFG = -bt=$(TARGET) -d1 -onatx -zp4 -5 -zq -w2 OBJS = abend.obj \ bitops.obj \ + check.obj \ cmdline.obj \ exprdefs.obj \ fname.obj \ -- 2.39.5