summaryrefslogtreecommitdiff
path: root/include/net-snmp/library/snmp_assert.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/net-snmp/library/snmp_assert.h')
-rw-r--r--include/net-snmp/library/snmp_assert.h127
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 */