2
* Inkscape::Debug::demangle - demangle C++ symbol names
5
* MenTaLguY <mental@rydia.net>
7
* Copyright (C) 2006 MenTaLguY
9
* Released under GNU GPL, read the file 'COPYING' for more information
15
#include "debug/demangle.h"
16
#include "util/format.h"
25
char const *demangle_helper(char const *name) {
28
FILE *stream=popen(Util::format("c++filt %s", name), "r");
29
if (fgets(buffer, sizeof(buffer), stream)) {
30
size_t len=strlen(buffer);
31
if ( buffer[len-1] == '\n' ) {
32
buffer[len-1] = '\000';
34
result = strdup(buffer);
42
struct string_less_than {
43
bool operator()(char const *a, char const *b) const {
44
return ( strcmp(a, b) < 0 );
48
typedef std::map<char const *, char const *, string_less_than> MangleCache;
49
MangleCache mangle_cache;
53
Util::ptr_shared<char> demangle(char const *name) {
54
MangleCache::iterator found=mangle_cache.find(name);
57
if ( found != mangle_cache.end() ) {
58
result = (*found).second;
60
result = demangle_helper(name);
61
mangle_cache[name] = result;
64
return Util::share_unsafe(result);
74
c-file-style:"stroustrup"
75
c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
80
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :