-////////////////////////////////////////////////////////////////////////////////
-
-// 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
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+// Author: Andy Rushton\r
+// Copyright: (c) Southampton University 1999-2004\r
+// (c) Andy Rushton 2004 onwards\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