tizen 2.0
[external/ltrace.git] / demangle.c
1 #include "config.h"
2
3 #include <string.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6
7 #include "common.h"
8
9 #ifdef USE_DEMANGLE
10
11 /*****************************************************************************/
12
13 static Dict *d = NULL;
14
15 const char *
16 my_demangle(const char *function_name) {
17         const char *tmp, *fn_copy;
18 #if !defined HAVE_LIBIBERTY && defined HAVE_LIBSUPC__
19         extern char *__cxa_demangle(const char *, char *, size_t *, int *);
20         int status = 0;
21 #endif
22
23         debug(DEBUG_FUNCTION, "my_demangle(name=%s)", function_name);
24
25         if (!d)
26                 d = dict_init(dict_key2hash_string, dict_key_cmp_string);
27
28         tmp = dict_find_entry(d, (void *)function_name);
29         if (!tmp) {
30                 fn_copy = strdup(function_name);
31 #ifdef HAVE_LIBIBERTY
32                 tmp = cplus_demangle(function_name, DMGL_ANSI | DMGL_PARAMS);
33 #elif defined HAVE_LIBSUPC__
34                 tmp = __cxa_demangle(function_name, NULL, NULL, &status);
35 #endif
36                 if (!tmp)
37                         tmp = fn_copy;
38                 if (tmp)
39                         dict_enter(d, (void *)fn_copy, (void *)tmp);
40         }
41         return tmp;
42 }
43
44 #endif