1 #ifndef _salt_debug_h
2 #define _salt_debug_h
3 
4 /*
5  * Copyright 2003, 2004 Porchdog Software. All rights reserved.
6  *
7  *	Redistribution and use in source and binary forms, with or without modification,
8  *	are permitted provided that the following conditions are met:
9  *
10  *		1. Redistributions of source code must retain the above copyright notice,
11  *		   this list of conditions and the following disclaimer.
12  *		2. Redistributions in binary form must reproduce the above copyright notice,
13  *		   this list of conditions and the following disclaimer in the documentation
14  *		   and/or other materials provided with the distribution.
15  *
16  *	THIS SOFTWARE IS PROVIDED BY PORCHDOG SOFTWARE ``AS IS'' AND ANY
17  *	EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  *	WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  *	IN NO EVENT SHALL THE HOWL PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
20  *	INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21  *	BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  *	DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23  *	OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
24  *	OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25  *	OF THE POSSIBILITY OF SUCH DAMAGE.
26  *
27  *	The views and conclusions contained in the software and documentation are those
28  *	of the authors and should not be interpreted as representing official policies,
29  *	either expressed or implied, of Porchdog Software.
30  */
31 
32 #include <salt/platform.h>
33 #include <stdarg.h>
34 
35 
36 #ifdef __cplusplus
37 extern "C"
38 {
39 #endif
40 
41 
42 #define SW_LOG_WARNING     1 << 0
43 #define SW_LOG_ERROR       1 << 1
44 #define SW_LOG_NOTICE      1 << 2
45 #define SW_LOG_VERBOSE     1 << 3
46 #define SW_LOG_OFF         0x0
47 
48 
49 #if (defined( __GNUC__))
50 
51 #	if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)))
52 
53 #		define  __C99_VA_ARGS__	1
54 
55 #		define  __GNU_VA_ARGS__	0
56 
57 #	else
58 
59 #		define  __C99_VA_ARGS__	0
60 
61 #		define  __GNU_VA_ARGS__	1
62 
63 #	endif
64 
65 #else
66 
67 #	define  __C99_VA_ARGS__		0
68 
69 #	define  __GNU_VA_ARGS__		0
70 
71 #endif
72 
73 
74 # if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9)))
75 
76 #	define	__SW_FUNCTION__			__func__
77 
78 #elif (defined( __GNUC__))
79 
80 #	define	__SW_FUNCTION__			__PRETTY_FUNCTION__
81 
82 #elif( defined(_MSC_VER ) && !defined(_WIN32_WCE))
83 
84 #	define	__SW_FUNCTION__			__FUNCTION__
85 
86 #else
87 
88 #	define	__SW_FUNCTION__			""
89 
90 #endif
91 
92 
93 #define sw_check(expr, label, action)			\
94 do 														\
95 {															\
96 	if (!(expr)) 										\
97 	{														\
98 		{													\
99 			action;										\
100 		}													\
101 		goto label;										\
102 	}														\
103 } while (0)
104 
105 
106 #define sw_check_log(expr, label, action)		\
107 do 														\
108 {															\
109 	if (!(expr)) 										\
110 	{														\
111 		sw_print_assert(0, NULL, __FILE__, __SW_FUNCTION__, __LINE__);	\
112 		{													\
113 			action;										\
114 		}													\
115 		goto label;										\
116 	}														\
117 } while (0)
118 
119 
120 #define sw_check_okay(code, label)				\
121 do 														\
122 {															\
123 	if ((int) code != 0) 							\
124 	{														\
125 		goto label;										\
126 	}														\
127 } while (0)
128 
129 
130 #define sw_check_okay_log(code, label)			\
131 do 														\
132 {															\
133 	if ((int) code != 0) 							\
134 	{														\
135 		sw_print_assert((int) code, NULL, __FILE__, __SW_FUNCTION__, __LINE__);	\
136 		goto label;										\
137 	}														\
138 } while ( 0 )
139 
140 
141 #define sw_translate_error(expr, errno)		((expr) ? 0 : (errno))
142 
143 
144 #if defined(WIN32)
145 
146 #	define sw_socket_errno()		(int) WSAGetLastError()
147 #	define sw_set_socket_errno(X)	WSASetLastError(X)
148 #	define sw_system_errno()		(int) GetLastError()
149 #	define sw_set_system_errno(X)	SetLastError(X)
150 
151 #else
152 
153 #	define sw_socket_errno()		errno
154 #	define sw_set_socket_errno(X)	errno = X
155 #	define sw_system_errno()		errno
156 #	define sw_set_system_errno(X)	errno = X
157 
158 #endif
159 
160 
161 #if !defined(NDEBUG)
162 
163 #	define sw_assert(X)		\
164 									\
165 	do								\
166 	{								\
167 		if (!(X))				\
168 		{							\
169 			sw_print_assert( 0, #X, __FILE__, __SW_FUNCTION__, __LINE__); \
170 		}							\
171 	} while( 0 )
172 
173 #else
174 
175 #	define sw_assert(X)
176 
177 #endif
178 
179 
180 void HOWL_API
181 sw_print_assert(
182 		int					code,
183 		sw_const_string	assert_string,
184 		sw_const_string	file,
185 		sw_const_string	func,
186 		int					line);
187 
188 
189 #if !defined(NDEBUG)
190 
191 void HOWL_API
192 sw_print_debug(
193 		int					level,
194 		sw_const_string	format,
195 		...);
196 
197 #	if (__C99_VA_ARGS__)
198 
199 #		define  sw_debug(...)			sw_print_debug(__VA_ARGS__)
200 
201 #	else
202 
203 #		define  sw_debug					sw_print_debug
204 
205 #	endif
206 
207 #else
208 
209 #	if (__C99_VA_ARGS__)
210 
211 #		define  sw_debug(...)
212 
213 #	else
214 
215 #		define  sw_debug					while( 0 )
216 
217 #	endif
218 
219 #endif
220 
221 
222 #define SW_UNUSED_PARAM(X)	(void) (X)
223 
224 
225 #if defined(__cplusplus)
226 }
227 #endif
228 
229 
230 #endif
231