#ifndef _salt_debug_h #define _salt_debug_h /* * Copyright 2003, 2004 Porchdog Software. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY PORCHDOG SOFTWARE ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE HOWL PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those * of the authors and should not be interpreted as representing official policies, * either expressed or implied, of Porchdog Software. */ #include <salt/platform.h> #include <stdarg.h> #ifdef __cplusplus extern "C" { #endif #define SW_LOG_WARNING 1 << 0 #define SW_LOG_ERROR 1 << 1 #define SW_LOG_NOTICE 1 << 2 #define SW_LOG_VERBOSE 1 << 3 #define SW_LOG_OFF 0x0 #if (defined( __GNUC__)) # if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3))) # define __C99_VA_ARGS__ 1 # define __GNU_VA_ARGS__ 0 # else # define __C99_VA_ARGS__ 0 # define __GNU_VA_ARGS__ 1 # endif #else # define __C99_VA_ARGS__ 0 # define __GNU_VA_ARGS__ 0 #endif # if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9))) # define __SW_FUNCTION__ __func__ #elif (defined( __GNUC__)) # define __SW_FUNCTION__ __PRETTY_FUNCTION__ #elif( defined(_MSC_VER ) && !defined(_WIN32_WCE)) # define __SW_FUNCTION__ __FUNCTION__ #else # define __SW_FUNCTION__ "" #endif #define sw_check(expr, label, action) \ do \ { \ if (!(expr)) \ { \ { \ action; \ } \ goto label; \ } \ } while (0) #define sw_check_log(expr, label, action) \ do \ { \ if (!(expr)) \ { \ sw_print_assert(0, NULL, __FILE__, __SW_FUNCTION__, __LINE__); \ { \ action; \ } \ goto label; \ } \ } while (0) #define sw_check_okay(code, label) \ do \ { \ if ((int) code != 0) \ { \ goto label; \ } \ } while (0) #define sw_check_okay_log(code, label) \ do \ { \ if ((int) code != 0) \ { \ sw_print_assert((int) code, NULL, __FILE__, __SW_FUNCTION__, __LINE__); \ goto label; \ } \ } while ( 0 ) #define sw_translate_error(expr, errno) ((expr) ? 0 : (errno)) #if defined(WIN32) # define sw_socket_errno() (int) WSAGetLastError() # define sw_set_socket_errno(X) WSASetLastError(X) # define sw_system_errno() (int) GetLastError() # define sw_set_system_errno(X) SetLastError(X) #else # define sw_socket_errno() errno # define sw_set_socket_errno(X) errno = X # define sw_system_errno() errno # define sw_set_system_errno(X) errno = X #endif #if !defined(NDEBUG) # define sw_assert(X) \ \ do \ { \ if (!(X)) \ { \ sw_print_assert( 0, #X, __FILE__, __SW_FUNCTION__, __LINE__); \ } \ } while( 0 ) #else # define sw_assert(X) #endif void HOWL_API sw_print_assert( int code, sw_const_string assert_string, sw_const_string file, sw_const_string func, int line); #if !defined(NDEBUG) void HOWL_API sw_print_debug( int level, sw_const_string format, ...); # if (__C99_VA_ARGS__) # define sw_debug(...) sw_print_debug(__VA_ARGS__) # else # define sw_debug sw_print_debug # endif #else # if (__C99_VA_ARGS__) # define sw_debug(...) # else # define sw_debug while( 0 ) # endif #endif #define SW_UNUSED_PARAM(X) (void) (X) #if defined(__cplusplus) } #endif #endif