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