enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / libs / pbd / debug.cc
index fba457c83eeb256012b2b2f36dfae97a406c8861..419c5bfb379e32ec71fe3bc8511a80834d6db28a 100644 (file)
 
 #include "pbd/debug.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
-static uint64_t _debug_bit = 1;
+using PBD::DebugBits;
 
-typedef std::map<const char*,uint64_t> DebugMap;
+static uint64_t _debug_bit = 0;
+
+typedef std::map<const char*,DebugBits> DebugMap;
 
 namespace PBD {
        DebugMap & _debug_bit_map()
@@ -43,45 +45,68 @@ namespace PBD {
        }
 }
 
-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");
-uint64_t PBD::DEBUG::EventLoop = PBD::new_debug_bit ("eventloop");
-uint64_t PBD::DEBUG::AbstractUI = PBD::new_debug_bit ("abstractui");
-uint64_t PBD::DEBUG::FileUtils = PBD::new_debug_bit ("fileutils");
+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");
+DebugBits PBD::DEBUG::UndoHistory = PBD::new_debug_bit ("undohistory");
+DebugBits PBD::DEBUG::Timing = PBD::new_debug_bit ("timing");
+DebugBits PBD::DEBUG::Threads = PBD::new_debug_bit ("threads");
+DebugBits PBD::DEBUG::Locale = PBD::new_debug_bit ("locale");
+
+/* These are debug bits that are used by backends. Since these are loaded dynamically,
+   after command-line parsing, defining them in code that is part of the backend
+   doesn't make them available for command line parsing. Put them here.
+
+   This is sort of a hack, because it means that the debug bits aren't defined
+   with the code in which they are relevant. But providing access to debug bits
+   from dynamically loaded code, for use in command line parsing, is way above the pay grade
+   of this debug tracing scheme.
+*/
+DebugBits PBD::DEBUG::WavesMIDI = PBD::new_debug_bit ("WavesMIDI");
+DebugBits PBD::DEBUG::WavesAudio = PBD::new_debug_bit ("WavesAudio");
 
-uint64_t PBD::debug_bits = 0x0;
+DebugBits PBD::debug_bits;
 
-uint64_t
+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;
+       DebugMap::iterator i =_debug_bit_map().find (name);
+
+       if (i != _debug_bit_map().end()) {
+               return i->second;
+       }
+
+       if (_debug_bit >= debug_bits.size()) {
+               cerr << "Too many debug bits defined, offender was " << name << endl;
+               abort ();
+               /*NOTREACHED*/
+       }
+
+       ret.set (_debug_bit++, 1);
+       _debug_bit_map().insert (make_pair (name, ret));
         return ret;
 }
 
 void
 PBD::debug_print (const char* prefix, string str)
 {
-       cerr << prefix << ": " << str;
-}
-
-void
-PBD::set_debug_bits (uint64_t bits)
-{
-       debug_bits = bits;
+       cout << prefix << ": " << str;
 }
 
 int
 PBD::parse_debug_options (const char* str)
 {
+       string in_str = str;
        typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
        boost::char_separator<char> sep (",");
-       tokenizer tokens (string(str), sep);
-       uint64_t bits = 0;
+       tokenizer tokens (in_str, sep);
+       DebugBits bits;
 
        for (tokenizer::iterator tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter) {
                if (*tok_iter == "list") {
@@ -90,20 +115,22 @@ PBD::parse_debug_options (const char* str)
                }
 
                if (*tok_iter == "all") {
-                       PBD::set_debug_bits (~0ULL);
+                       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) {
+               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;
+                               bits |= i->second;
+                               cout << i->first << " set ... debug bits now set to " << bits << " using " << i->second << endl;
                         }
                 }
        }
-       
-       PBD::set_debug_bits (bits);
+
+       debug_bits = bits;
+
        return 0;
 }
 
@@ -111,11 +138,11 @@ void
 PBD::list_debug_options ()
 {
        cout << _("The following debug options are available. Separate multiple options with commas.\nNames are case-insensitive and can be abbreviated.") << endl << endl;
-       cout << '\t' << X_("all") << endl; 
+       cout << '\t' << X_("all") << endl;
 
        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);
         }