]> git.sur5r.net Git - cc65/commitdiff
Move the check module to common/
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 1 Aug 2000 15:01:21 +0000 (15:01 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 1 Aug 2000 15:01:21 +0000 (15:01 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@247 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/common/abend.h
src/common/check.c [new file with mode: 0644]
src/common/check.h [new file with mode: 0644]
src/common/make/gcc.mak
src/common/make/watcom.mak

index 9b2df73bd559badc384f23fcaf861e05dab0ba5e..7b5fefaf04e1439f988178d0d07504dd64a9c1ae 100644 (file)
@@ -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 (file)
index 0000000..52e2427
--- /dev/null
@@ -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 <stdlib.h>
+
+#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 (file)
index 0000000..1049c4b
--- /dev/null
@@ -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
+
+
+
index ce194ab85b4098c56088f89a93885600cb2e5e11..26c2e8ccd18eb4c7195b851c8f0f1c8ea93aaae3 100644 (file)
@@ -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
 
 
+                        
index 5c5d6a03ec541ba716f85253f6351f4f91b47cb8..e8caa558fb4a4a258f54d8df088dcbd2ba064006 100644 (file)
@@ -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       \