kludge to ungrab mouse when we hit an int3
[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.3 $
16  * $Author: bradleyb $
17  * $Date: 2001-11-14 10:51:04 $
18  *
19  * Header for error handling/printing/exiting code
20  *
21  * $Log: not supported by cvs2svn $
22  * Revision 1.2  2001/01/22 15:49:14  bradleyb
23  * fix compiler warnings w/opengl
24  *
25  * Revision 1.1.1.1  2001/01/19 03:30:16  bradleyb
26  * Import of d2x-0.0.8
27  *
28  * Revision 1.3  1999/10/14 04:48:21  donut
29  * alpha fixes, and gl_font args
30  *
31  * Revision 1.2  1999/08/05 22:53:41  sekmu
32  *
33  * D3D patch(es) from ADB
34  *
35  * Revision 1.1.1.1  1999/06/14 22:02:09  donut
36  * Import of d1x 1.37 source.
37  *
38  * Revision 1.12  1994/06/17  15:22:46  matt
39  * Added pragma for Error() for when NDEBUG
40  * 
41  * Revision 1.11  1994/03/07  13:22:14  matt
42  * Since the Error() function has 'aborts' set in pragma, we do a jmp
43  * to the function rather than call.
44  * 
45  * Revision 1.10  1994/02/17  12:37:15  matt
46  * Combined two pragma's for Error(), since second superseded the first
47  * 
48  * Revision 1.9  1994/02/10  18:02:53  matt
49  * Changed 'if DEBUG_ON' to 'ifndef NDEBUG'
50  * 
51  * Revision 1.8  1994/02/09  15:18:29  matt
52  * Added pragma saying that Error() never returns
53  * 
54  * Revision 1.7  1993/10/19  12:57:53  matt
55  * If DEBUG_ON not defined, define it to be 1
56  * 
57  * Revision 1.6  1993/10/15  21:40:39  matt
58  * Made error functions generate int3's if debugging on
59  * 
60  * Revision 1.5  1993/10/14  15:29:22  matt
61  * Added new function clear_warn_func()
62  * 
63  * Revision 1.4  1993/10/08  16:16:47  matt
64  * Made Assert() call function _Assert(), rather to do 'if...' inline.
65  * 
66  * Revision 1.3  1993/09/29  11:39:07  matt
67  * Added Assert() macro, like the system one, but calls Error()
68  * 
69  * Revision 1.2  1993/09/27  11:47:03  matt
70  * Added function set_warn_func()
71  * 
72  * Revision 1.1  1993/09/23  20:17:46  matt
73  * Initial revision
74  * 
75  *
76  */
77
78 #ifndef _ERROR_H
79 #define _ERROR_H
80
81 #include <stdio.h>
82
83 #ifdef __GNUC__
84 #define __noreturn __attribute__ ((noreturn))
85 #define __format __attribute__ ((format (printf, 1, 2)))
86 #else
87 #define __noreturn
88 #define __format
89 #endif
90
91 int error_init(char *fmt,...);                  //init error system, set default message, returns 0=ok
92 void set_exit_message(char *fmt,...);   //specify message to print at exit
93 void Warning(char *fmt,...);                            //print out warning message to user
94 void set_warn_func(void (*f)(char *s));//specifies the function to call with warning messages
95 void clear_warn_func(void (*f)(char *s));//say this function no longer valid
96 void _Assert(int expr,char *expr_text,char *filename,int linenum);      //assert func
97 void Error(char *fmt,...) __noreturn __format;                          //exit with error code=1, print message
98 void Assert(int expr);
99 void Int3();
100 #ifndef NDEBUG          //macros for debugging
101
102 #ifdef __GNUC__
103 //edited 05/17/99 Matt Mueller - I dunno if there is a non-asm way to do a "breakpoint" so this'll have to do.
104 #ifdef NO_ASM
105 //#define Int3() Error("int 3 %s:%i\n",__FILE__,__LINE__);
106 //#define Int3() {volatile int a=0,b=1/a;}
107 #define Int3() ((void)0)
108 #else
109 #ifdef SDL_INPUT
110 #include <SDL/SDL.h>
111 #include "args.h"
112 static inline void _Int3()
113 {
114         SDL_WM_GrabInput(SDL_GRAB_OFF);
115         asm("int $3");
116 }
117 #define Int3() _Int3()
118 #else
119 #define Int3() asm("int $3")
120 #endif
121 #endif
122 //end edit -MM
123
124 #elif defined __WATCOMC__
125 void Int3(void);                                                                      //generate int3
126 #pragma aux Int3 = "int 3h";
127 #elif defined _MSC_VER
128 #define Int3() __asm { int 3 }
129 #else
130 #error Unknown Compiler!
131 #endif
132
133 #define Assert(expr) ((expr)?(void)0:(void)_Assert(0,#expr,__FILE__,__LINE__))
134
135 #ifdef __GNUC__
136 //#define Error(format, args...) ({ /*Int3();*/ Error(format , ## args); })
137 #elif defined __WATCOMC__
138 //make error do int3, then call func
139 #pragma aux Error aborts = \
140         "int    3"      \
141         "jmp Error";
142
143 //#pragma aux Error aborts;
144 #else
145 // DPH: I'm not going to bother... it's not needed... :-)
146 #endif
147
148 #ifdef __WATCOMC__
149 //make assert do int3 (if expr false), then call func
150 #pragma aux _Assert parm [eax] [edx] [ebx] [ecx] = \
151         "test eax,eax"          \
152         "jnz    no_int3"                \
153         "int    3"                              \
154         "no_int3:"                      \
155         "call _Assert";
156 #endif
157
158 #else                                   //macros for real game
159
160 #ifdef __WATCOMC__
161 #pragma aux Error aborts;
162 #endif
163 //Changed Assert and Int3 because I couldn't get the macros to compile -KRB
164 #define Assert(__ignore) ((void)0)
165 //void Assert(int expr);
166 #define Int3() ((void)0)
167 //void Int3();
168 #endif
169
170 #endif /* _ERROR_H */