diff options
Diffstat (limited to 'include/net-snmp/library/snmp_assert.h')
-rw-r--r-- | include/net-snmp/library/snmp_assert.h | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/include/net-snmp/library/snmp_assert.h b/include/net-snmp/library/snmp_assert.h new file mode 100644 index 0000000..8f52a69 --- /dev/null +++ b/include/net-snmp/library/snmp_assert.h @@ -0,0 +1,127 @@ +#ifndef SNMP_ASSERT_H +#define SNMP_ASSERT_H + +#ifdef NETSNMP_USE_ASSERT +# include <assert.h> +#else +# include <net-snmp/library/snmp_logging.h> +#endif + + +/* + * MACROs don't need extern "C" + */ + +/* + * define __STRING for systems (*cough* sun *cough*) that don't have it + */ +#ifndef __STRING +# if defined(__STDC__) || defined(_MSC_VER) +# define __STRING(x) #x +# else +# define __STRING(x) "x" +# endif /* __STDC__ */ +#endif /* __STRING */ + +/* + * always use assert if requested + */ +#ifdef NETSNMP_USE_ASSERT +/* void netsnmp_assert( int );*/ +# define netsnmp_assert(x) assert( x ) +# define netsnmp_assert_or_return(x, y) assert( x ) +# define netsnmp_assert_or_msgreturn(x, y, z) assert( x ) +#else +/* + * if asserts weren't requested, just log, unless NETSNMP_NO_DEBUGGING specified + */ +# ifndef NETSNMP_NO_DEBUGGING +# ifdef NETSNMP_FUNCTION +# define NETSNMP_FUNC_FMT " %s()\n" +# define NETSNMP_FUNC_PARAM NETSNMP_FUNCTION +# else +# define NETSNMP_FUNC_FMT "%c" +# define NETSNMP_FUNC_PARAM '\n' +# endif +# +# define netsnmp_assert(x) do { \ + if ( x ) \ + ; \ + else \ + snmp_log(LOG_ERR, \ + "netsnmp_assert %s failed %s:%d" NETSNMP_FUNC_FMT, \ + __STRING(x),__FILE__,__LINE__, \ + NETSNMP_FUNC_PARAM); \ + }while(0) +# define netsnmp_assert_or_return(x, y) do { \ + if ( x ) \ + ; \ + else { \ + snmp_log(LOG_ERR, \ + "netsnmp_assert %s failed %s:%d" NETSNMP_FUNC_FMT, \ + __STRING(x),__FILE__,__LINE__, \ + NETSNMP_FUNC_PARAM); \ + return y; \ + } \ + }while(0) +# define netsnmp_assert_or_msgreturn(x, y, z) do { \ + if ( x ) \ + ; \ + else { \ + snmp_log(LOG_ERR, \ + "netsnmp_assert %s failed %s:%d" NETSNMP_FUNC_FMT, \ + __STRING(x),__FILE__,__LINE__, \ + NETSNMP_FUNC_PARAM); \ + snmp_log(LOG_ERR, y); \ + return z; \ + } \ + }while(0) +# else /* NO DEBUGGING */ +# define netsnmp_assert(x) +# define netsnmp_assert_or_return(x, y) do { \ + if ( x ) \ + ; \ + else { \ + return y; \ + } \ + }while(0) +# define netsnmp_assert_or_msgreturn(x, y, z) do { \ + if ( x ) \ + ; \ + else { \ + return z; \ + } \ + }while(0) +# endif /* NO DEBUGGING */ +#endif /* not NETSNMP_USE_ASSERT */ + + +#define netsnmp_static_assert(x) \ + do { switch(0) { case (x): case 0: ; } } while(0) + + +/* + * EXPERIMENTAL macros. May be removed without warning in future + * releases. Use at your own risk + * + * The series of uppercase letters at or near the end of these macros give + * an indication of what they do. The letters used are: + * + * L : log a message + * RN : return NULL + * RE : return a specific hardcoded error appropriate for the condition + * RV : return user specified value + * + */ +#define netsnmp_malloc_check_LRN(ptr) \ + netsnmp_assert_or_return( (ptr) != NULL, NULL) +#define netsnmp_malloc_check_LRE(ptr) \ + netsnmp_assert_or_return( (ptr) != NULL, SNMPERR_MALLOC) +#define netsnmp_malloc_check_LRV(ptr, val) \ + netsnmp_assert_or_return( (ptr) != NULL, val) + +#define netsnmp_require_ptr_LRV( ptr, val ) \ + netsnmp_assert_or_return( (ptr) != NULL, val) + + +#endif /* SNMP_ASSERT_H */ |