#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