-/* $Id$
-
-This file is part of libmspcore
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
+#include <cstdlib>
+#ifdef __GNUC__
+#include <cxxabi.h>
+#endif
#include "demangle.h"
using namespace std;
namespace Msp {
namespace Debug {
-string demangle_gcc3(const string &sym)
+string demangle(const string &sym)
{
+#ifdef __GNUC__
+ int status;
+ char *dm = abi::__cxa_demangle(sym.c_str(), 0, 0, &status);
+
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;
- }
+ if(status==0)
+ result = dm;
+ else
+ result = sym;
+
+ free(dm);
+
+ return result;
+#else
+ return sym;
+#endif
}
} // namespace Debug