summaryrefslogtreecommitdiff
path: root/src/compat/nullpo.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/compat/nullpo.hpp')
-rw-r--r--src/compat/nullpo.hpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/compat/nullpo.hpp b/src/compat/nullpo.hpp
new file mode 100644
index 0000000..6eca4b6
--- /dev/null
+++ b/src/compat/nullpo.hpp
@@ -0,0 +1,41 @@
+/// return wrappers for unexpected NULL pointers
+#ifndef TMWA_COMPAT_NULLPO_HPP
+#define TMWA_COMPAT_NULLPO_HPP
+/// Uncomment this to live dangerously
+/// (really exist to detect mostly-unused variables)
+//# define BUG_FREE
+
+/// All functions print to standard error (was: standard output)
+/// nullpo_ret(cond) - return 0 if given pointer is NULL
+/// nullpo_retv(cond) - just return (function returns void)
+/// nullpo_retr(rv, cond) - return given value instead
+
+# ifndef BUG_FREE
+# define nullpo_retr(ret, t) \
+ if (nullpo_chk(__FILE__, __LINE__, __PRETTY_FUNCTION__, t)) \
+ return ret;
+# else // BUG_FREE
+# define nullpo_retr(ret, t) /*t*/
+# endif // BUG_FREE
+
+# define nullpo_ret(t) nullpo_retr(0, t)
+# define nullpo_retv(t) nullpo_retr(, t)
+
+# include "../sanity.hpp"
+
+/// Used by macros in this header
+bool nullpo_chk(const char *file, int line, const char *func,
+ const void *target);
+
+template<class T>
+bool nullpo_chk(const char *file, int line, const char *func, T target)
+{
+ return nullpo_chk(file, line, func, target.operator->());
+}
+template<class T>
+bool nullpo_chk(const char *file, int line, const char *func, T *target)
+{
+ return nullpo_chk(file, line, func, static_cast<const void *>(target));
+}
+
+#endif // TMWA_COMPAT_NULLPO_HPP