#ifndef SNMP_ASSERT_H #define SNMP_ASSERT_H #ifdef NETSNMP_USE_ASSERT # include #else # include #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 */