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