-////////////////////////////////////////////////////////////////////////////////\r
-\r
-// Author: Andy Rushton\r
-// Copyright: (c) Southampton University 1999-2004\r
-// (c) Andy Rushton 2004-2009\r
-// License: BSD License, see ../docs/license.html\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
-#include "debug.hpp"\r
-#include "dprintf.hpp"\r
-#include <string.h>\r
-#include <stdlib.h>\r
-#include <stdio.h>\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
-namespace stlplus\r
-{\r
-\r
- ////////////////////////////////////////////////////////////////////////////////\r
-\r
- static std::string format(const char* file, int line, const char* function, const char* message)\r
- {\r
- return dformat("%s:%d:%s: assertion failed: %s",\r
- (file ? file : ""),\r
- line,\r
- (function ? function : "") ,\r
- (message ? message : ""));\r
- }\r
-\r
- ////////////////////////////////////////////////////////////////////////////////\r
-\r
- assert_failed::assert_failed(const char* file, int line, const char* function, const char* message)\r
- throw() : \r
- std::logic_error(format(file, line, function, message))\r
- {\r
- }\r
-\r
- assert_failed::~assert_failed(void) throw()\r
- {\r
- }\r
-\r
- ////////////////////////////////////////////////////////////////////////////////\r
-\r
- static unsigned _debug_depth = 0;\r
- static bool _debug_global = false;\r
- static bool _debug_set = false;\r
- static bool _debug_recurse = false;\r
- static bool _debug_read = false;\r
- static char* _debug_match = 0;\r
- static const debug_trace* debug_last = 0;\r
-\r
- void debug_global(const char* file, int line, const char* function, bool state)\r
- {\r
- _debug_global = state;\r
- fprintf(stderr, "%s:%i:[%i]%s ", file, line, _debug_depth, function ? function : "");\r
- fprintf(stderr, "debug global : %s\n", _debug_global ? "on" : "off");\r
- }\r
-\r
- void debug_assert_fail(const char* file, int line, const char* function, const char* test) \r
- throw(assert_failed)\r
- {\r
- fprintf(stderr, "%s:%i:[%i]%s: assertion failed: %s\n", \r
- file, line, _debug_depth, function ? function : "", test);\r
- if (debug_last) debug_last->stackdump();\r
- throw assert_failed(file, line, function, test);\r
- }\r
-\r
- ////////////////////////////////////////////////////////////////////////////////\r
-\r
- debug_trace::debug_trace(const char* f, int l, const char* fn) :\r
- m_file(f), m_line(l), m_function(fn ? fn : ""), \r
- m_depth(0), m_last(debug_last), m_dbg(false), m_old(false)\r
- {\r
- if (!_debug_read)\r
- {\r
- _debug_match = getenv("DEBUG");\r
- _debug_recurse = getenv("DEBUG_LOCAL") == 0;\r
- _debug_read = true;\r
- }\r
- m_dbg = _debug_set || (_debug_match && (!_debug_match[0] || (strcmp(_debug_match, m_file) == 0)));\r
- m_old = _debug_set;\r
- if (m_dbg && _debug_recurse)\r
- _debug_set = true;\r
- m_depth = ++_debug_depth;\r
- debug_last = this;\r
- if (debug()) report(std::string("entering ") + (m_function ? m_function : ""));\r
- }\r
-\r
- debug_trace::~debug_trace(void)\r
- {\r
- if (debug()) report("leaving");\r
- --_debug_depth;\r
- _debug_set = m_old;\r
- debug_last = m_last;\r
- }\r
-\r
- const char* debug_trace::file(void) const\r
- {\r
- return m_file;\r
- }\r
-\r
- int debug_trace::line(void) const\r
- {\r
- return m_line;\r
- }\r
-\r
- bool debug_trace::debug(void) const\r
- {\r
- return m_dbg || _debug_global;\r
- }\r
-\r
- void debug_trace::debug_on(int l, bool recurse)\r
- {\r
- m_dbg = true;\r
- m_old = _debug_set;\r
- if (recurse)\r
- _debug_set = true;\r
- report(l, std::string("debug on") + (recurse ? " recursive" : ""));\r
- }\r
-\r
- void debug_trace::debug_off(int l)\r
- {\r
- if (debug()) report(l, std::string("debug off"));\r
- m_dbg = false;\r
- _debug_set = m_old;\r
- }\r
-\r
- void debug_trace::prefix(int l) const\r
- {\r
- fprintf(stderr, "%s:%i:[%i]%s ", m_file, l, m_depth, m_function ? m_function : "");\r
- }\r
-\r
- void debug_trace::do_report(int l, const std::string& message) const\r
- {\r
- prefix(l);\r
- fprintf(stderr, "%s\n", message.c_str());\r
- fflush(stderr);\r
- }\r
-\r
- void debug_trace::do_report(const std::string& message) const\r
- {\r
- do_report(m_line, message);\r
- }\r
-\r
- void debug_trace::report(int l, const std::string& message) const\r
- {\r
- do_report(l, message);\r
- }\r
-\r
- void debug_trace::report(const std::string& message) const\r
- {\r
- report(m_line, message);\r
- }\r
-\r
- void debug_trace::error(int l, const std::string& message) const\r
- {\r
- do_report(l, "ERROR: " + message);\r
- }\r
-\r
- void debug_trace::error(const std::string& message) const\r
- {\r
- error(m_line, message);\r
- }\r
-\r
- void debug_trace::stackdump(int l, const std::string& message) const\r
- {\r
- do_report(l, message);\r
- stackdump();\r
- }\r
-\r
- void debug_trace::stackdump(const std::string& message) const\r
- {\r
- stackdump(m_line, message);\r
- }\r
-\r
- void debug_trace::stackdump(void) const\r
- {\r
- for (const debug_trace* item = this; item; item = item->m_last)\r
- item->do_report("...called from here");\r
- }\r
-\r
-\r
- ////////////////////////////////////////////////////////////////////////////////\r
-\r
-} // end namespace stlplus\r
+////////////////////////////////////////////////////////////////////////////////
+
+// Author: Andy Rushton
+// Copyright: (c) Southampton University 1999-2004
+// (c) Andy Rushton 2004-2009
+// License: BSD License, see ../docs/license.html
+
+////////////////////////////////////////////////////////////////////////////////
+
+#include "debug.hpp"
+#include "dprintf.hpp"
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace stlplus
+{
+
+ ////////////////////////////////////////////////////////////////////////////////
+
+ static std::string format(const char* file, int line, const char* function, const char* message)
+ {
+ return dformat("%s:%d:%s: assertion failed: %s",
+ (file ? file : ""),
+ line,
+ (function ? function : "") ,
+ (message ? message : ""));
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+
+ assert_failed::assert_failed(const char* file, int line, const char* function, const char* message)
+ throw() :
+ std::logic_error(format(file, line, function, message))
+ {
+ }
+
+ assert_failed::~assert_failed(void) throw()
+ {
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+
+ static unsigned _debug_depth = 0;
+ static bool _debug_global = false;
+ static bool _debug_set = false;
+ static bool _debug_recurse = false;
+ static bool _debug_read = false;
+ static char* _debug_match = 0;
+ static const debug_trace* debug_last = 0;
+
+ void debug_global(const char* file, int line, const char* function, bool state)
+ {
+ _debug_global = state;
+ fprintf(stderr, "%s:%i:[%i]%s ", file, line, _debug_depth, function ? function : "");
+ fprintf(stderr, "debug global : %s\n", _debug_global ? "on" : "off");
+ }
+
+ void debug_assert_fail(const char* file, int line, const char* function, const char* test)
+ throw(assert_failed)
+ {
+ fprintf(stderr, "%s:%i:[%i]%s: assertion failed: %s\n",
+ file, line, _debug_depth, function ? function : "", test);
+ if (debug_last) debug_last->stackdump();
+ throw assert_failed(file, line, function, test);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+
+ debug_trace::debug_trace(const char* f, int l, const char* fn) :
+ m_file(f), m_line(l), m_function(fn ? fn : ""),
+ m_depth(0), m_last(debug_last), m_dbg(false), m_old(false)
+ {
+ if (!_debug_read)
+ {
+ _debug_match = getenv("DEBUG");
+ _debug_recurse = getenv("DEBUG_LOCAL") == 0;
+ _debug_read = true;
+ }
+ m_dbg = _debug_set || (_debug_match && (!_debug_match[0] || (strcmp(_debug_match, m_file) == 0)));
+ m_old = _debug_set;
+ if (m_dbg && _debug_recurse)
+ _debug_set = true;
+ m_depth = ++_debug_depth;
+ debug_last = this;
+ if (debug()) report(std::string("entering ") + (m_function ? m_function : ""));
+ }
+
+ debug_trace::~debug_trace(void)
+ {
+ if (debug()) report("leaving");
+ --_debug_depth;
+ _debug_set = m_old;
+ debug_last = m_last;
+ }
+
+ const char* debug_trace::file(void) const
+ {
+ return m_file;
+ }
+
+ int debug_trace::line(void) const
+ {
+ return m_line;
+ }
+
+ bool debug_trace::debug(void) const
+ {
+ return m_dbg || _debug_global;
+ }
+
+ void debug_trace::debug_on(int l, bool recurse)
+ {
+ m_dbg = true;
+ m_old = _debug_set;
+ if (recurse)
+ _debug_set = true;
+ report(l, std::string("debug on") + (recurse ? " recursive" : ""));
+ }
+
+ void debug_trace::debug_off(int l)
+ {
+ if (debug()) report(l, std::string("debug off"));
+ m_dbg = false;
+ _debug_set = m_old;
+ }
+
+ void debug_trace::prefix(int l) const
+ {
+ fprintf(stderr, "%s:%i:[%i]%s ", m_file, l, m_depth, m_function ? m_function : "");
+ }
+
+ void debug_trace::do_report(int l, const std::string& message) const
+ {
+ prefix(l);
+ fprintf(stderr, "%s\n", message.c_str());
+ fflush(stderr);
+ }
+
+ void debug_trace::do_report(const std::string& message) const
+ {
+ do_report(m_line, message);
+ }
+
+ void debug_trace::report(int l, const std::string& message) const
+ {
+ do_report(l, message);
+ }
+
+ void debug_trace::report(const std::string& message) const
+ {
+ report(m_line, message);
+ }
+
+ void debug_trace::error(int l, const std::string& message) const
+ {
+ do_report(l, "ERROR: " + message);
+ }
+
+ void debug_trace::error(const std::string& message) const
+ {
+ error(m_line, message);
+ }
+
+ void debug_trace::stackdump(int l, const std::string& message) const
+ {
+ do_report(l, message);
+ stackdump();
+ }
+
+ void debug_trace::stackdump(const std::string& message) const
+ {
+ stackdump(m_line, message);
+ }
+
+ void debug_trace::stackdump(void) const
+ {
+ for (const debug_trace* item = this; item; item = item->m_last)
+ item->do_report("...called from here");
+ }
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+
+} // end namespace stlplus