summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2004-08-10 18:01:17 -0400
committerJohn Wiegley <johnw@newartisans.com>2004-08-10 18:01:17 -0400
commit8792945e76277cea96c13444fa5e4cad7f3ce6ee (patch)
tree8d689d3f2ca97e83384a61edd427e48098070db2
parent7a1d0d46146ecdb79a156ea1197bc3f1bd30cb95 (diff)
downloadfork-ledger-8792945e76277cea96c13444fa5e4cad7f3ce6ee.tar.gz
fork-ledger-8792945e76277cea96c13444fa5e4cad7f3ce6ee.tar.bz2
fork-ledger-8792945e76277cea96c13444fa5e4cad7f3ce6ee.zip
added debug code
-rw-r--r--debug.cc23
-rw-r--r--debug.h123
2 files changed, 146 insertions, 0 deletions
diff --git a/debug.cc b/debug.cc
new file mode 100644
index 00000000..428d5a4d
--- /dev/null
+++ b/debug.cc
@@ -0,0 +1,23 @@
+#include "debug.h"
+
+#ifdef DEBUG_ENABLED
+
+namespace ledger {
+
+std::ostream * debug_stream = &std::cerr;
+bool free_debug_stream = false;
+
+static class free_streams
+{
+ public:
+ ~free_streams() {
+ if (free_debug_stream && debug_stream) {
+ delete debug_stream;
+ debug_stream = NULL;
+ }
+ }
+} _debug_cleanup;
+
+} // namespace ledger
+
+#endif DEBUG_ENABLED
diff --git a/debug.h b/debug.h
new file mode 100644
index 00000000..090d5830
--- /dev/null
+++ b/debug.h
@@ -0,0 +1,123 @@
+#ifndef _DEBUG_H
+#define _DEBUG_H
+
+#define DEVELOPER 4
+#define ALPHA 3
+#define BETA 2
+#define RELEASE 1
+#define NO_SEATBELT 0
+
+#ifndef RELEASE_LEVEL
+#define RELEASE_LEVEL RELEASE
+#endif
+
+#if RELEASE_LEVEL >= ALPHA
+#include <cstdlib> // for `getenv'
+#include <cstring> // for `strcmp'
+#endif
+
+#if RELEASE_LEVEL >= BETA
+#include <cassert>
+#endif
+
+#if RELEASE_LEVEL >= RELEASE
+#include <iostream>
+#endif
+
+#include <sstream> // used for constructing exceptions
+
+namespace ledger {
+
+//////////////////////////////////////////////////////////////////////
+//
+// Debugging facilities for Ledger
+//
+// - In developer level, all checking and debugging facilities are
+// active.
+//
+// - Alpha level does not include performance degrading
+// VALIDATE calls.
+//
+// - Beta level is like Alpha, but does not include debugging
+// facilities.
+//
+// - Release level does not include CONFIRM checks, but does include
+// assert calls.
+//
+// - Running with no seatbelt disables all checking except for normal
+// syntax and semantic error checking.
+
+#define WARN(x) \
+ if (ledger::warning_stream) \
+ *ledger::warning_stream << "Warning: "<< x << std::endl
+
+#define ERR(exc, x) { \
+ std::ostringstream s; \
+ s << x; \
+ throw exc(s.str().c_str()); \
+ }
+
+#if RELEASE_LEVEL >= ALPHA
+
+#define DEBUG_ENABLED
+
+extern std::ostream * warning_stream;
+extern std::ostream * debug_stream;
+extern bool free_debug_stream;
+
+inline bool _debug_active(const char * const cls) {
+ char * debug = std::getenv("DEBUG_CLASS");
+ return debug && std::strcmp(debug, cls) == 0;
+}
+
+#define DEBUG_CLASS(cls) static const char * const _debug_cls = (cls)
+
+#define DEBUG(cls) (ledger::_debug_active(cls))
+#define DEBUG_() DEBUG(_debug_cls)
+
+#define DEBUG_PRINT(cls, x) \
+ if (ledger::debug_stream && ledger::_debug_active(cls)) { \
+ *ledger::debug_stream << x << std::endl; \
+ }
+#define DEBUG_PRINT_(x) DEBUG_PRINT(_debug_cls, x)
+
+#define CONFIRM(x) assert(x)
+
+#if RELEASE_LEVEL == DEVELOPER
+#define VALIDATE(x) assert(x)
+#else
+#define VALIDATE(x)
+#endif
+
+#else // RELEASE_LEVEL
+
+#define DEBUG_CLASS(cls)
+#define DEBUG(cls) 0
+#define DEBUG_() 0
+#define DEBUG_PRINT(cls, x)
+#define DEBUG_PRINT_(x)
+
+#define VALIDATE(x)
+
+#if RELEASE_LEVEL == NO_SEATBELT
+
+#undef assert
+#define assert(x)
+#define CONFIRM(x)
+
+#elif RELEASE_LEVEL >= RELEASE
+
+extern std::ostream * warning_stream;
+#define CONFIRM(x)
+
+#elif RELEASE_LEVEL >= BETA
+
+#define CONFIRM(x) assert(x)
+
+#endif
+
+#endif // RELEASE_LEVEL
+
+} // namespace ledger
+
+#endif // _DEBUG_H