]> git.tdb.fi Git - libs/core.git/blobdiff - source/debug/demangle.cpp
Assimilate exceptions and RefPtr from mspmisc
[libs/core.git] / source / debug / demangle.cpp
diff --git a/source/debug/demangle.cpp b/source/debug/demangle.cpp
new file mode 100644 (file)
index 0000000..58e05ce
--- /dev/null
@@ -0,0 +1,50 @@
+/* $Id$
+
+This file is part of libmspcore
+Copyright © 2007 Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+#include "demangle.h"
+
+using namespace std;
+
+namespace Msp {
+namespace Debug {
+
+string demangle_gcc3(const string &sym)
+{
+       string result;
+
+       if(sym.compare(0, 2, "_Z"))
+               return result;
+
+       string::const_iterator i=sym.begin()+2;
+
+       bool nested=(*i=='N');
+       bool first=true;
+       while(first || (nested && *i!='E'))
+       {
+               unsigned len=0;
+               for(; isdigit(*i); ++i)
+                       len=len*10+(*i-'0');
+               string::const_iterator j=i+len;
+
+               if(!first)
+                       result.append("::");
+               result.append(i, j);
+
+               first=false;
+       }
+
+       if(nested)
+               ++i;
+
+       for(; i!=sym.end(); ++i)
+       {
+               bool ref=(*i=='R');
+               if(ref) ++i;
+       }
+}
+
+} // namespace Debug
+} // namespace Msp