]> icculus.org git repositories - btb/d2x.git/blob - include/error.h
don't die on int3, unless -debug given
[btb/d2x.git] / include / error.h
1 /*
2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
11 COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13 /*
14  * $Source: /cvs/cvsroot/d2x/include/error.h,v $
15  * $Revision: 1.4 $
16  * $Author: bradleyb $
17  * $Date: 2002-01-18 07:00:59 $
18  *
19  * Header for error handling/printing/exiting code
20  *
21  * $Log: not supported by cvs2svn $
22  * Revision 1.3  2001/11/14 10:51:04  bradleyb
23  * kludge to ungrab mouse when we hit an int3
24  *
25  * Revision 1.2  2001/01/22 15:49:14  bradleyb
26  * fix compiler warnings w/opengl
27  *
28  * Revision 1.1.1.1  2001/01/19 03:30:16  bradleyb
29  * Import of d2x-0.0.8
30  *
31  * Revision 1.3  1999/10/14 04:48:21  donut
32  * alpha fixes, and gl_font args
33  *
34  * Revision 1.2  1999/08/05 22:53:41  sekmu
35  *
36  * D3D patch(es) from ADB
37  *
38  * Revision 1.1.1.1  1999/06/14 22:02:09  donut
39  * Import of d1x 1.37 source.
40  *
41  * Revision 1.12  1994/06/17  15:22:46  matt
42  * Added pragma for Error() for when NDEBUG
43  * 
44  * Revision 1.11  1994/03/07  13:22:14  matt
45  * Since the Error() function has 'aborts' set in pragma, we do a jmp
46  * to the function rather than call.
47  * 
48  * Revision 1.10  1994/02/17  12:37:15  matt
49  * Combined two pragma's for Error(), since second superseded the first
50  * 
51  * Revision 1.9  1994/02/10  18:02:53  matt
52  * Changed 'if DEBUG_ON' to 'ifndef NDEBUG'
53  * 
54  * Revision 1.8  1994/02/09  15:18:29  matt
55  * Added pragma saying that Error() never returns
56  * 
57  * Revision 1.7  1993/10/19  12:57:53  matt
58  * If DEBUG_ON not defined, define it to be 1
59  * 
60  * Revision 1.6  1993/10/15  21:40:39  matt
61  * Made error functions generate int3's if debugging on
62  * 
63  * Revision 1.5  1993/10/14  15:29:22  matt
64  * Added new function clear_warn_func()
65  * 
66  * Revision 1.4  1993/10/08  16:16:47  matt
67  * Made Assert() call function _Assert(), rather to do 'if...' inline.
68  * 
69  * Revision 1.3  1993/09/29  11:39:07  matt
70  * Added Assert() macro, like the system one, but calls Error()
71  * 
72  * Revision 1.2  1993/09/27  11:47:03  matt
73  * Added function set_warn_func()
74  * 
75  * Revision 1.1  1993/09/23  20:17:46  matt
76  * Initial revision
77  * 
78  *
79  */
80
81 #ifndef _ERROR_H
82 #define _ERROR_H
83
84 #include <stdio.h>
85
86 #ifdef __GNUC__
87 #define __noreturn __attribute__ ((noreturn))
88 #define __format __attribute__ ((format (printf, 1, 2)))
89 #else
90 #define __noreturn
91 #define __format
92 #endif
93
94 int error_init(char *fmt,...);                  //init error system, set default message, returns 0=ok
95 void set_exit_message(char *fmt,...);   //specify message to print at exit
96 void Warning(char *fmt,...);                            //print out warning message to user
97 void set_warn_func(void (*f)(char *s));//specifies the function to call with warning messages
98 void clear_warn_func(void (*f)(char *s));//say this function no longer valid
99 void _Assert(int expr,char *expr_text,char *filename,int linenum);      //assert func
100 void Error(char *fmt,...) __noreturn __format;                          //exit with error code=1, print message
101 void Assert(int expr);
102 void Int3();
103 #ifndef NDEBUG          //macros for debugging
104
105 #ifdef __GNUC__
106 #ifdef NO_ASM
107 //#define Int3() Error("int 3 %s:%i\n",__FILE__,__LINE__);
108 //#define Int3() {volatile int a=0,b=1/a;}
109 #define Int3() ((void)0)
110 #else
111 #ifdef SDL_INPUT
112 #include <SDL/SDL.h>
113 #endif
114 #include "args.h"
115 static inline void _Int3()
116 {
117         if (FindArg("-debug")) {
118 #ifdef SDL_INPUT
119                 SDL_WM_GrabInput(SDL_GRAB_OFF);
120 #endif
121                 asm("int $3");
122         }
123 }
124 #define Int3() _Int3()
125 #endif
126
127 #elif defined __WATCOMC__
128 void Int3(void);                                                                      //generate int3
129 #pragma aux Int3 = "int 3h";
130 #elif defined _MSC_VER
131 #define Int3() __asm { int 3 }
132 #else
133 #error Unknown Compiler!
134 #endif
135
136 #define Assert(expr) ((expr)?(void)0:(void)_Assert(0,#expr,__FILE__,__LINE__))
137
138 #ifdef __GNUC__
139 //#define Error(format, args...) ({ /*Int3();*/ Error(format , ## args); })
140 #elif defined __WATCOMC__
141 //make error do int3, then call func
142 #pragma aux Error aborts = \
143         "int    3"      \
144         "jmp Error";
145
146 //#pragma aux Error aborts;
147 #else
148 // DPH: I'm not going to bother... it's not needed... :-)
149 #endif
150
151 #ifdef __WATCOMC__
152 //make assert do int3 (if expr false), then call func
153 #pragma aux _Assert parm [eax] [edx] [ebx] [ecx] = \
154         "test eax,eax"          \
155         "jnz    no_int3"                \
156         "int    3"                              \
157         "no_int3:"                      \
158         "call _Assert";
159 #endif
160
161 #else                                   //macros for real game
162
163 #ifdef __WATCOMC__
164 #pragma aux Error aborts;
165 #endif
166 //Changed Assert and Int3 because I couldn't get the macros to compile -KRB
167 #define Assert(__ignore) ((void)0)
168 //void Assert(int expr);
169 #define Int3() ((void)0)
170 //void Int3();
171 #endif
172
173 #endif /* _ERROR_H */