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