1/* demangle.c -- A wrapper calling libiberty cplus_demangle 2 Copyright 2002, 2003 Free Software Foundation, Inc. 3 4 This file is part of GNU Binutils. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 19 02111-1307, USA. */ 20 21#include "config.h" 22#include <stdlib.h> 23#ifdef HAVE_STRING_H 24#include <string.h> 25#else 26#ifdef HAVE_STRINGS_H 27#include <strings.h> 28#endif 29#endif 30#include "bfd.h" 31#include "libiberty.h" 32#include "demangle.h" 33#include "budemang.h" 34 35/* Wrapper around cplus_demangle. Strips leading underscores and 36 other such chars that would otherwise confuse the demangler. */ 37 38char * 39demangle (bfd *abfd, const char *name) 40{ 41 char *res; 42 const char *p; 43 44 if (abfd != NULL && bfd_get_symbol_leading_char (abfd) == name[0]) 45 ++name; 46 47 /* This is a hack for better error reporting on XCOFF, PowerPC64-ELF 48 or the MS PE format. These formats have a number of leading '.'s 49 on at least some symbols, so we remove all dots to avoid 50 confusing the demangler. */ 51 p = name; 52 while (*p == '.') 53 ++p; 54 55 res = cplus_demangle (p, DMGL_ANSI | DMGL_PARAMS); 56 if (res) 57 { 58 size_t dots = p - name; 59 60 /* Now put back any stripped dots. */ 61 if (dots != 0) 62 { 63 size_t len = strlen (res) + 1; 64 char *add_dots = xmalloc (len + dots); 65 66 memcpy (add_dots, name, dots); 67 memcpy (add_dots + dots, res, len); 68 free (res); 69 res = add_dots; 70 } 71 return res; 72 } 73 74 return xstrdup (name); 75} 76