merge in Tracks-derived session-end-is-N-seconds beyond last region end, but define...
[ardour.git] / libs / pbd / debug.cc
index 0a2c1b0d72d85c021d7a85ab0ccc28e61a3dfb05..25ebb64850e58771a0aa3101114871c903495e71 100644 (file)
 #include <vector>
 #include <algorithm>
 
+#include <boost/tokenizer.hpp>
+
 #include "pbd/debug.h"
 
 #include "i18n.h"
 
 using namespace std;
-static uint64_t _debug_bit = 1;
-static std::map<const char*,uint64_t> _debug_bit_map;
+using PBD::DebugBits;
+
+static uint64_t _debug_bit = 0;
+
+typedef std::map<const char*,DebugBits> DebugMap;
 
-uint64_t PBD::DEBUG::Stateful = PBD::new_debug_bit ("stateful");
-uint64_t PBD::DEBUG::Properties = PBD::new_debug_bit ("properties");
-uint64_t PBD::DEBUG::FileManager = PBD::new_debug_bit ("filemanager");
-uint64_t PBD::DEBUG::Pool = PBD::new_debug_bit ("pool");
+namespace PBD {
+       DebugMap & _debug_bit_map()
+       {
+               static DebugMap map;
+               return map;
+       }
+}
 
-uint64_t PBD::debug_bits = 0x0;
+DebugBits PBD::DEBUG::Stateful = PBD::new_debug_bit ("stateful");
+DebugBits PBD::DEBUG::Properties = PBD::new_debug_bit ("properties");
+DebugBits PBD::DEBUG::FileManager = PBD::new_debug_bit ("filemanager");
+DebugBits PBD::DEBUG::Pool = PBD::new_debug_bit ("pool");
+DebugBits PBD::DEBUG::EventLoop = PBD::new_debug_bit ("eventloop");
+DebugBits PBD::DEBUG::AbstractUI = PBD::new_debug_bit ("abstractui");
+DebugBits PBD::DEBUG::FileUtils = PBD::new_debug_bit ("fileutils");
+DebugBits PBD::DEBUG::Configuration = PBD::new_debug_bit ("configuration");
 
-uint64_t
+DebugBits PBD::debug_bits;
+
+DebugBits
 PBD::new_debug_bit (const char* name)
 {
-        uint64_t ret;
-        _debug_bit_map.insert (make_pair (name, _debug_bit));
-        ret = _debug_bit;
-        _debug_bit <<= 1;
+        DebugBits ret;
+        ret.set (_debug_bit++, 1);
+        _debug_bit_map().insert (make_pair (name, ret));
         return ret;
 }
 
@@ -55,46 +71,38 @@ PBD::debug_print (const char* prefix, string str)
        cerr << prefix << ": " << str;
 }
 
-void
-PBD::set_debug_bits (uint64_t bits)
-{
-       debug_bits = bits;
-}
-
 int
 PBD::parse_debug_options (const char* str)
 {
-       char* p;
-       char* sp;
-       uint64_t bits = 0;
-       char* copy = strdup (str);
-
-       p = strtok_r (copy, ",", &sp);
-
-       while (p) {
-               if (strcasecmp (p, "list") == 0) {
+       string in_str = str;
+       typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+       boost::char_separator<char> sep (",");
+       tokenizer tokens (in_str, sep);
+       DebugBits bits;
+
+       for (tokenizer::iterator tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter) {
+               if (*tok_iter == "list") {
                        list_debug_options ();
-                       free (copy);
                        return 1;
                }
 
-               if (strcasecmp (p, "all") == 0) {
-                       PBD::set_debug_bits (~0ULL);
-                       free (copy);
+               if (*tok_iter == "all") {
+                       debug_bits.set (); /* sets all bits */
                        return 0;
                }
 
-                for (map<const char*,uint64_t>::iterator i = _debug_bit_map.begin(); i != _debug_bit_map.end(); ++i) {
-                        if (strncasecmp (p, i->first, strlen (p)) == 0) {
-                                bits |= i->second;
+               for (map<const char*,DebugBits>::iterator i = _debug_bit_map().begin(); i != _debug_bit_map().end(); ++i) {
+                       const char* cstr = (*tok_iter).c_str();
+
+                        if (strncasecmp (cstr, i->first, strlen (cstr)) == 0) {
+                               bits |= i->second;
+                               cerr << i->first << " set ... debug bits now set to " << bits << " using " << i->second << endl;
                         }
                 }
-
-               p = strtok_r (0, ",", &sp);
        }
        
-       free (copy);
-       PBD::set_debug_bits (bits);
+       debug_bits = bits;
+       
        return 0;
 }
 
@@ -106,7 +114,7 @@ PBD::list_debug_options ()
 
        vector<string> options;
 
-        for (map<const char*,uint64_t>::iterator i = _debug_bit_map.begin(); i != _debug_bit_map.end(); ++i) {
+       for (map<const char*,DebugBits>::iterator i = _debug_bit_map().begin(); i != _debug_bit_map().end(); ++i) {
                options.push_back (i->first);
         }