1: /* Primitive support for exceptions in C. Coded just for fun
2: on 2003-07-13 by admp.
3: Use, share and modify under GNU General Public License.
5: This header file uses many GCC extensions, and therefore is
6: unportable. So use GCC.
7: */
9: /* Generally, this implementation is very limited. All after
10: all, there is one MAIN restriction: TRY without EXCEPT
11: will not even compile or something strange will happen at run time.
12: Anyway, there isn't much point in using TRY without EXCEPT, I think.
13: */
15: #if defined (__EXCEPTION_H__)
16: lose!
17: #endif
19: #define __EXCEPTION_H__
21: /* All code is based on this. */
22: #include <setjmp.h>
24: /* Prefix for all names here is `__exception_' (and __EXCEPTION_ for
25: macros) to leave namespace clean. */
27: /* Type of exception structure. */
28: #ifndef __EXCEPTION_TYPE
29: # define __EXCEPTION_TYPE int
30: #endif
32: /* This makes exception structure from exception code.
33: May use as much arguments as you want. */
34: #ifndef __EXCEPTION_MAKE
35: # define __EXCEPTION_MAKE(code) code
36: #endif
38: /* Function for comparing exception structure with exception
39: code. */
40: #ifndef __EXCEPTION_EQ
41: # define __EXCEPTION_EQ(f, b) ((f) == (b))
42: #endif
44: /* The top CATCHER. */
45: static jmp_buf __exception_catcher;
47: /* The raised exception.*/
48: static __EXCEPTION_TYPE __exception;
50: /* File and line where exception was raised. */
51: static int __exception_line;
52: static char *__exception_file;
54: /* The TRY. */
55: #define try \
56: if (setjmp (__exception_catcher) == 0)
58: /* The EXCEPT. */
59: #define except \
60: else
62: /* The RAISE (EXCEPTION). */
63: #define raise(code...) \
64: do { \
65: __exception = __EXCEPTION_MAKE (code); \
66: __exception_line = __LINE__; \
67: __exception_file = __FILE__; \
68: longjmp (__exception_catcher, 1); \
69: } while (0)
71: /* The ON. */
72: #define on(code...) \
73: if (__EXCEPTION_EQ (__exception, \
74: __EXCEPTION_MAKE (code)))