00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "libiberty.h"
00030 #include "demangle.h"
00031 #include "getopt.h"
00032 #include "safe-ctype.h"
00033 #include <stdio.h>
00034 #include <stdlib.h>
00035 #include <string.h>
00036
00037 #ifndef TARGET_PREPENDS_UNDERSCORE
00038 #define TARGET_PREPENDS_UNDERSCORE 0
00039 #endif
00040
00041 char *program_name;
00042
00043 void
00044 print_version (name)
00045 const char *name;
00046 {
00047
00048
00049 printf ("GNU %s %s\n", name, "3.3");
00050 printf ("Copyright 2002 Free Software Foundation, Inc.\n");
00051 printf ("\
00052 This program is free software; you may redistribute it under the terms of\n\
00053 the GNU General Public License. This program has absolutely no warranty.\n");
00054 exit (0);
00055 }
00056
00057 static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
00058
00059 static void demangle_it PARAMS ((char *));
00060 static void usage PARAMS ((FILE *, int)) ATTRIBUTE_NORETURN;
00061 static void print_demangler_list PARAMS ((FILE *));
00062
00063 static void
00064 demangle_it (mangled_name)
00065 char *mangled_name;
00066 {
00067 char *result;
00068
00069
00070 result = cplus_demangle (mangled_name, flags | DMGL_TYPES);
00071 if (result == NULL)
00072 {
00073 printf ("%s\n", mangled_name);
00074 }
00075 else
00076 {
00077 printf ("%s\n", result);
00078 free (result);
00079 }
00080 }
00081
00082 static void
00083 print_demangler_list (stream)
00084 FILE *stream;
00085 {
00086 const struct demangler_engine *demangler;
00087
00088 fprintf (stream, "{%s", libiberty_demanglers->demangling_style_name);
00089
00090 for (demangler = libiberty_demanglers + 1;
00091 demangler->demangling_style != unknown_demangling;
00092 ++demangler)
00093 fprintf (stream, ",%s", demangler->demangling_style_name);
00094
00095 fprintf (stream, "}");
00096 }
00097
00098 static void
00099 usage (stream, status)
00100 FILE *stream;
00101 int status;
00102 {
00103 fprintf (stream, "\
00104 Usage: %s [-_] [-n] [--strip-underscores] [--no-strip-underscores] \n",
00105 program_name);
00106
00107 fprintf (stream, "\
00108 [-s ");
00109 print_demangler_list (stream);
00110 fprintf (stream, "]\n");
00111
00112 fprintf (stream, "\
00113 [--format ");
00114 print_demangler_list (stream);
00115 fprintf (stream, "]\n");
00116
00117 fprintf (stream, "\
00118 [--help] [--version] [arg...]\n");
00119 exit (status);
00120 }
00121
00122 #define MBUF_SIZE 32767
00123 char mbuffer[MBUF_SIZE];
00124
00125 int strip_underscore = 0;
00126
00127 static const struct option long_options[] = {
00128 {"strip-underscores", no_argument, 0, '_'},
00129 {"format", required_argument, 0, 's'},
00130 {"help", no_argument, 0, 'h'},
00131 {"no-strip-underscores", no_argument, 0, 'n'},
00132 {"version", no_argument, 0, 'v'},
00133 {0, no_argument, 0, 0}
00134 };
00135
00136 static const char *
00137 standard_symbol_characters PARAMS ((void));
00138
00139 static const char *
00140 hp_symbol_characters PARAMS ((void));
00141
00142
00143
00144
00145
00146 static const char *
00147 standard_symbol_characters ()
00148 {
00149 return "_$.";
00150 }
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 static const char *
00184 hp_symbol_characters ()
00185 {
00186 return "_$.<>#,*&[]:(){}";
00187 }
00188
00189 extern int main PARAMS ((int, char **));
00190
00191 int
00192 main (argc, argv)
00193 int argc;
00194 char **argv;
00195 {
00196 char *result;
00197 int c;
00198 const char *valid_symbols;
00199 enum demangling_styles style = auto_demangling;
00200
00201 program_name = argv[0];
00202 xmalloc_set_program_name (program_name);
00203
00204 strip_underscore = TARGET_PREPENDS_UNDERSCORE;
00205
00206 while ((c = getopt_long (argc, argv, "_ns:", long_options, (int *) 0)) != EOF)
00207 {
00208 switch (c)
00209 {
00210 case '?':
00211 usage (stderr, 1);
00212 break;
00213 case 'h':
00214 usage (stdout, 0);
00215 case 'n':
00216 strip_underscore = 0;
00217 break;
00218 case 'v':
00219 print_version ("c++filt");
00220 return (0);
00221 case '_':
00222 strip_underscore = 1;
00223 break;
00224 case 's':
00225 {
00226 style = cplus_demangle_name_to_style (optarg);
00227 if (style == unknown_demangling)
00228 {
00229 fprintf (stderr, "%s: unknown demangling style `%s'\n",
00230 program_name, optarg);
00231 return (1);
00232 }
00233 else
00234 cplus_demangle_set_style (style);
00235 }
00236 break;
00237 }
00238 }
00239
00240 if (optind < argc)
00241 {
00242 for ( ; optind < argc; optind++)
00243 {
00244 demangle_it (argv[optind]);
00245 }
00246 }
00247 else
00248 {
00249 switch (current_demangling_style)
00250 {
00251 case gnu_demangling:
00252 case lucid_demangling:
00253 case arm_demangling:
00254 case java_demangling:
00255 case edg_demangling:
00256 case gnat_demangling:
00257 case gnu_v3_demangling:
00258 case auto_demangling:
00259 valid_symbols = standard_symbol_characters ();
00260 break;
00261 case hp_demangling:
00262 valid_symbols = hp_symbol_characters ();
00263 break;
00264 default:
00265
00266
00267
00268 fprintf (stderr, "Internal error: no symbol alphabet for current style");
00269 exit (1);
00270 }
00271
00272 for (;;)
00273 {
00274 int i = 0;
00275 c = getchar ();
00276
00277 while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c)))
00278 {
00279 if (i >= MBUF_SIZE-1)
00280 break;
00281 mbuffer[i++] = c;
00282 c = getchar ();
00283 }
00284 if (i > 0)
00285 {
00286 int skip_first = 0;
00287
00288 mbuffer[i] = 0;
00289 if (mbuffer[0] == '.' || mbuffer[0] == '$')
00290 ++skip_first;
00291 if (strip_underscore && mbuffer[skip_first] == '_')
00292 ++skip_first;
00293
00294 if (skip_first > i)
00295 skip_first = i;
00296
00297 flags |= (int) style;
00298 result = cplus_demangle (mbuffer + skip_first, flags);
00299 if (result)
00300 {
00301 if (mbuffer[0] == '.')
00302 putc ('.', stdout);
00303 fputs (result, stdout);
00304 free (result);
00305 }
00306 else
00307 fputs (mbuffer, stdout);
00308
00309 fflush (stdout);
00310 }
00311 if (c == EOF)
00312 break;
00313 putchar (c);
00314 fflush (stdout);
00315 }
00316 }
00317
00318 return (0);
00319 }