]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/valgrind/src/valgrind-3.6.0-svn/coregrind/m_demangle/cplus-dem.c
Inital import
[l4.git] / l4 / pkg / valgrind / src / valgrind-3.6.0-svn / coregrind / m_demangle / cplus-dem.c
1 /* Demangler for GNU C++
2    Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4    Written by James Clark (jjc@jclark.uucp)
5    Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
6    Modified by Satish Pai (pai@apollo.hp.com) for HP demangling
7
8 This file is part of the libiberty library.
9 Libiberty is free software; you can redistribute it and/or
10 modify it under the terms of the GNU Library General Public
11 License as published by the Free Software Foundation; either
12 version 2 of the License, or (at your option) any later version.
13
14 In addition to the permissions in the GNU Library General Public
15 License, the Free Software Foundation gives you unlimited permission
16 to link the compiled version of this file into combinations with other
17 programs, and to distribute those combinations without any restriction
18 coming from the use of this file.  (The Library Public License
19 restrictions do apply in other respects; for example, they cover
20 modification of the file, and distribution when not linked into a
21 combined executable.)
22
23 Libiberty is distributed in the hope that it will be useful,
24 but WITHOUT ANY WARRANTY; without even the implied warranty of
25 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
26 Library General Public License for more details.
27
28 You should have received a copy of the GNU Library General Public
29 License along with libiberty; see the file COPYING.LIB.  If
30 not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
31 Boston, MA 02110-1301, USA.  */
32
33 /* This file exports two functions; cplus_mangle_opname and cplus_demangle.
34
35    This file imports xmalloc and xrealloc, which are like malloc and
36    realloc except that they generate a fatal error if there is no
37    available memory.  */
38
39 /* This file lives in both GCC and libiberty.  When making changes, please
40    try not to break either.  */
41
42 #if 0 /* in valgrind */
43 #ifdef HAVE_CONFIG_H
44 #include "config.h"
45 #endif
46 #endif /* ! in valgrind */
47
48 #if 0 /* in valgrind */
49 #include "safe-ctype.h"
50 #endif /* ! in valgrind */
51
52 #if 0 /* in valgrind */
53 #include <sys/types.h>
54 #include <string.h>
55 #include <stdio.h>
56 #endif /* ! in valgrind */
57
58 #if 0 /* in valgrind */
59 #ifdef HAVE_STDLIB_H
60 #include <stdlib.h>
61 #else
62 void * malloc ();
63 void * realloc ();
64 #endif
65 #endif /* ! in valgrind */
66
67 #if 0 /* in valgrind */
68 #include <demangle.h>
69 #undef CURRENT_DEMANGLING_STYLE
70 #define CURRENT_DEMANGLING_STYLE work->options
71 #endif /* ! in valgrind */
72
73 #if 0 /* in valgrind */
74 #include "libiberty.h"
75 #endif /* ! in valgrind */
76
77 #include "vg_libciface.h"
78
79 #include "ansidecl.h"
80 #include "demangle.h"
81 #include "safe-ctype.h"
82
83 static char *ada_demangle (const char *, int);
84
85 #define min(X,Y) (((X) < (Y)) ? (X) : (Y))
86
87 /* A value at least one greater than the maximum number of characters
88    that will be output when using the `%d' format with `printf'.  */
89 #define INTBUF_SIZE 32
90
91 extern void fancy_abort (void) ATTRIBUTE_NORETURN;
92
93 /* In order to allow a single demangler executable to demangle strings
94    using various common values of CPLUS_MARKER, as well as any specific
95    one set at compile time, we maintain a string containing all the
96    commonly used ones, and check to see if the marker we are looking for
97    is in that string.  CPLUS_MARKER is usually '$' on systems where the
98    assembler can deal with that.  Where the assembler can't, it's usually
99    '.' (but on many systems '.' is used for other things).  We put the
100    current defined CPLUS_MARKER first (which defaults to '$'), followed
101    by the next most common value, followed by an explicit '$' in case
102    the value of CPLUS_MARKER is not '$'.
103
104    We could avoid this if we could just get g++ to tell us what the actual
105    cplus marker character is as part of the debug information, perhaps by
106    ensuring that it is the character that terminates the gcc<n>_compiled
107    marker symbol (FIXME).  */
108
109 #if !defined (CPLUS_MARKER)
110 #define CPLUS_MARKER '$'
111 #endif
112
113 enum demangling_styles current_demangling_style = auto_demangling;
114
115 static char cplus_markers[] = { CPLUS_MARKER, '.', '$', '\0' };
116
117 static char char_str[2] = { '\000', '\000' };
118
119 void
120 set_cplus_marker_for_demangling (int ch)
121 {
122   cplus_markers[0] = ch;
123 }
124
125 typedef struct string           /* Beware: these aren't required to be */
126 {                               /*  '\0' terminated.  */
127   char *b;                      /* pointer to start of string */
128   char *p;                      /* pointer after last character */
129   char *e;                      /* pointer after end of allocated space */
130 } string;
131
132 /* Stuff that is shared between sub-routines.
133    Using a shared structure allows cplus_demangle to be reentrant.  */
134
135 struct work_stuff
136 {
137   int options;
138   char **typevec;
139   char **ktypevec;
140   char **btypevec;
141   int numk;
142   int numb;
143   int ksize;
144   int bsize;
145   int ntypes;
146   int typevec_size;
147   int constructor;
148   int destructor;
149   int static_type;      /* A static member function */
150   int temp_start;       /* index in demangled to start of template args */
151   int type_quals;       /* The type qualifiers.  */
152   int dllimported;      /* Symbol imported from a PE DLL */
153   char **tmpl_argvec;   /* Template function arguments. */
154   int ntmpl_args;       /* The number of template function arguments. */
155   int forgetting_types; /* Nonzero if we are not remembering the types
156                            we see.  */
157   string* previous_argument; /* The last function argument demangled.  */
158   int nrepeats;         /* The number of times to repeat the previous
159                            argument.  */
160 };
161
162 #define PRINT_ANSI_QUALIFIERS (work -> options & DMGL_ANSI)
163 #define PRINT_ARG_TYPES       (work -> options & DMGL_PARAMS)
164
165 static const struct optable
166 {
167   const char *const in;
168   const char *const out;
169   const int flags;
170 } optable[] = {
171   {"nw",          " new",       DMGL_ANSI},     /* new (1.92,    ansi) */
172   {"dl",          " delete",    DMGL_ANSI},     /* new (1.92,    ansi) */
173   {"new",         " new",       0},             /* old (1.91,    and 1.x) */
174   {"delete",      " delete",    0},             /* old (1.91,    and 1.x) */
175   {"vn",          " new []",    DMGL_ANSI},     /* GNU, pending ansi */
176   {"vd",          " delete []", DMGL_ANSI},     /* GNU, pending ansi */
177   {"as",          "=",          DMGL_ANSI},     /* ansi */
178   {"ne",          "!=",         DMGL_ANSI},     /* old, ansi */
179   {"eq",          "==",         DMGL_ANSI},     /* old, ansi */
180   {"ge",          ">=",         DMGL_ANSI},     /* old, ansi */
181   {"gt",          ">",          DMGL_ANSI},     /* old, ansi */
182   {"le",          "<=",         DMGL_ANSI},     /* old, ansi */
183   {"lt",          "<",          DMGL_ANSI},     /* old, ansi */
184   {"plus",        "+",          0},             /* old */
185   {"pl",          "+",          DMGL_ANSI},     /* ansi */
186   {"apl",         "+=",         DMGL_ANSI},     /* ansi */
187   {"minus",       "-",          0},             /* old */
188   {"mi",          "-",          DMGL_ANSI},     /* ansi */
189   {"ami",         "-=",         DMGL_ANSI},     /* ansi */
190   {"mult",        "*",          0},             /* old */
191   {"ml",          "*",          DMGL_ANSI},     /* ansi */
192   {"amu",         "*=",         DMGL_ANSI},     /* ansi (ARM/Lucid) */
193   {"aml",         "*=",         DMGL_ANSI},     /* ansi (GNU/g++) */
194   {"convert",     "+",          0},             /* old (unary +) */
195   {"negate",      "-",          0},             /* old (unary -) */
196   {"trunc_mod",   "%",          0},             /* old */
197   {"md",          "%",          DMGL_ANSI},     /* ansi */
198   {"amd",         "%=",         DMGL_ANSI},     /* ansi */
199   {"trunc_div",   "/",          0},             /* old */
200   {"dv",          "/",          DMGL_ANSI},     /* ansi */
201   {"adv",         "/=",         DMGL_ANSI},     /* ansi */
202   {"truth_andif", "&&",         0},             /* old */
203   {"aa",          "&&",         DMGL_ANSI},     /* ansi */
204   {"truth_orif",  "||",         0},             /* old */
205   {"oo",          "||",         DMGL_ANSI},     /* ansi */
206   {"truth_not",   "!",          0},             /* old */
207   {"nt",          "!",          DMGL_ANSI},     /* ansi */
208   {"postincrement","++",        0},             /* old */
209   {"pp",          "++",         DMGL_ANSI},     /* ansi */
210   {"postdecrement","--",        0},             /* old */
211   {"mm",          "--",         DMGL_ANSI},     /* ansi */
212   {"bit_ior",     "|",          0},             /* old */
213   {"or",          "|",          DMGL_ANSI},     /* ansi */
214   {"aor",         "|=",         DMGL_ANSI},     /* ansi */
215   {"bit_xor",     "^",          0},             /* old */
216   {"er",          "^",          DMGL_ANSI},     /* ansi */
217   {"aer",         "^=",         DMGL_ANSI},     /* ansi */
218   {"bit_and",     "&",          0},             /* old */
219   {"ad",          "&",          DMGL_ANSI},     /* ansi */
220   {"aad",         "&=",         DMGL_ANSI},     /* ansi */
221   {"bit_not",     "~",          0},             /* old */
222   {"co",          "~",          DMGL_ANSI},     /* ansi */
223   {"call",        "()",         0},             /* old */
224   {"cl",          "()",         DMGL_ANSI},     /* ansi */
225   {"alshift",     "<<",         0},             /* old */
226   {"ls",          "<<",         DMGL_ANSI},     /* ansi */
227   {"als",         "<<=",        DMGL_ANSI},     /* ansi */
228   {"arshift",     ">>",         0},             /* old */
229   {"rs",          ">>",         DMGL_ANSI},     /* ansi */
230   {"ars",         ">>=",        DMGL_ANSI},     /* ansi */
231   {"component",   "->",         0},             /* old */
232   {"pt",          "->",         DMGL_ANSI},     /* ansi; Lucid C++ form */
233   {"rf",          "->",         DMGL_ANSI},     /* ansi; ARM/GNU form */
234   {"indirect",    "*",          0},             /* old */
235   {"method_call",  "->()",      0},             /* old */
236   {"addr",        "&",          0},             /* old (unary &) */
237   {"array",       "[]",         0},             /* old */
238   {"vc",          "[]",         DMGL_ANSI},     /* ansi */
239   {"compound",    ", ",         0},             /* old */
240   {"cm",          ", ",         DMGL_ANSI},     /* ansi */
241   {"cond",        "?:",         0},             /* old */
242   {"cn",          "?:",         DMGL_ANSI},     /* pseudo-ansi */
243   {"max",         ">?",         0},             /* old */
244   {"mx",          ">?",         DMGL_ANSI},     /* pseudo-ansi */
245   {"min",         "<?",         0},             /* old */
246   {"mn",          "<?",         DMGL_ANSI},     /* pseudo-ansi */
247   {"nop",         "",           0},             /* old (for operator=) */
248   {"rm",          "->*",        DMGL_ANSI},     /* ansi */
249   {"sz",          "sizeof ",    DMGL_ANSI}      /* pseudo-ansi */
250 };
251
252 /* These values are used to indicate the various type varieties.
253    They are all non-zero so that they can be used as `success'
254    values.  */
255 typedef enum type_kind_t
256 {
257   tk_none,
258   tk_pointer,
259   tk_reference,
260   tk_integral,
261   tk_bool,
262   tk_char,
263   tk_real
264 } type_kind_t;
265
266 const struct demangler_engine libiberty_demanglers[] =
267 {
268   {
269     NO_DEMANGLING_STYLE_STRING,
270     no_demangling,
271     "Demangling disabled"
272   }
273   ,
274   {
275     AUTO_DEMANGLING_STYLE_STRING,
276       auto_demangling,
277       "Automatic selection based on executable"
278   }
279   ,
280   {
281     GNU_DEMANGLING_STYLE_STRING,
282       gnu_demangling,
283       "GNU (g++) style demangling"
284   }
285   ,
286   {
287     LUCID_DEMANGLING_STYLE_STRING,
288       lucid_demangling,
289       "Lucid (lcc) style demangling"
290   }
291   ,
292   {
293     ARM_DEMANGLING_STYLE_STRING,
294       arm_demangling,
295       "ARM style demangling"
296   }
297   ,
298   {
299     HP_DEMANGLING_STYLE_STRING,
300       hp_demangling,
301       "HP (aCC) style demangling"
302   }
303   ,
304   {
305     EDG_DEMANGLING_STYLE_STRING,
306       edg_demangling,
307       "EDG style demangling"
308   }
309   ,
310   {
311     GNU_V3_DEMANGLING_STYLE_STRING,
312     gnu_v3_demangling,
313     "GNU (g++) V3 ABI-style demangling"
314   }
315   ,
316   {
317     JAVA_DEMANGLING_STYLE_STRING,
318     java_demangling,
319     "Java style demangling"
320   }
321   ,
322   {
323     GNAT_DEMANGLING_STYLE_STRING,
324     gnat_demangling,
325     "GNAT style demangling"
326   }
327   ,
328   {
329     NULL, unknown_demangling, NULL
330   }
331 };
332
333 #define STRING_EMPTY(str)       ((str) -> b == (str) -> p)
334 #define APPEND_BLANK(str)       {if (!STRING_EMPTY(str)) \
335     string_append(str, " ");}
336 #define LEN_STRING(str)         ( (STRING_EMPTY(str))?0:((str)->p - (str)->b))
337
338 /* The scope separator appropriate for the language being demangled.  */
339
340 #define SCOPE_STRING(work) ((work->options & DMGL_JAVA) ? "." : "::")
341
342 #define ARM_VTABLE_STRING "__vtbl__"    /* Lucid/ARM virtual table prefix */
343 #define ARM_VTABLE_STRLEN 8             /* strlen (ARM_VTABLE_STRING) */
344
345 /* Prototypes for local functions */
346
347 static void delete_work_stuff (struct work_stuff *);
348
349 static void delete_non_B_K_work_stuff (struct work_stuff *);
350
351 static char *mop_up (struct work_stuff *, string *, int);
352
353 static void squangle_mop_up (struct work_stuff *);
354
355 static void work_stuff_copy_to_from (struct work_stuff *, struct work_stuff *);
356
357 #if 0
358 static int
359 demangle_method_args (struct work_stuff *, const char **, string *);
360 #endif
361
362 static char *
363 internal_cplus_demangle (struct work_stuff *, const char *);
364
365 static int
366 demangle_template_template_parm (struct work_stuff *work,
367                                  const char **, string *);
368
369 static int
370 demangle_template (struct work_stuff *work, const char **, string *,
371                    string *, int, int);
372
373 static int
374 arm_pt (const char *, int, const char **, const char **);
375
376 static int
377 demangle_class_name (struct work_stuff *, const char **, string *);
378
379 static int
380 demangle_qualified (struct work_stuff *, const char **, string *,
381                     int, int);
382
383 static int demangle_class (struct work_stuff *, const char **, string *);
384
385 static int demangle_fund_type (struct work_stuff *, const char **, string *);
386
387 static int demangle_signature (struct work_stuff *, const char **, string *);
388
389 static int demangle_prefix (struct work_stuff *, const char **, string *);
390
391 static int gnu_special (struct work_stuff *, const char **, string *);
392
393 static int arm_special (const char **, string *);
394
395 static void string_need (string *, int);
396
397 static void string_delete (string *);
398
399 static void
400 string_init (string *);
401
402 static void string_clear (string *);
403
404 #if 0
405 static int string_empty (string *);
406 #endif
407
408 static void string_append (string *, const char *);
409
410 static void string_appends (string *, string *);
411
412 static void string_appendn (string *, const char *, int);
413
414 static void string_prepend (string *, const char *);
415
416 static void string_prependn (string *, const char *, int);
417
418 static void string_append_template_idx (string *, int);
419
420 static int get_count (const char **, int *);
421
422 static int consume_count (const char **);
423
424 static int consume_count_with_underscores (const char**);
425
426 static int demangle_args (struct work_stuff *, const char **, string *);
427
428 static int demangle_nested_args (struct work_stuff*, const char**, string*);
429
430 static int do_type (struct work_stuff *, const char **, string *);
431
432 static int do_arg (struct work_stuff *, const char **, string *);
433
434 static int
435 demangle_function_name (struct work_stuff *, const char **, string *,
436                         const char *);
437
438 static int
439 iterate_demangle_function (struct work_stuff *,
440                            const char **, string *, const char *);
441
442 static void remember_type (struct work_stuff *, const char *, int);
443
444 static void remember_Btype (struct work_stuff *, const char *, int, int);
445
446 static int register_Btype (struct work_stuff *);
447
448 static void remember_Ktype (struct work_stuff *, const char *, int);
449
450 static void forget_types (struct work_stuff *);
451
452 static void forget_B_and_K_types (struct work_stuff *);
453
454 static void string_prepends (string *, string *);
455
456 static int
457 demangle_template_value_parm (struct work_stuff*, const char**,
458                               string*, type_kind_t);
459
460 static int
461 do_hpacc_template_const_value (struct work_stuff *, const char **, string *);
462
463 static int
464 do_hpacc_template_literal (struct work_stuff *, const char **, string *);
465
466 static int snarf_numeric_literal (const char **, string *);
467
468 /* There is a TYPE_QUAL value for each type qualifier.  They can be
469    combined by bitwise-or to form the complete set of qualifiers for a
470    type.  */
471
472 #define TYPE_UNQUALIFIED   0x0
473 #define TYPE_QUAL_CONST    0x1
474 #define TYPE_QUAL_VOLATILE 0x2
475 #define TYPE_QUAL_RESTRICT 0x4
476
477 static int code_for_qualifier (int);
478
479 static const char* qualifier_string (int);
480
481 static const char* demangle_qualifier (int);
482
483 static int demangle_expression (struct work_stuff *, const char **, string *, 
484                                 type_kind_t);
485
486 static int
487 demangle_integral_value (struct work_stuff *, const char **, string *);
488
489 static int
490 demangle_real_value (struct work_stuff *, const char **, string *);
491
492 static void
493 demangle_arm_hp_template (struct work_stuff *, const char **, int, string *);
494
495 static void
496 recursively_demangle (struct work_stuff *, const char **, string *, int);
497
498 static void grow_vect (char **, size_t *, size_t, int);
499
500 /* Translate count to integer, consuming tokens in the process.
501    Conversion terminates on the first non-digit character.
502
503    Trying to consume something that isn't a count results in no
504    consumption of input and a return of -1.
505
506    Overflow consumes the rest of the digits, and returns -1.  */
507
508 static int
509 consume_count (const char **type)
510 {
511   int count = 0;
512
513   if (! ISDIGIT ((unsigned char)**type))
514     return -1;
515
516   while (ISDIGIT ((unsigned char)**type))
517     {
518       count *= 10;
519
520       /* Check for overflow.
521          We assume that count is represented using two's-complement;
522          no power of two is divisible by ten, so if an overflow occurs
523          when multiplying by ten, the result will not be a multiple of
524          ten.  */
525       if ((count % 10) != 0)
526         {
527           while (ISDIGIT ((unsigned char) **type))
528             (*type)++;
529           return -1;
530         }
531
532       count += **type - '0';
533       (*type)++;
534     }
535
536   if (count < 0)
537     count = -1;
538
539   return (count);
540 }
541
542
543 /* Like consume_count, but for counts that are preceded and followed
544    by '_' if they are greater than 10.  Also, -1 is returned for
545    failure, since 0 can be a valid value.  */
546
547 static int
548 consume_count_with_underscores (const char **mangled)
549 {
550   int idx;
551
552   if (**mangled == '_')
553     {
554       (*mangled)++;
555       if (!ISDIGIT ((unsigned char)**mangled))
556         return -1;
557
558       idx = consume_count (mangled);
559       if (**mangled != '_')
560         /* The trailing underscore was missing. */
561         return -1;
562
563       (*mangled)++;
564     }
565   else
566     {
567       if (**mangled < '0' || **mangled > '9')
568         return -1;
569
570       idx = **mangled - '0';
571       (*mangled)++;
572     }
573
574   return idx;
575 }
576
577 /* C is the code for a type-qualifier.  Return the TYPE_QUAL
578    corresponding to this qualifier.  */
579
580 static int
581 code_for_qualifier (int c)
582 {
583   switch (c)
584     {
585     case 'C':
586       return TYPE_QUAL_CONST;
587
588     case 'V':
589       return TYPE_QUAL_VOLATILE;
590
591     case 'u':
592       return TYPE_QUAL_RESTRICT;
593
594     default:
595       break;
596     }
597
598   /* C was an invalid qualifier.  */
599   abort ();
600 }
601
602 /* Return the string corresponding to the qualifiers given by
603    TYPE_QUALS.  */
604
605 static const char*
606 qualifier_string (int type_quals)
607 {
608   switch (type_quals)
609     {
610     case TYPE_UNQUALIFIED:
611       return "";
612
613     case TYPE_QUAL_CONST:
614       return "const";
615
616     case TYPE_QUAL_VOLATILE:
617       return "volatile";
618
619     case TYPE_QUAL_RESTRICT:
620       return "__restrict";
621
622     case TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE:
623       return "const volatile";
624
625     case TYPE_QUAL_CONST | TYPE_QUAL_RESTRICT:
626       return "const __restrict";
627
628     case TYPE_QUAL_VOLATILE | TYPE_QUAL_RESTRICT:
629       return "volatile __restrict";
630
631     case TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE | TYPE_QUAL_RESTRICT:
632       return "const volatile __restrict";
633
634     default:
635       break;
636     }
637
638   /* TYPE_QUALS was an invalid qualifier set.  */
639   abort ();
640 }
641
642 /* C is the code for a type-qualifier.  Return the string
643    corresponding to this qualifier.  This function should only be
644    called with a valid qualifier code.  */
645
646 static const char*
647 demangle_qualifier (int c)
648 {
649   return qualifier_string (code_for_qualifier (c));
650 }
651
652 int
653 cplus_demangle_opname (const char *opname, char *result, int options)
654 {
655   int len, len1, ret;
656   string type;
657   struct work_stuff work[1];
658   const char *tem;
659
660   len = strlen(opname);
661   result[0] = '\0';
662   ret = 0;
663   memset ((char *) work, 0, sizeof (work));
664   work->options = options;
665
666   if (opname[0] == '_' && opname[1] == '_'
667       && opname[2] == 'o' && opname[3] == 'p')
668     {
669       /* ANSI.  */
670       /* type conversion operator.  */
671       tem = opname + 4;
672       if (do_type (work, &tem, &type))
673         {
674           strcat (result, "operator ");
675           strncat (result, type.b, type.p - type.b);
676           string_delete (&type);
677           ret = 1;
678         }
679     }
680   else if (opname[0] == '_' && opname[1] == '_'
681            && ISLOWER((unsigned char)opname[2])
682            && ISLOWER((unsigned char)opname[3]))
683     {
684       if (opname[4] == '\0')
685         {
686           /* Operator.  */
687           size_t i;
688           for (i = 0; i < ARRAY_SIZE (optable); i++)
689             {
690               if (strlen (optable[i].in) == 2
691                   && memcmp (optable[i].in, opname + 2, 2) == 0)
692                 {
693                   strcat (result, "operator");
694                   strcat (result, optable[i].out);
695                   ret = 1;
696                   break;
697                 }
698             }
699         }
700       else
701         {
702           if (opname[2] == 'a' && opname[5] == '\0')
703             {
704               /* Assignment.  */
705               size_t i;
706               for (i = 0; i < ARRAY_SIZE (optable); i++)
707                 {
708                   if (strlen (optable[i].in) == 3
709                       && memcmp (optable[i].in, opname + 2, 3) == 0)
710                     {
711                       strcat (result, "operator");
712                       strcat (result, optable[i].out);
713                       ret = 1;
714                       break;
715                     }
716                 }
717             }
718         }
719     }
720   else if (len >= 3
721            && opname[0] == 'o'
722            && opname[1] == 'p'
723            && strchr (cplus_markers, opname[2]) != NULL)
724     {
725       /* see if it's an assignment expression */
726       if (len >= 10 /* op$assign_ */
727           && memcmp (opname + 3, "assign_", 7) == 0)
728         {
729           size_t i;
730           for (i = 0; i < ARRAY_SIZE (optable); i++)
731             {
732               len1 = len - 10;
733               if ((int) strlen (optable[i].in) == len1
734                   && memcmp (optable[i].in, opname + 10, len1) == 0)
735                 {
736                   strcat (result, "operator");
737                   strcat (result, optable[i].out);
738                   strcat (result, "=");
739                   ret = 1;
740                   break;
741                 }
742             }
743         }
744       else
745         {
746           size_t i;
747           for (i = 0; i < ARRAY_SIZE (optable); i++)
748             {
749               len1 = len - 3;
750               if ((int) strlen (optable[i].in) == len1
751                   && memcmp (optable[i].in, opname + 3, len1) == 0)
752                 {
753                   strcat (result, "operator");
754                   strcat (result, optable[i].out);
755                   ret = 1;
756                   break;
757                 }
758             }
759         }
760     }
761   else if (len >= 5 && memcmp (opname, "type", 4) == 0
762            && strchr (cplus_markers, opname[4]) != NULL)
763     {
764       /* type conversion operator */
765       tem = opname + 5;
766       if (do_type (work, &tem, &type))
767         {
768           strcat (result, "operator ");
769           strncat (result, type.b, type.p - type.b);
770           string_delete (&type);
771           ret = 1;
772         }
773     }
774   squangle_mop_up (work);
775   return ret;
776
777 }
778
779 /* Takes operator name as e.g. "++" and returns mangled
780    operator name (e.g. "postincrement_expr"), or NULL if not found.
781
782    If OPTIONS & DMGL_ANSI == 1, return the ANSI name;
783    if OPTIONS & DMGL_ANSI == 0, return the old GNU name.  */
784
785 const char *
786 cplus_mangle_opname (const char *opname, int options)
787 {
788   size_t i;
789   int len;
790
791   len = strlen (opname);
792   for (i = 0; i < ARRAY_SIZE (optable); i++)
793     {
794       if ((int) strlen (optable[i].out) == len
795           && (options & DMGL_ANSI) == (optable[i].flags & DMGL_ANSI)
796           && memcmp (optable[i].out, opname, len) == 0)
797         return optable[i].in;
798     }
799   return (0);
800 }
801
802 /* Add a routine to set the demangling style to be sure it is valid and
803    allow for any demangler initialization that maybe necessary. */
804
805 enum demangling_styles
806 cplus_demangle_set_style (enum demangling_styles style)
807 {
808   const struct demangler_engine *demangler = libiberty_demanglers; 
809
810   for (; demangler->demangling_style != unknown_demangling; ++demangler)
811     if (style == demangler->demangling_style)
812       {
813         current_demangling_style = style;
814         return current_demangling_style;
815       }
816
817   return unknown_demangling;
818 }
819
820 /* Do string name to style translation */
821
822 enum demangling_styles
823 cplus_demangle_name_to_style (const char *name)
824 {
825   const struct demangler_engine *demangler = libiberty_demanglers; 
826
827   for (; demangler->demangling_style != unknown_demangling; ++demangler)
828     if (strcmp (name, demangler->demangling_style_name) == 0)
829       return demangler->demangling_style;
830
831   return unknown_demangling;
832 }
833
834 /* char *cplus_demangle (const char *mangled, int options)
835
836    If MANGLED is a mangled function name produced by GNU C++, then
837    a pointer to a @code{malloc}ed string giving a C++ representation
838    of the name will be returned; otherwise NULL will be returned.
839    It is the caller's responsibility to free the string which
840    is returned.
841
842    The OPTIONS arg may contain one or more of the following bits:
843
844         DMGL_ANSI       ANSI qualifiers such as `const' and `void' are
845                         included.
846         DMGL_PARAMS     Function parameters are included.
847
848    For example,
849
850    cplus_demangle ("foo__1Ai", DMGL_PARAMS)             => "A::foo(int)"
851    cplus_demangle ("foo__1Ai", DMGL_PARAMS | DMGL_ANSI) => "A::foo(int)"
852    cplus_demangle ("foo__1Ai", 0)                       => "A::foo"
853
854    cplus_demangle ("foo__1Afe", DMGL_PARAMS)            => "A::foo(float,...)"
855    cplus_demangle ("foo__1Afe", DMGL_PARAMS | DMGL_ANSI)=> "A::foo(float,...)"
856    cplus_demangle ("foo__1Afe", 0)                      => "A::foo"
857
858    Note that any leading underscores, or other such characters prepended by
859    the compilation system, are presumed to have already been stripped from
860    MANGLED.  */
861
862 char *
863 ML_(cplus_demangle) (const char *mangled, int options)
864 {
865   char *ret;
866   struct work_stuff work[1];
867
868   if (current_demangling_style == no_demangling)
869     return xstrdup (mangled);
870
871   memset ((char *) work, 0, sizeof (work));
872   work->options = options;
873   if ((work->options & DMGL_STYLE_MASK) == 0)
874     work->options |= (int) current_demangling_style & DMGL_STYLE_MASK;
875
876   /* The V3 ABI demangling is implemented elsewhere.  */
877   if (GNU_V3_DEMANGLING || AUTO_DEMANGLING)
878     {
879       ret = cplus_demangle_v3 (mangled, work->options);
880       if (ret || GNU_V3_DEMANGLING)
881         return ret;
882     }
883
884   if (JAVA_DEMANGLING)
885     {
886       ret = java_demangle_v3 (mangled);
887       if (ret)
888         return ret;
889     }
890
891   if (GNAT_DEMANGLING)
892     return ada_demangle(mangled,options);
893
894   ret = internal_cplus_demangle (work, mangled);
895   squangle_mop_up (work);
896   return (ret);
897 }
898
899
900 /* Assuming *OLD_VECT points to an array of *SIZE objects of size
901    ELEMENT_SIZE, grow it to contain at least MIN_SIZE objects,
902    updating *OLD_VECT and *SIZE as necessary.  */
903
904 static void
905 grow_vect (char **old_vect, size_t *size, size_t min_size, int element_size)
906 {
907   if (*size < min_size)
908     {
909       *size *= 2;
910       if (*size < min_size)
911         *size = min_size;
912       *old_vect = XRESIZEVAR (char, *old_vect, *size * element_size);
913     }
914 }
915
916 /* Demangle ada names:
917    1. Discard final __{DIGIT}+ or ${DIGIT}+
918    2. Convert other instances of embedded "__" to `.'.
919    3. Discard leading _ada_.
920    4. Remove everything after first ___ if it is followed by 'X'.
921    5. Put symbols that should be suppressed in <...> brackets.
922    The resulting string is valid until the next call of ada_demangle.  */
923
924 static char *
925 ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED)
926 {
927   int i, j;
928   int len0;
929   const char* p;
930   char *demangled = NULL;
931   int changed;
932   size_t demangled_size = 0;
933   
934   changed = 0;
935
936   if (strncmp (mangled, "_ada_", 5) == 0)
937     {
938       mangled += 5;
939       changed = 1;
940     }
941   
942   if (mangled[0] == '_' || mangled[0] == '<')
943     goto Suppress;
944   
945   p = strstr (mangled, "___");
946   if (p == NULL)
947     len0 = strlen (mangled);
948   else
949     {
950       if (p[3] == 'X')
951         {
952           len0 = p - mangled;
953           changed = 1;
954         }
955       else
956         goto Suppress;
957     }
958   
959   /* Make demangled big enough for possible expansion by operator name.  */
960   grow_vect (&demangled,
961              &demangled_size,  2 * len0 + 1,
962              sizeof (char));
963   
964   if (ISDIGIT ((unsigned char) mangled[len0 - 1])) {
965     for (i = len0 - 2; i >= 0 && ISDIGIT ((unsigned char) mangled[i]); i -= 1)
966       ;
967     if (i > 1 && mangled[i] == '_' && mangled[i - 1] == '_')
968       {
969         len0 = i - 1;
970         changed = 1;
971       }
972     else if (mangled[i] == '$')
973       {
974         len0 = i;
975         changed = 1;
976       }
977   }
978   
979   for (i = 0, j = 0; i < len0 && ! ISALPHA ((unsigned char)mangled[i]);
980        i += 1, j += 1)
981     demangled[j] = mangled[i];
982   
983   while (i < len0)
984     {
985       if (i < len0 - 2 && mangled[i] == '_' && mangled[i + 1] == '_')
986         {
987           demangled[j] = '.';
988           changed = 1;
989           i += 2; j += 1;
990         }
991       else
992         {
993           demangled[j] = mangled[i];
994           i += 1;  j += 1;
995         }
996     }
997   demangled[j] = '\000';
998   
999   for (i = 0; demangled[i] != '\0'; i += 1)
1000     if (ISUPPER ((unsigned char)demangled[i]) || demangled[i] == ' ')
1001       goto Suppress;
1002
1003   if (! changed)
1004     return NULL;
1005   else
1006     return demangled;
1007   
1008  Suppress:
1009   grow_vect (&demangled,
1010              &demangled_size,  strlen (mangled) + 3,
1011              sizeof (char));
1012
1013   if (mangled[0] == '<')
1014      strcpy (demangled, mangled);
1015   else
1016     sprintf (demangled, "<%s>", mangled);
1017
1018   return demangled;
1019 }
1020
1021 /* This function performs most of what cplus_demangle use to do, but
1022    to be able to demangle a name with a B, K or n code, we need to
1023    have a longer term memory of what types have been seen. The original
1024    now initializes and cleans up the squangle code info, while internal
1025    calls go directly to this routine to avoid resetting that info. */
1026
1027 static char *
1028 internal_cplus_demangle (struct work_stuff *work, const char *mangled)
1029 {
1030
1031   string decl;
1032   int success = 0;
1033   char *demangled = NULL;
1034   int s1, s2, s3, s4;
1035   s1 = work->constructor;
1036   s2 = work->destructor;
1037   s3 = work->static_type;
1038   s4 = work->type_quals;
1039   work->constructor = work->destructor = 0;
1040   work->type_quals = TYPE_UNQUALIFIED;
1041   work->dllimported = 0;
1042
1043   if ((mangled != NULL) && (*mangled != '\0'))
1044     {
1045       string_init (&decl);
1046
1047       /* First check to see if gnu style demangling is active and if the
1048          string to be demangled contains a CPLUS_MARKER.  If so, attempt to
1049          recognize one of the gnu special forms rather than looking for a
1050          standard prefix.  In particular, don't worry about whether there
1051          is a "__" string in the mangled string.  Consider "_$_5__foo" for
1052          example.  */
1053
1054       if ((AUTO_DEMANGLING || GNU_DEMANGLING))
1055         {
1056           success = gnu_special (work, &mangled, &decl);
1057         }
1058       if (!success)
1059         {
1060           success = demangle_prefix (work, &mangled, &decl);
1061         }
1062       if (success && (*mangled != '\0'))
1063         {
1064           success = demangle_signature (work, &mangled, &decl);
1065         }
1066       if (work->constructor == 2)
1067         {
1068           string_prepend (&decl, "global constructors keyed to ");
1069           work->constructor = 0;
1070         }
1071       else if (work->destructor == 2)
1072         {
1073           string_prepend (&decl, "global destructors keyed to ");
1074           work->destructor = 0;
1075         }
1076       else if (work->dllimported == 1)
1077         {
1078           string_prepend (&decl, "import stub for ");
1079           work->dllimported = 0;
1080         }
1081       demangled = mop_up (work, &decl, success);
1082     }
1083   work->constructor = s1;
1084   work->destructor = s2;
1085   work->static_type = s3;
1086   work->type_quals = s4;
1087   return demangled;
1088 }
1089
1090
1091 /* Clear out and squangling related storage */
1092 static void
1093 squangle_mop_up (struct work_stuff *work)
1094 {
1095   /* clean up the B and K type mangling types. */
1096   forget_B_and_K_types (work);
1097   if (work -> btypevec != NULL)
1098     {
1099       free ((char *) work -> btypevec);
1100     }
1101   if (work -> ktypevec != NULL)
1102     {
1103       free ((char *) work -> ktypevec);
1104     }
1105 }
1106
1107
1108 /* Copy the work state and storage.  */
1109
1110 static void
1111 work_stuff_copy_to_from (struct work_stuff *to, struct work_stuff *from)
1112 {
1113   int i;
1114
1115   delete_work_stuff (to);
1116
1117   /* Shallow-copy scalars.  */
1118   memcpy (to, from, sizeof (*to));
1119
1120   /* Deep-copy dynamic storage.  */
1121   if (from->typevec_size)
1122     to->typevec = XNEWVEC (char *, from->typevec_size);
1123
1124   for (i = 0; i < from->ntypes; i++)
1125     {
1126       int len = strlen (from->typevec[i]) + 1;
1127
1128       to->typevec[i] = XNEWVEC (char, len);
1129       memcpy (to->typevec[i], from->typevec[i], len);
1130     }
1131
1132   if (from->ksize)
1133     to->ktypevec = XNEWVEC (char *, from->ksize);
1134
1135   for (i = 0; i < from->numk; i++)
1136     {
1137       int len = strlen (from->ktypevec[i]) + 1;
1138
1139       to->ktypevec[i] = XNEWVEC (char, len);
1140       memcpy (to->ktypevec[i], from->ktypevec[i], len);
1141     }
1142
1143   if (from->bsize)
1144     to->btypevec = XNEWVEC (char *, from->bsize);
1145
1146   for (i = 0; i < from->numb; i++)
1147     {
1148       int len = strlen (from->btypevec[i]) + 1;
1149
1150       to->btypevec[i] = XNEWVEC (char , len);
1151       memcpy (to->btypevec[i], from->btypevec[i], len);
1152     }
1153
1154   if (from->ntmpl_args)
1155     to->tmpl_argvec = XNEWVEC (char *, from->ntmpl_args);
1156
1157   for (i = 0; i < from->ntmpl_args; i++)
1158     {
1159       int len = strlen (from->tmpl_argvec[i]) + 1;
1160
1161       to->tmpl_argvec[i] = XNEWVEC (char, len);
1162       memcpy (to->tmpl_argvec[i], from->tmpl_argvec[i], len);
1163     }
1164
1165   if (from->previous_argument)
1166     {
1167       to->previous_argument = XNEW (string);
1168       string_init (to->previous_argument);
1169       string_appends (to->previous_argument, from->previous_argument);
1170     }
1171 }
1172
1173
1174 /* Delete dynamic stuff in work_stuff that is not to be re-used.  */
1175
1176 static void
1177 delete_non_B_K_work_stuff (struct work_stuff *work)
1178 {
1179   /* Discard the remembered types, if any.  */
1180
1181   forget_types (work);
1182   if (work -> typevec != NULL)
1183     {
1184       free ((char *) work -> typevec);
1185       work -> typevec = NULL;
1186       work -> typevec_size = 0;
1187     }
1188   if (work->tmpl_argvec)
1189     {
1190       int i;
1191
1192       for (i = 0; i < work->ntmpl_args; i++)
1193         if (work->tmpl_argvec[i])
1194           free ((char*) work->tmpl_argvec[i]);
1195
1196       free ((char*) work->tmpl_argvec);
1197       work->tmpl_argvec = NULL;
1198     }
1199   if (work->previous_argument)
1200     {
1201       string_delete (work->previous_argument);
1202       free ((char*) work->previous_argument);
1203       work->previous_argument = NULL;
1204     }
1205 }
1206
1207
1208 /* Delete all dynamic storage in work_stuff.  */
1209 static void
1210 delete_work_stuff (struct work_stuff *work)
1211 {
1212   delete_non_B_K_work_stuff (work);
1213   squangle_mop_up (work);
1214 }
1215
1216
1217 /* Clear out any mangled storage */
1218
1219 static char *
1220 mop_up (struct work_stuff *work, string *declp, int success)
1221 {
1222   char *demangled = NULL;
1223
1224   delete_non_B_K_work_stuff (work);
1225
1226   /* If demangling was successful, ensure that the demangled string is null
1227      terminated and return it.  Otherwise, free the demangling decl.  */
1228
1229   if (!success)
1230     {
1231       string_delete (declp);
1232     }
1233   else
1234     {
1235       string_appendn (declp, "", 1);
1236       demangled = declp->b;
1237     }
1238   return (demangled);
1239 }
1240
1241 /*
1242
1243 LOCAL FUNCTION
1244
1245         demangle_signature -- demangle the signature part of a mangled name
1246
1247 SYNOPSIS
1248
1249         static int
1250         demangle_signature (struct work_stuff *work, const char **mangled,
1251                             string *declp);
1252
1253 DESCRIPTION
1254
1255         Consume and demangle the signature portion of the mangled name.
1256
1257         DECLP is the string where demangled output is being built.  At
1258         entry it contains the demangled root name from the mangled name
1259         prefix.  I.E. either a demangled operator name or the root function
1260         name.  In some special cases, it may contain nothing.
1261
1262         *MANGLED points to the current unconsumed location in the mangled
1263         name.  As tokens are consumed and demangling is performed, the
1264         pointer is updated to continuously point at the next token to
1265         be consumed.
1266
1267         Demangling GNU style mangled names is nasty because there is no
1268         explicit token that marks the start of the outermost function
1269         argument list.  */
1270
1271 static int
1272 demangle_signature (struct work_stuff *work,
1273                     const char **mangled, string *declp)
1274 {
1275   int success = 1;
1276   int func_done = 0;
1277   int expect_func = 0;
1278   int expect_return_type = 0;
1279   const char *oldmangled = NULL;
1280   string trawname;
1281   string tname;
1282
1283   while (success && (**mangled != '\0'))
1284     {
1285       switch (**mangled)
1286         {
1287         case 'Q':
1288           oldmangled = *mangled;
1289           success = demangle_qualified (work, mangled, declp, 1, 0);
1290           if (success)
1291             remember_type (work, oldmangled, *mangled - oldmangled);
1292           if (AUTO_DEMANGLING || GNU_DEMANGLING)
1293             expect_func = 1;
1294           oldmangled = NULL;
1295           break;
1296
1297         case 'K':
1298           //oldmangled = *mangled;
1299           success = demangle_qualified (work, mangled, declp, 1, 0);
1300           if (AUTO_DEMANGLING || GNU_DEMANGLING)
1301             {
1302               expect_func = 1;
1303             }
1304           oldmangled = NULL;
1305           break;
1306
1307         case 'S':
1308           /* Static member function */
1309           if (oldmangled == NULL)
1310             {
1311               oldmangled = *mangled;
1312             }
1313           (*mangled)++;
1314           work -> static_type = 1;
1315           break;
1316
1317         case 'C':
1318         case 'V':
1319         case 'u':
1320           work->type_quals |= code_for_qualifier (**mangled);
1321
1322           /* a qualified member function */
1323           if (oldmangled == NULL)
1324             oldmangled = *mangled;
1325           (*mangled)++;
1326           break;
1327
1328         case 'L':
1329           /* Local class name follows after "Lnnn_" */
1330           if (HP_DEMANGLING)
1331             {
1332               while (**mangled && (**mangled != '_'))
1333                 (*mangled)++;
1334               if (!**mangled)
1335                 success = 0;
1336               else
1337                 (*mangled)++;
1338             }
1339           else
1340             success = 0;
1341           break;
1342
1343         case '0': case '1': case '2': case '3': case '4':
1344         case '5': case '6': case '7': case '8': case '9':
1345           if (oldmangled == NULL)
1346             {
1347               oldmangled = *mangled;
1348             }
1349           work->temp_start = -1; /* uppermost call to demangle_class */
1350           success = demangle_class (work, mangled, declp);
1351           if (success)
1352             {
1353               remember_type (work, oldmangled, *mangled - oldmangled);
1354             }
1355           if (AUTO_DEMANGLING || GNU_DEMANGLING || EDG_DEMANGLING)
1356             {
1357               /* EDG and others will have the "F", so we let the loop cycle
1358                  if we are looking at one. */
1359               if (**mangled != 'F')
1360                  expect_func = 1;
1361             }
1362           oldmangled = NULL;
1363           break;
1364
1365         case 'B':
1366           {
1367             string s;
1368             success = do_type (work, mangled, &s);
1369             if (success)
1370               {
1371                 string_append (&s, SCOPE_STRING (work));
1372                 string_prepends (declp, &s);
1373                 string_delete (&s);
1374               }
1375             oldmangled = NULL;
1376             expect_func = 1;
1377           }
1378           break;
1379
1380         case 'F':
1381           /* Function */
1382           /* ARM/HP style demangling includes a specific 'F' character after
1383              the class name.  For GNU style, it is just implied.  So we can
1384              safely just consume any 'F' at this point and be compatible
1385              with either style.  */
1386
1387           oldmangled = NULL;
1388           func_done = 1;
1389           (*mangled)++;
1390
1391           /* For lucid/ARM/HP style we have to forget any types we might
1392              have remembered up to this point, since they were not argument
1393              types.  GNU style considers all types seen as available for
1394              back references.  See comment in demangle_args() */
1395
1396           if (LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING)
1397             {
1398               forget_types (work);
1399             }
1400           success = demangle_args (work, mangled, declp);
1401           /* After picking off the function args, we expect to either
1402              find the function return type (preceded by an '_') or the
1403              end of the string. */
1404           if (success && (AUTO_DEMANGLING || EDG_DEMANGLING) && **mangled == '_')
1405             {
1406               ++(*mangled);
1407               /* At this level, we do not care about the return type. */
1408               success = do_type (work, mangled, &tname);
1409               string_delete (&tname);
1410             }
1411
1412           break;
1413
1414         case 't':
1415           /* G++ Template */
1416           string_init(&trawname);
1417           string_init(&tname);
1418           if (oldmangled == NULL)
1419             {
1420               oldmangled = *mangled;
1421             }
1422           success = demangle_template (work, mangled, &tname,
1423                                        &trawname, 1, 1);
1424           if (success)
1425             {
1426               remember_type (work, oldmangled, *mangled - oldmangled);
1427             }
1428           string_append (&tname, SCOPE_STRING (work));
1429
1430           string_prepends(declp, &tname);
1431           if (work -> destructor & 1)
1432             {
1433               string_prepend (&trawname, "~");
1434               string_appends (declp, &trawname);
1435               work->destructor -= 1;
1436             }
1437           if ((work->constructor & 1) || (work->destructor & 1))
1438             {
1439               string_appends (declp, &trawname);
1440               work->constructor -= 1;
1441             }
1442           string_delete(&trawname);
1443           string_delete(&tname);
1444           oldmangled = NULL;
1445           expect_func = 1;
1446           break;
1447
1448         case '_':
1449           if ((AUTO_DEMANGLING || GNU_DEMANGLING) && expect_return_type)
1450             {
1451               /* Read the return type. */
1452               string return_type;
1453
1454               (*mangled)++;
1455               success = do_type (work, mangled, &return_type);
1456               APPEND_BLANK (&return_type);
1457
1458               string_prepends (declp, &return_type);
1459               string_delete (&return_type);
1460               break;
1461             }
1462           else
1463             /* At the outermost level, we cannot have a return type specified,
1464                so if we run into another '_' at this point we are dealing with
1465                a mangled name that is either bogus, or has been mangled by
1466                some algorithm we don't know how to deal with.  So just
1467                reject the entire demangling.  */
1468             /* However, "_nnn" is an expected suffix for alternate entry point
1469                numbered nnn for a function, with HP aCC, so skip over that
1470                without reporting failure. pai/1997-09-04 */
1471             if (HP_DEMANGLING)
1472               {
1473                 (*mangled)++;
1474                 while (**mangled && ISDIGIT ((unsigned char)**mangled))
1475                   (*mangled)++;
1476               }
1477             else
1478               success = 0;
1479           break;
1480
1481         case 'H':
1482           if (AUTO_DEMANGLING || GNU_DEMANGLING)
1483             {
1484               /* A G++ template function.  Read the template arguments. */
1485               success = demangle_template (work, mangled, declp, 0, 0,
1486                                            0);
1487               if (!(work->constructor & 1))
1488                 expect_return_type = 1;
1489               (*mangled)++;
1490               break;
1491             }
1492           else
1493             /* fall through */
1494             {;}
1495
1496         default:
1497           if (AUTO_DEMANGLING || GNU_DEMANGLING)
1498             {
1499               /* Assume we have stumbled onto the first outermost function
1500                  argument token, and start processing args.  */
1501               func_done = 1;
1502               success = demangle_args (work, mangled, declp);
1503             }
1504           else
1505             {
1506               /* Non-GNU demanglers use a specific token to mark the start
1507                  of the outermost function argument tokens.  Typically 'F',
1508                  for ARM/HP-demangling, for example.  So if we find something
1509                  we are not prepared for, it must be an error.  */
1510               success = 0;
1511             }
1512           break;
1513         }
1514       /*
1515         if (AUTO_DEMANGLING || GNU_DEMANGLING)
1516         */
1517       {
1518         if (success && expect_func)
1519           {
1520             func_done = 1;
1521               if (LUCID_DEMANGLING || ARM_DEMANGLING || EDG_DEMANGLING)
1522                 {
1523                   forget_types (work);
1524                 }
1525             success = demangle_args (work, mangled, declp);
1526             /* Since template include the mangling of their return types,
1527                we must set expect_func to 0 so that we don't try do
1528                demangle more arguments the next time we get here.  */
1529             expect_func = 0;
1530           }
1531       }
1532     }
1533   if (success && !func_done)
1534     {
1535       if (AUTO_DEMANGLING || GNU_DEMANGLING)
1536         {
1537           /* With GNU style demangling, bar__3foo is 'foo::bar(void)', and
1538              bar__3fooi is 'foo::bar(int)'.  We get here when we find the
1539              first case, and need to ensure that the '(void)' gets added to
1540              the current declp.  Note that with ARM/HP, the first case
1541              represents the name of a static data member 'foo::bar',
1542              which is in the current declp, so we leave it alone.  */
1543           success = demangle_args (work, mangled, declp);
1544         }
1545     }
1546   if (success && PRINT_ARG_TYPES)
1547     {
1548       if (work->static_type)
1549         string_append (declp, " static");
1550       if (work->type_quals != TYPE_UNQUALIFIED)
1551         {
1552           APPEND_BLANK (declp);
1553           string_append (declp, qualifier_string (work->type_quals));
1554         }
1555     }
1556
1557   return (success);
1558 }
1559
1560 #if 0
1561
1562 static int
1563 demangle_method_args (struct work_stuff *work, const char **mangled,
1564                       string *declp)
1565 {
1566   int success = 0;
1567
1568   if (work -> static_type)
1569     {
1570       string_append (declp, *mangled + 1);
1571       *mangled += strlen (*mangled);
1572       success = 1;
1573     }
1574   else
1575     {
1576       success = demangle_args (work, mangled, declp);
1577     }
1578   return (success);
1579 }
1580
1581 #endif
1582
1583 static int
1584 demangle_template_template_parm (struct work_stuff *work,
1585                                  const char **mangled, string *tname)
1586 {
1587   int i;
1588   int r;
1589   int need_comma = 0;
1590   int success = 1;
1591   string temp;
1592
1593   string_append (tname, "template <");
1594   /* get size of template parameter list */
1595   if (get_count (mangled, &r))
1596     {
1597       for (i = 0; i < r; i++)
1598         {
1599           if (need_comma)
1600             {
1601               string_append (tname, ", ");
1602             }
1603
1604             /* Z for type parameters */
1605             if (**mangled == 'Z')
1606               {
1607                 (*mangled)++;
1608                 string_append (tname, "class");
1609               }
1610               /* z for template parameters */
1611             else if (**mangled == 'z')
1612               {
1613                 (*mangled)++;
1614                 success =
1615                   demangle_template_template_parm (work, mangled, tname);
1616                 if (!success)
1617                   {
1618                     break;
1619                   }
1620               }
1621             else
1622               {
1623                 /* temp is initialized in do_type */
1624                 success = do_type (work, mangled, &temp);
1625                 if (success)
1626                   {
1627                     string_appends (tname, &temp);
1628                   }
1629                 string_delete(&temp);
1630                 if (!success)
1631                   {
1632                     break;
1633                   }
1634               }
1635           need_comma = 1;
1636         }
1637
1638     }
1639   if (tname->p[-1] == '>')
1640     string_append (tname, " ");
1641   string_append (tname, "> class");
1642   return (success);
1643 }
1644
1645 static int
1646 demangle_expression (struct work_stuff *work, const char **mangled,
1647                      string *s, type_kind_t tk)
1648 {
1649   int need_operator = 0;
1650   int success;
1651
1652   success = 1;
1653   string_appendn (s, "(", 1);
1654   (*mangled)++;
1655   while (success && **mangled != 'W' && **mangled != '\0')
1656     {
1657       if (need_operator)
1658         {
1659           size_t i;
1660           size_t len;
1661
1662           success = 0;
1663
1664           len = strlen (*mangled);
1665
1666           for (i = 0; i < ARRAY_SIZE (optable); ++i)
1667             {
1668               size_t l = strlen (optable[i].in);
1669
1670               if (l <= len
1671                   && memcmp (optable[i].in, *mangled, l) == 0)
1672                 {
1673                   string_appendn (s, " ", 1);
1674                   string_append (s, optable[i].out);
1675                   string_appendn (s, " ", 1);
1676                   success = 1;
1677                   (*mangled) += l;
1678                   break;
1679                 }
1680             }
1681
1682           if (!success)
1683             break;
1684         }
1685       else
1686         need_operator = 1;
1687
1688       success = demangle_template_value_parm (work, mangled, s, tk);
1689     }
1690
1691   if (**mangled != 'W')
1692     success = 0;
1693   else
1694     {
1695       string_appendn (s, ")", 1);
1696       (*mangled)++;
1697     }
1698
1699   return success;
1700 }
1701
1702 static int
1703 demangle_integral_value (struct work_stuff *work,
1704                          const char **mangled, string *s)
1705 {
1706   int success;
1707
1708   if (**mangled == 'E')
1709     success = demangle_expression (work, mangled, s, tk_integral);
1710   else if (**mangled == 'Q' || **mangled == 'K')
1711     success = demangle_qualified (work, mangled, s, 0, 1);
1712   else
1713     {
1714       int value;
1715
1716       /* By default, we let the number decide whether we shall consume an
1717          underscore.  */
1718       int multidigit_without_leading_underscore = 0;
1719       int leave_following_underscore = 0;
1720
1721       success = 0;
1722
1723       if (**mangled == '_')
1724         {
1725           if (mangled[0][1] == 'm')
1726             {
1727               /* Since consume_count_with_underscores does not handle the
1728                  `m'-prefix we must do it here, using consume_count and
1729                  adjusting underscores: we have to consume the underscore
1730                  matching the prepended one.  */
1731               multidigit_without_leading_underscore = 1;
1732               string_appendn (s, "-", 1);
1733               (*mangled) += 2;
1734             }
1735           else
1736             {
1737               /* Do not consume a following underscore;
1738                  consume_count_with_underscores will consume what
1739                  should be consumed.  */
1740               leave_following_underscore = 1;
1741             }
1742         }
1743       else
1744         {
1745           /* Negative numbers are indicated with a leading `m'.  */
1746           if (**mangled == 'm')
1747           {
1748             string_appendn (s, "-", 1);
1749             (*mangled)++;
1750           }
1751           /* Since consume_count_with_underscores does not handle
1752              multi-digit numbers that do not start with an underscore,
1753              and this number can be an integer template parameter,
1754              we have to call consume_count. */
1755           multidigit_without_leading_underscore = 1;
1756           /* These multi-digit numbers never end on an underscore,
1757              so if there is one then don't eat it. */
1758           leave_following_underscore = 1;
1759         }
1760
1761       /* We must call consume_count if we expect to remove a trailing
1762          underscore, since consume_count_with_underscores expects
1763          the leading underscore (that we consumed) if it is to handle
1764          multi-digit numbers.  */
1765       if (multidigit_without_leading_underscore)
1766         value = consume_count (mangled);
1767       else
1768         value = consume_count_with_underscores (mangled);
1769
1770       if (value != -1)
1771         {
1772           char buf[INTBUF_SIZE];
1773           sprintf (buf, "%d", value);
1774           string_append (s, buf);
1775
1776           /* Numbers not otherwise delimited, might have an underscore
1777              appended as a delimeter, which we should skip.
1778
1779              ??? This used to always remove a following underscore, which
1780              is wrong.  If other (arbitrary) cases are followed by an
1781              underscore, we need to do something more radical.  */
1782
1783           if ((value > 9 || multidigit_without_leading_underscore)
1784               && ! leave_following_underscore
1785               && **mangled == '_')
1786             (*mangled)++;
1787
1788           /* All is well.  */
1789           success = 1;
1790         }
1791       }
1792
1793   return success;
1794 }
1795
1796 /* Demangle the real value in MANGLED.  */
1797
1798 static int
1799 demangle_real_value (struct work_stuff *work,
1800                      const char **mangled, string *s)
1801 {
1802   if (**mangled == 'E')
1803     return demangle_expression (work, mangled, s, tk_real);
1804
1805   if (**mangled == 'm')
1806     {
1807       string_appendn (s, "-", 1);
1808       (*mangled)++;
1809     }
1810   while (ISDIGIT ((unsigned char)**mangled))
1811     {
1812       string_appendn (s, *mangled, 1);
1813       (*mangled)++;
1814     }
1815   if (**mangled == '.') /* fraction */
1816     {
1817       string_appendn (s, ".", 1);
1818       (*mangled)++;
1819       while (ISDIGIT ((unsigned char)**mangled))
1820         {
1821           string_appendn (s, *mangled, 1);
1822           (*mangled)++;
1823         }
1824     }
1825   if (**mangled == 'e') /* exponent */
1826     {
1827       string_appendn (s, "e", 1);
1828       (*mangled)++;
1829       while (ISDIGIT ((unsigned char)**mangled))
1830         {
1831           string_appendn (s, *mangled, 1);
1832           (*mangled)++;
1833         }
1834     }
1835
1836   return 1;
1837 }
1838
1839 static int
1840 demangle_template_value_parm (struct work_stuff *work, const char **mangled,
1841                               string *s, type_kind_t tk)
1842 {
1843   int success = 1;
1844
1845   if (**mangled == 'Y')
1846     {
1847       /* The next argument is a template parameter. */
1848       int idx;
1849
1850       (*mangled)++;
1851       idx = consume_count_with_underscores (mangled);
1852       if (idx == -1
1853           || (work->tmpl_argvec && idx >= work->ntmpl_args)
1854           || consume_count_with_underscores (mangled) == -1)
1855         return -1;
1856       if (work->tmpl_argvec)
1857         string_append (s, work->tmpl_argvec[idx]);
1858       else
1859         string_append_template_idx (s, idx);
1860     }
1861   else if (tk == tk_integral)
1862     success = demangle_integral_value (work, mangled, s);
1863   else if (tk == tk_char)
1864     {
1865       char tmp[2];
1866       int val;
1867       if (**mangled == 'm')
1868         {
1869           string_appendn (s, "-", 1);
1870           (*mangled)++;
1871         }
1872       string_appendn (s, "'", 1);
1873       val = consume_count(mangled);
1874       if (val <= 0)
1875         success = 0;
1876       else
1877         {
1878           tmp[0] = (char)val;
1879           tmp[1] = '\0';
1880           string_appendn (s, &tmp[0], 1);
1881           string_appendn (s, "'", 1);
1882         }
1883     }
1884   else if (tk == tk_bool)
1885     {
1886       int val = consume_count (mangled);
1887       if (val == 0)
1888         string_appendn (s, "false", 5);
1889       else if (val == 1)
1890         string_appendn (s, "true", 4);
1891       else
1892         success = 0;
1893     }
1894   else if (tk == tk_real)
1895     success = demangle_real_value (work, mangled, s);
1896   else if (tk == tk_pointer || tk == tk_reference)
1897     {
1898       if (**mangled == 'Q')
1899         success = demangle_qualified (work, mangled, s,
1900                                       /*isfuncname=*/0, 
1901                                       /*append=*/1);
1902       else
1903         {
1904           int symbol_len  = consume_count (mangled);
1905           if (symbol_len == -1)
1906             return -1;
1907           if (symbol_len == 0)
1908             string_appendn (s, "0", 1);
1909           else
1910             {
1911               char *p = XNEWVEC (char, symbol_len + 1), *q;
1912               strncpy (p, *mangled, symbol_len);
1913               p [symbol_len] = '\0';
1914               /* We use cplus_demangle here, rather than
1915                  internal_cplus_demangle, because the name of the entity
1916                  mangled here does not make use of any of the squangling
1917                  or type-code information we have built up thus far; it is
1918                  mangled independently.  */
1919               q = ML_(cplus_demangle) (p, work->options);
1920               if (tk == tk_pointer)
1921                 string_appendn (s, "&", 1);
1922               /* FIXME: Pointer-to-member constants should get a
1923                  qualifying class name here.  */
1924               if (q)
1925                 {
1926                   string_append (s, q);
1927                   free (q);
1928                 }
1929               else
1930                 string_append (s, p);
1931               free (p);
1932             }
1933           *mangled += symbol_len;
1934         }
1935     }
1936
1937   return success;
1938 }
1939
1940 /* Demangle the template name in MANGLED.  The full name of the
1941    template (e.g., S<int>) is placed in TNAME.  The name without the
1942    template parameters (e.g. S) is placed in TRAWNAME if TRAWNAME is
1943    non-NULL.  If IS_TYPE is nonzero, this template is a type template,
1944    not a function template.  If both IS_TYPE and REMEMBER are nonzero,
1945    the template is remembered in the list of back-referenceable
1946    types.  */
1947
1948 static int
1949 demangle_template (struct work_stuff *work, const char **mangled,
1950                    string *tname, string *trawname,
1951                    int is_type, int remember)
1952 {
1953   int i;
1954   int r;
1955   int need_comma = 0;
1956   int success = 0;
1957   int is_java_array = 0;
1958   string temp;
1959
1960   (*mangled)++;
1961   if (is_type)
1962     {
1963       /* get template name */
1964       if (**mangled == 'z')
1965         {
1966           int idx;
1967           (*mangled)++;
1968           (*mangled)++;
1969
1970           idx = consume_count_with_underscores (mangled);
1971           if (idx == -1
1972               || (work->tmpl_argvec && idx >= work->ntmpl_args)
1973               || consume_count_with_underscores (mangled) == -1)
1974             return (0);
1975
1976           if (work->tmpl_argvec)
1977             {
1978               string_append (tname, work->tmpl_argvec[idx]);
1979               if (trawname)
1980                 string_append (trawname, work->tmpl_argvec[idx]);
1981             }
1982           else
1983             {
1984               string_append_template_idx (tname, idx);
1985               if (trawname)
1986                 string_append_template_idx (trawname, idx);
1987             }
1988         }
1989       else
1990         {
1991           if ((r = consume_count (mangled)) <= 0
1992               || (int) strlen (*mangled) < r)
1993             {
1994               return (0);
1995             }
1996           is_java_array = (work -> options & DMGL_JAVA)
1997             && strncmp (*mangled, "JArray1Z", 8) == 0;
1998           if (! is_java_array)
1999             {
2000               string_appendn (tname, *mangled, r);
2001             }
2002           if (trawname)
2003             string_appendn (trawname, *mangled, r);
2004           *mangled += r;
2005         }
2006     }
2007   if (!is_java_array)
2008     string_append (tname, "<");
2009   /* get size of template parameter list */
2010   if (!get_count (mangled, &r))
2011     {
2012       return (0);
2013     }
2014   if (!is_type)
2015     {
2016       /* Create an array for saving the template argument values. */
2017       work->tmpl_argvec = XNEWVEC (char *, r);
2018       work->ntmpl_args = r;
2019       for (i = 0; i < r; i++)
2020         work->tmpl_argvec[i] = 0;
2021     }
2022   for (i = 0; i < r; i++)
2023     {
2024       if (need_comma)
2025         {
2026           string_append (tname, ", ");
2027         }
2028       /* Z for type parameters */
2029       if (**mangled == 'Z')
2030         {
2031           (*mangled)++;
2032           /* temp is initialized in do_type */
2033           success = do_type (work, mangled, &temp);
2034           if (success)
2035             {
2036               string_appends (tname, &temp);
2037
2038               if (!is_type)
2039                 {
2040                   /* Save the template argument. */
2041                   int len = temp.p - temp.b;
2042                   work->tmpl_argvec[i] = XNEWVEC (char, len + 1);
2043                   memcpy (work->tmpl_argvec[i], temp.b, len);
2044                   work->tmpl_argvec[i][len] = '\0';
2045                 }
2046             }
2047           string_delete(&temp);
2048           if (!success)
2049             {
2050               break;
2051             }
2052         }
2053       /* z for template parameters */
2054       else if (**mangled == 'z')
2055         {
2056           int r2;
2057           (*mangled)++;
2058           success = demangle_template_template_parm (work, mangled, tname);
2059
2060           if (success
2061               && (r2 = consume_count (mangled)) > 0
2062               && (int) strlen (*mangled) >= r2)
2063             {
2064               string_append (tname, " ");
2065               string_appendn (tname, *mangled, r2);
2066               if (!is_type)
2067                 {
2068                   /* Save the template argument. */
2069                   int len = r2;
2070                   work->tmpl_argvec[i] = XNEWVEC (char, len + 1);
2071                   memcpy (work->tmpl_argvec[i], *mangled, len);
2072                   work->tmpl_argvec[i][len] = '\0';
2073                 }
2074               *mangled += r2;
2075             }
2076           if (!success)
2077             {
2078               break;
2079             }
2080         }
2081       else
2082         {
2083           string  param;
2084           string* s;
2085
2086           /* otherwise, value parameter */
2087
2088           /* temp is initialized in do_type */
2089           success = do_type (work, mangled, &temp);
2090           string_delete(&temp);
2091           if (!success)
2092             break;
2093
2094           if (!is_type)
2095             {
2096               s = &param;
2097               string_init (s);
2098             }
2099           else
2100             s = tname;
2101
2102           success = demangle_template_value_parm (work, mangled, s,
2103                                                   (type_kind_t) success);
2104
2105           if (!success)
2106             {
2107               if (!is_type)
2108                 string_delete (s);
2109               success = 0;
2110               break;
2111             }
2112
2113           if (!is_type)
2114             {
2115               int len = s->p - s->b;
2116               work->tmpl_argvec[i] = XNEWVEC (char, len + 1);
2117               memcpy (work->tmpl_argvec[i], s->b, len);
2118               work->tmpl_argvec[i][len] = '\0';
2119
2120               string_appends (tname, s);
2121               string_delete (s);
2122             }
2123         }
2124       need_comma = 1;
2125     }
2126   if (is_java_array)
2127     {
2128       string_append (tname, "[]");
2129     }
2130   else
2131     {
2132       if (tname->p[-1] == '>')
2133         string_append (tname, " ");
2134       string_append (tname, ">");
2135     }
2136
2137   if (is_type && remember)
2138     {
2139       const int bindex = register_Btype (work);
2140       remember_Btype (work, tname->b, LEN_STRING (tname), bindex);
2141     }
2142
2143   /*
2144     if (work -> static_type)
2145     {
2146     string_append (declp, *mangled + 1);
2147     *mangled += strlen (*mangled);
2148     success = 1;
2149     }
2150     else
2151     {
2152     success = demangle_args (work, mangled, declp);
2153     }
2154     }
2155     */
2156   return (success);
2157 }
2158
2159 static int
2160 arm_pt (const char *mangled,
2161         int n, const char **anchor, const char **args)
2162 {
2163   /* Check if ARM template with "__pt__" in it ("parameterized type") */
2164   /* Allow HP also here, because HP's cfront compiler follows ARM to some extent */
2165   if ((ARM_DEMANGLING || HP_DEMANGLING) && (*anchor = strstr (mangled, "__pt__")))
2166     {
2167       int len;
2168       *args = *anchor + 6;
2169       len = consume_count (args);
2170       if (len == -1)
2171         return 0;
2172       if (*args + len == mangled + n && **args == '_')
2173         {
2174           ++*args;
2175           return 1;
2176         }
2177     }
2178   if (AUTO_DEMANGLING || EDG_DEMANGLING)
2179     {
2180       if ((*anchor = strstr (mangled, "__tm__"))
2181           || (*anchor = strstr (mangled, "__ps__"))
2182           || (*anchor = strstr (mangled, "__pt__")))
2183         {
2184           int len;
2185           *args = *anchor + 6;
2186           len = consume_count (args);
2187           if (len == -1)
2188             return 0;
2189           if (*args + len == mangled + n && **args == '_')
2190             {
2191               ++*args;
2192               return 1;
2193             }
2194         }
2195       else if ((*anchor = strstr (mangled, "__S")))
2196         {
2197           int len;
2198           *args = *anchor + 3;
2199           len = consume_count (args);
2200           if (len == -1)
2201             return 0;
2202           if (*args + len == mangled + n && **args == '_')
2203             {
2204               ++*args;
2205               return 1;
2206             }
2207         }
2208     }
2209
2210   return 0;
2211 }
2212
2213 static void
2214 demangle_arm_hp_template (struct work_stuff *work, const char **mangled,
2215                           int n, string *declp)
2216 {
2217   const char *p;
2218   const char *args;
2219   const char *e = *mangled + n;
2220   string arg;
2221
2222   /* Check for HP aCC template spec: classXt1t2 where t1, t2 are
2223      template args */
2224   if (HP_DEMANGLING && ((*mangled)[n] == 'X'))
2225     {
2226       char *start_spec_args = NULL;
2227       int hold_options;
2228
2229       /* First check for and omit template specialization pseudo-arguments,
2230          such as in "Spec<#1,#1.*>" */
2231       start_spec_args = strchr (*mangled, '<');
2232       if (start_spec_args && (start_spec_args - *mangled < n))
2233         string_appendn (declp, *mangled, start_spec_args - *mangled);
2234       else
2235         string_appendn (declp, *mangled, n);
2236       (*mangled) += n + 1;
2237       string_init (&arg);
2238       if (work->temp_start == -1) /* non-recursive call */
2239         work->temp_start = declp->p - declp->b;
2240
2241       /* We want to unconditionally demangle parameter types in
2242          template parameters.  */
2243       hold_options = work->options;
2244       work->options |= DMGL_PARAMS;
2245
2246       string_append (declp, "<");
2247       while (1)
2248         {
2249           string_delete (&arg);
2250           switch (**mangled)
2251             {
2252               case 'T':
2253                 /* 'T' signals a type parameter */
2254                 (*mangled)++;
2255                 if (!do_type (work, mangled, &arg))
2256                   goto hpacc_template_args_done;
2257                 break;
2258
2259               case 'U':
2260               case 'S':
2261                 /* 'U' or 'S' signals an integral value */
2262                 if (!do_hpacc_template_const_value (work, mangled, &arg))
2263                   goto hpacc_template_args_done;
2264                 break;
2265
2266               case 'A':
2267                 /* 'A' signals a named constant expression (literal) */
2268                 if (!do_hpacc_template_literal (work, mangled, &arg))
2269                   goto hpacc_template_args_done;
2270                 break;
2271
2272               default:
2273                 /* Today, 1997-09-03, we have only the above types
2274                    of template parameters */
2275                 /* FIXME: maybe this should fail and return null */
2276                 goto hpacc_template_args_done;
2277             }
2278           string_appends (declp, &arg);
2279          /* Check if we're at the end of template args.
2280              0 if at end of static member of template class,
2281              _ if done with template args for a function */
2282           if ((**mangled == '\000') || (**mangled == '_'))
2283             break;
2284           else
2285             string_append (declp, ",");
2286         }
2287     hpacc_template_args_done:
2288       string_append (declp, ">");
2289       string_delete (&arg);
2290       if (**mangled == '_')
2291         (*mangled)++;
2292       work->options = hold_options;
2293       return;
2294     }
2295   /* ARM template? (Also handles HP cfront extensions) */
2296   else if (arm_pt (*mangled, n, &p, &args))
2297     {
2298       int hold_options;
2299       string type_str;
2300
2301       string_init (&arg);
2302       string_appendn (declp, *mangled, p - *mangled);
2303       if (work->temp_start == -1)  /* non-recursive call */
2304         work->temp_start = declp->p - declp->b;
2305
2306       /* We want to unconditionally demangle parameter types in
2307          template parameters.  */
2308       hold_options = work->options;
2309       work->options |= DMGL_PARAMS;
2310
2311       string_append (declp, "<");
2312       /* should do error checking here */
2313       while (args < e) {
2314         string_delete (&arg);
2315
2316         /* Check for type or literal here */
2317         switch (*args)
2318           {
2319             /* HP cfront extensions to ARM for template args */
2320             /* spec: Xt1Lv1 where t1 is a type, v1 is a literal value */
2321             /* FIXME: We handle only numeric literals for HP cfront */
2322           case 'X':
2323             /* A typed constant value follows */
2324             args++;
2325             if (!do_type (work, &args, &type_str))
2326               goto cfront_template_args_done;
2327             string_append (&arg, "(");
2328             string_appends (&arg, &type_str);
2329             string_delete (&type_str);
2330             string_append (&arg, ")");
2331             if (*args != 'L')
2332               goto cfront_template_args_done;
2333             args++;
2334             /* Now snarf a literal value following 'L' */
2335             if (!snarf_numeric_literal (&args, &arg))
2336               goto cfront_template_args_done;
2337             break;
2338
2339           case 'L':
2340             /* Snarf a literal following 'L' */
2341             args++;
2342             if (!snarf_numeric_literal (&args, &arg))
2343               goto cfront_template_args_done;
2344             break;
2345           default:
2346             /* Not handling other HP cfront stuff */
2347             {
2348               const char* old_args = args;
2349               if (!do_type (work, &args, &arg))
2350                 goto cfront_template_args_done;
2351
2352               /* Fail if we didn't make any progress: prevent infinite loop. */
2353               if (args == old_args)
2354                 {
2355                   work->options = hold_options;
2356                   return;
2357                 }
2358             }
2359           }
2360         string_appends (declp, &arg);
2361         string_append (declp, ",");
2362       }
2363     cfront_template_args_done:
2364       string_delete (&arg);
2365       if (args >= e)
2366         --declp->p; /* remove extra comma */
2367       string_append (declp, ">");
2368       work->options = hold_options;
2369     }
2370   else if (n>10 && strncmp (*mangled, "_GLOBAL_", 8) == 0
2371            && (*mangled)[9] == 'N'
2372            && (*mangled)[8] == (*mangled)[10]
2373            && strchr (cplus_markers, (*mangled)[8]))
2374     {
2375       /* A member of the anonymous namespace.  */
2376       string_append (declp, "{anonymous}");
2377     }
2378   else
2379     {
2380       if (work->temp_start == -1) /* non-recursive call only */
2381         work->temp_start = 0;     /* disable in recursive calls */
2382       string_appendn (declp, *mangled, n);
2383     }
2384   *mangled += n;
2385 }
2386
2387 /* Extract a class name, possibly a template with arguments, from the
2388    mangled string; qualifiers, local class indicators, etc. have
2389    already been dealt with */
2390
2391 static int
2392 demangle_class_name (struct work_stuff *work, const char **mangled,
2393                      string *declp)
2394 {
2395   int n;
2396   int success = 0;
2397
2398   n = consume_count (mangled);
2399   if (n == -1)
2400     return 0;
2401   if ((int) strlen (*mangled) >= n)
2402     {
2403       demangle_arm_hp_template (work, mangled, n, declp);
2404       success = 1;
2405     }
2406
2407   return (success);
2408 }
2409
2410 /*
2411
2412 LOCAL FUNCTION
2413
2414         demangle_class -- demangle a mangled class sequence
2415
2416 SYNOPSIS
2417
2418         static int
2419         demangle_class (struct work_stuff *work, const char **mangled,
2420                         strint *declp)
2421
2422 DESCRIPTION
2423
2424         DECLP points to the buffer into which demangling is being done.
2425
2426         *MANGLED points to the current token to be demangled.  On input,
2427         it points to a mangled class (I.E. "3foo", "13verylongclass", etc.)
2428         On exit, it points to the next token after the mangled class on
2429         success, or the first unconsumed token on failure.
2430
2431         If the CONSTRUCTOR or DESTRUCTOR flags are set in WORK, then
2432         we are demangling a constructor or destructor.  In this case
2433         we prepend "class::class" or "class::~class" to DECLP.
2434
2435         Otherwise, we prepend "class::" to the current DECLP.
2436
2437         Reset the constructor/destructor flags once they have been
2438         "consumed".  This allows demangle_class to be called later during
2439         the same demangling, to do normal class demangling.
2440
2441         Returns 1 if demangling is successful, 0 otherwise.
2442
2443 */
2444
2445 static int
2446 demangle_class (struct work_stuff *work, const char **mangled, string *declp)
2447 {
2448   int success = 0;
2449   int btype;
2450   string class_name;
2451   char *save_class_name_end = 0;
2452
2453   string_init (&class_name);
2454   btype = register_Btype (work);
2455   if (demangle_class_name (work, mangled, &class_name))
2456     {
2457       save_class_name_end = class_name.p;
2458       if ((work->constructor & 1) || (work->destructor & 1))
2459         {
2460           /* adjust so we don't include template args */
2461           if (work->temp_start && (work->temp_start != -1))
2462             {
2463               class_name.p = class_name.b + work->temp_start;
2464             }
2465           string_prepends (declp, &class_name);
2466           if (work -> destructor & 1)
2467             {
2468               string_prepend (declp, "~");
2469               work -> destructor -= 1;
2470             }
2471           else
2472             {
2473               work -> constructor -= 1;
2474             }
2475         }
2476       class_name.p = save_class_name_end;
2477       remember_Ktype (work, class_name.b, LEN_STRING(&class_name));
2478       remember_Btype (work, class_name.b, LEN_STRING(&class_name), btype);
2479       string_prepend (declp, SCOPE_STRING (work));
2480       string_prepends (declp, &class_name);
2481       success = 1;
2482     }
2483   string_delete (&class_name);
2484   return (success);
2485 }
2486
2487
2488 /* Called when there's a "__" in the mangled name, with `scan' pointing to
2489    the rightmost guess.
2490
2491    Find the correct "__"-sequence where the function name ends and the
2492    signature starts, which is ambiguous with GNU mangling.
2493    Call demangle_signature here, so we can make sure we found the right
2494    one; *mangled will be consumed so caller will not make further calls to
2495    demangle_signature.  */
2496
2497 static int
2498 iterate_demangle_function (struct work_stuff *work, const char **mangled,
2499                            string *declp, const char *scan)
2500 {
2501   const char *mangle_init = *mangled;
2502   int success = 0;
2503   string decl_init;
2504   struct work_stuff work_init;
2505
2506   if (*(scan + 2) == '\0')
2507     return 0;
2508
2509   /* Do not iterate for some demangling modes, or if there's only one
2510      "__"-sequence.  This is the normal case.  */
2511   if (ARM_DEMANGLING || LUCID_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING
2512       || strstr (scan + 2, "__") == NULL)
2513     return demangle_function_name (work, mangled, declp, scan);
2514
2515   /* Save state so we can restart if the guess at the correct "__" was
2516      wrong.  */
2517   string_init (&decl_init);
2518   string_appends (&decl_init, declp);
2519   memset (&work_init, 0, sizeof work_init);
2520   work_stuff_copy_to_from (&work_init, work);
2521
2522   /* Iterate over occurrences of __, allowing names and types to have a
2523      "__" sequence in them.  We must start with the first (not the last)
2524      occurrence, since "__" most often occur between independent mangled
2525      parts, hence starting at the last occurence inside a signature
2526      might get us a "successful" demangling of the signature.  */
2527
2528   while (scan[2])
2529     {
2530       if (demangle_function_name (work, mangled, declp, scan))
2531         {
2532           success = demangle_signature (work, mangled, declp);
2533           if (success)
2534             break;
2535         }
2536
2537       /* Reset demangle state for the next round.  */
2538       *mangled = mangle_init;
2539       string_clear (declp);
2540       string_appends (declp, &decl_init);
2541       work_stuff_copy_to_from (work, &work_init);
2542
2543       /* Leave this underscore-sequence.  */
2544       scan += 2;
2545
2546       /* Scan for the next "__" sequence.  */
2547       while (*scan && (scan[0] != '_' || scan[1] != '_'))
2548         scan++;
2549
2550       /* Move to last "__" in this sequence.  */
2551       while (*scan && *scan == '_')
2552         scan++;
2553       scan -= 2;
2554     }
2555
2556   /* Delete saved state.  */
2557   delete_work_stuff (&work_init);
2558   string_delete (&decl_init);
2559
2560   return success;
2561 }
2562
2563 /*
2564
2565 LOCAL FUNCTION
2566
2567         demangle_prefix -- consume the mangled name prefix and find signature
2568
2569 SYNOPSIS
2570
2571         static int
2572         demangle_prefix (struct work_stuff *work, const char **mangled,
2573                          string *declp);
2574
2575 DESCRIPTION
2576
2577         Consume and demangle the prefix of the mangled name.
2578         While processing the function name root, arrange to call
2579         demangle_signature if the root is ambiguous.
2580
2581         DECLP points to the string buffer into which demangled output is
2582         placed.  On entry, the buffer is empty.  On exit it contains
2583         the root function name, the demangled operator name, or in some
2584         special cases either nothing or the completely demangled result.
2585
2586         MANGLED points to the current pointer into the mangled name.  As each
2587         token of the mangled name is consumed, it is updated.  Upon entry
2588         the current mangled name pointer points to the first character of
2589         the mangled name.  Upon exit, it should point to the first character
2590         of the signature if demangling was successful, or to the first
2591         unconsumed character if demangling of the prefix was unsuccessful.
2592
2593         Returns 1 on success, 0 otherwise.
2594  */
2595
2596 static int
2597 demangle_prefix (struct work_stuff *work, const char **mangled,
2598                  string *declp)
2599 {
2600   int success = 1;
2601   const char *scan;
2602   int i;
2603
2604   if (strlen(*mangled) > 6
2605       && (strncmp(*mangled, "_imp__", 6) == 0
2606           || strncmp(*mangled, "__imp_", 6) == 0))
2607     {
2608       /* it's a symbol imported from a PE dynamic library. Check for both
2609          new style prefix _imp__ and legacy __imp_ used by older versions
2610          of dlltool. */
2611       (*mangled) += 6;
2612       work->dllimported = 1;
2613     }
2614   else if (strlen(*mangled) >= 11 && strncmp(*mangled, "_GLOBAL_", 8) == 0)
2615     {
2616       char *marker = strchr (cplus_markers, (*mangled)[8]);
2617       if (marker != NULL && *marker == (*mangled)[10])
2618         {
2619           if ((*mangled)[9] == 'D')
2620             {
2621               /* it's a GNU global destructor to be executed at program exit */
2622               (*mangled) += 11;
2623               work->destructor = 2;
2624               if (gnu_special (work, mangled, declp))
2625                 return success;
2626             }
2627           else if ((*mangled)[9] == 'I')
2628             {
2629               /* it's a GNU global constructor to be executed at program init */
2630               (*mangled) += 11;
2631               work->constructor = 2;
2632               if (gnu_special (work, mangled, declp))
2633                 return success;
2634             }
2635         }
2636     }
2637   else if ((ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) && strncmp(*mangled, "__std__", 7) == 0)
2638     {
2639       /* it's a ARM global destructor to be executed at program exit */
2640       (*mangled) += 7;
2641       work->destructor = 2;
2642     }
2643   else if ((ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) && strncmp(*mangled, "__sti__", 7) == 0)
2644     {
2645       /* it's a ARM global constructor to be executed at program initial */
2646       (*mangled) += 7;
2647       work->constructor = 2;
2648     }
2649
2650   /*  This block of code is a reduction in strength time optimization
2651       of:
2652       scan = strstr (*mangled, "__"); */
2653
2654   {
2655     scan = *mangled;
2656
2657     do {
2658       scan = strchr (scan, '_');
2659     } while (scan != NULL && *++scan != '_');
2660
2661     if (scan != NULL) --scan;
2662   }
2663
2664   if (scan != NULL)
2665     {
2666       /* We found a sequence of two or more '_', ensure that we start at
2667          the last pair in the sequence.  */
2668       i = strspn (scan, "_");
2669       if (i > 2)
2670         {
2671           scan += (i - 2);
2672         }
2673     }
2674
2675   if (scan == NULL)
2676     {
2677       success = 0;
2678     }
2679   else if (work -> static_type)
2680     {
2681       if (!ISDIGIT ((unsigned char)scan[0]) && (scan[0] != 't'))
2682         {
2683           success = 0;
2684         }
2685     }
2686   else if ((scan == *mangled)
2687            && (ISDIGIT ((unsigned char)scan[2]) || (scan[2] == 'Q')
2688                || (scan[2] == 't') || (scan[2] == 'K') || (scan[2] == 'H')))
2689     {
2690       /* The ARM says nothing about the mangling of local variables.
2691          But cfront mangles local variables by prepending __<nesting_level>
2692          to them. As an extension to ARM demangling we handle this case.  */
2693       if ((LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING)
2694           && ISDIGIT ((unsigned char)scan[2]))
2695         {
2696           *mangled = scan + 2;
2697           consume_count (mangled);
2698           string_append (declp, *mangled);
2699           *mangled += strlen (*mangled);
2700           success = 1;
2701         }
2702       else
2703         {
2704           /* A GNU style constructor starts with __[0-9Qt].  But cfront uses
2705              names like __Q2_3foo3bar for nested type names.  So don't accept
2706              this style of constructor for cfront demangling.  A GNU
2707              style member-template constructor starts with 'H'. */
2708           if (!(LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING))
2709             work -> constructor += 1;
2710           *mangled = scan + 2;
2711         }
2712     }
2713   else if (ARM_DEMANGLING && scan[2] == 'p' && scan[3] == 't')
2714     {
2715       /* Cfront-style parameterized type.  Handled later as a signature. */
2716       success = 1;
2717
2718       /* ARM template? */
2719       demangle_arm_hp_template (work, mangled, strlen (*mangled), declp);
2720     }
2721   else if (EDG_DEMANGLING && ((scan[2] == 't' && scan[3] == 'm')
2722                               || (scan[2] == 'p' && scan[3] == 's')
2723                               || (scan[2] == 'p' && scan[3] == 't')))
2724     {
2725       /* EDG-style parameterized type.  Handled later as a signature. */
2726       success = 1;
2727
2728       /* EDG template? */
2729       demangle_arm_hp_template (work, mangled, strlen (*mangled), declp);
2730     }
2731   else if ((scan == *mangled) && !ISDIGIT ((unsigned char)scan[2])
2732            && (scan[2] != 't'))
2733     {
2734       /* Mangled name starts with "__".  Skip over any leading '_' characters,
2735          then find the next "__" that separates the prefix from the signature.
2736          */
2737       if (!(ARM_DEMANGLING || LUCID_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING)
2738           || (arm_special (mangled, declp) == 0))
2739         {
2740           while (*scan == '_')
2741             {
2742               scan++;
2743             }
2744           if ((scan = strstr (scan, "__")) == NULL || (*(scan + 2) == '\0'))
2745             {
2746               /* No separator (I.E. "__not_mangled"), or empty signature
2747                  (I.E. "__not_mangled_either__") */
2748               success = 0;
2749             }
2750           else
2751             return iterate_demangle_function (work, mangled, declp, scan);
2752         }
2753     }
2754   else if (*(scan + 2) != '\0')
2755     {
2756       /* Mangled name does not start with "__" but does have one somewhere
2757          in there with non empty stuff after it.  Looks like a global
2758          function name.  Iterate over all "__":s until the right
2759          one is found.  */
2760       return iterate_demangle_function (work, mangled, declp, scan);
2761     }
2762   else
2763     {
2764       /* Doesn't look like a mangled name */
2765       success = 0;
2766     }
2767
2768   if (!success && (work->constructor == 2 || work->destructor == 2))
2769     {
2770       string_append (declp, *mangled);
2771       *mangled += strlen (*mangled);
2772       success = 1;
2773     }
2774   return (success);
2775 }
2776
2777 /*
2778
2779 LOCAL FUNCTION
2780
2781         gnu_special -- special handling of gnu mangled strings
2782
2783 SYNOPSIS
2784
2785         static int
2786         gnu_special (struct work_stuff *work, const char **mangled,
2787                      string *declp);
2788
2789
2790 DESCRIPTION
2791
2792         Process some special GNU style mangling forms that don't fit
2793         the normal pattern.  For example:
2794
2795                 _$_3foo         (destructor for class foo)
2796                 _vt$foo         (foo virtual table)
2797                 _vt$foo$bar     (foo::bar virtual table)
2798                 __vt_foo        (foo virtual table, new style with thunks)
2799                 _3foo$varname   (static data member)
2800                 _Q22rs2tu$vw    (static data member)
2801                 __t6vector1Zii  (constructor with template)
2802                 __thunk_4__$_7ostream (virtual function thunk)
2803  */
2804
2805 static int
2806 gnu_special (struct work_stuff *work, const char **mangled, string *declp)
2807 {
2808   int n;
2809   int success = 1;
2810   const char *p;
2811
2812   if ((*mangled)[0] == '_'
2813       && strchr (cplus_markers, (*mangled)[1]) != NULL
2814       && (*mangled)[2] == '_')
2815     {
2816       /* Found a GNU style destructor, get past "_<CPLUS_MARKER>_" */
2817       (*mangled) += 3;
2818       work -> destructor += 1;
2819     }
2820   else if ((*mangled)[0] == '_'
2821            && (((*mangled)[1] == '_'
2822                 && (*mangled)[2] == 'v'
2823                 && (*mangled)[3] == 't'
2824                 && (*mangled)[4] == '_')
2825                || ((*mangled)[1] == 'v'
2826                    && (*mangled)[2] == 't'
2827                    && strchr (cplus_markers, (*mangled)[3]) != NULL)))
2828     {
2829       /* Found a GNU style virtual table, get past "_vt<CPLUS_MARKER>"
2830          and create the decl.  Note that we consume the entire mangled
2831          input string, which means that demangle_signature has no work
2832          to do.  */
2833       if ((*mangled)[2] == 'v')
2834         (*mangled) += 5; /* New style, with thunks: "__vt_" */
2835       else
2836         (*mangled) += 4; /* Old style, no thunks: "_vt<CPLUS_MARKER>" */
2837       while (**mangled != '\0')
2838         {
2839           switch (**mangled)
2840             {
2841             case 'Q':
2842             case 'K':
2843               success = demangle_qualified (work, mangled, declp, 0, 1);
2844               break;
2845             case 't':
2846               success = demangle_template (work, mangled, declp, 0, 1,
2847                                            1);
2848               break;
2849             default:
2850               if (ISDIGIT((unsigned char)*mangled[0]))
2851                 {
2852                   n = consume_count(mangled);
2853                   /* We may be seeing a too-large size, or else a
2854                      ".<digits>" indicating a static local symbol.  In
2855                      any case, declare victory and move on; *don't* try
2856                      to use n to allocate.  */
2857                   if (n > (int) strlen (*mangled))
2858                     {
2859                       success = 1;
2860                       break;
2861                     }
2862                 }
2863               else
2864                 {
2865                   n = strcspn (*mangled, cplus_markers);
2866                 }
2867               string_appendn (declp, *mangled, n);
2868               (*mangled) += n;
2869             }
2870
2871           p = strpbrk (*mangled, cplus_markers);
2872           if (success && ((p == NULL) || (p == *mangled)))
2873             {
2874               if (p != NULL)
2875                 {
2876                   string_append (declp, SCOPE_STRING (work));
2877                   (*mangled)++;
2878                 }
2879             }
2880           else
2881             {
2882               success = 0;
2883               break;
2884             }
2885         }
2886       if (success)
2887         string_append (declp, " virtual table");
2888     }
2889   else if ((*mangled)[0] == '_'
2890            && (strchr("0123456789Qt", (*mangled)[1]) != NULL)
2891            && (p = strpbrk (*mangled, cplus_markers)) != NULL)
2892     {
2893       /* static data member, "_3foo$varname" for example */
2894       (*mangled)++;
2895       switch (**mangled)
2896         {
2897         case 'Q':
2898         case 'K':
2899           success = demangle_qualified (work, mangled, declp, 0, 1);
2900           break;
2901         case 't':
2902           success = demangle_template (work, mangled, declp, 0, 1, 1);
2903           break;
2904         default:
2905           n = consume_count (mangled);
2906           if (n < 0 || n > (long) strlen (*mangled))
2907             {
2908               success = 0;
2909               break;
2910             }
2911
2912           if (n > 10 && strncmp (*mangled, "_GLOBAL_", 8) == 0
2913               && (*mangled)[9] == 'N'
2914               && (*mangled)[8] == (*mangled)[10]
2915               && strchr (cplus_markers, (*mangled)[8]))
2916             {
2917               /* A member of the anonymous namespace.  There's information
2918                  about what identifier or filename it was keyed to, but
2919                  it's just there to make the mangled name unique; we just
2920                  step over it.  */
2921               string_append (declp, "{anonymous}");
2922               (*mangled) += n;
2923
2924               /* Now p points to the marker before the N, so we need to
2925                  update it to the first marker after what we consumed.  */
2926               p = strpbrk (*mangled, cplus_markers);
2927               break;
2928             }
2929
2930           string_appendn (declp, *mangled, n);
2931           (*mangled) += n;
2932         }
2933       if (success && (p == *mangled))
2934         {
2935           /* Consumed everything up to the cplus_marker, append the
2936              variable name.  */
2937           (*mangled)++;
2938           string_append (declp, SCOPE_STRING (work));
2939           n = strlen (*mangled);
2940           string_appendn (declp, *mangled, n);
2941           (*mangled) += n;
2942         }
2943       else
2944         {
2945           success = 0;
2946         }
2947     }
2948   else if (strncmp (*mangled, "__thunk_", 8) == 0)
2949     {
2950       int delta;
2951
2952       (*mangled) += 8;
2953       delta = consume_count (mangled);
2954       if (delta == -1)
2955         success = 0;
2956       else
2957         {
2958           char *method = internal_cplus_demangle (work, ++*mangled);
2959
2960           if (method)
2961             {
2962               char buf[50];
2963               sprintf (buf, "virtual function thunk (delta:%d) for ", -delta);
2964               string_append (declp, buf);
2965               string_append (declp, method);
2966               free (method);
2967               n = strlen (*mangled);
2968               (*mangled) += n;
2969             }
2970           else
2971             {
2972               success = 0;
2973             }
2974         }
2975     }
2976   else if (strncmp (*mangled, "__t", 3) == 0
2977            && ((*mangled)[3] == 'i' || (*mangled)[3] == 'f'))
2978     {
2979       p = (*mangled)[3] == 'i' ? " type_info node" : " type_info function";
2980       (*mangled) += 4;
2981       switch (**mangled)
2982         {
2983         case 'Q':
2984         case 'K':
2985           success = demangle_qualified (work, mangled, declp, 0, 1);
2986           break;
2987         case 't':
2988           success = demangle_template (work, mangled, declp, 0, 1, 1);
2989           break;
2990         default:
2991           success = do_type (work, mangled, declp);
2992           break;
2993         }
2994       if (success && **mangled != '\0')
2995         success = 0;
2996       if (success)
2997         string_append (declp, p);
2998     }
2999   else
3000     {
3001       success = 0;
3002     }
3003   return (success);
3004 }
3005
3006 static void
3007 recursively_demangle(struct work_stuff *work, const char **mangled,
3008                      string *result, int namelength)
3009 {
3010   char * recurse = (char *)NULL;
3011   char * recurse_dem = (char *)NULL;
3012
3013   recurse = XNEWVEC (char, namelength + 1);
3014   memcpy (recurse, *mangled, namelength);
3015   recurse[namelength] = '\000';
3016
3017   recurse_dem = ML_(cplus_demangle) (recurse, work->options);
3018
3019   if (recurse_dem)
3020     {
3021       string_append (result, recurse_dem);
3022       free (recurse_dem);
3023     }
3024   else
3025     {
3026       string_appendn (result, *mangled, namelength);
3027     }
3028   free (recurse);
3029   *mangled += namelength;
3030 }
3031
3032 /*
3033
3034 LOCAL FUNCTION
3035
3036         arm_special -- special handling of ARM/lucid mangled strings
3037
3038 SYNOPSIS
3039
3040         static int
3041         arm_special (const char **mangled,
3042                      string *declp);
3043
3044
3045 DESCRIPTION
3046
3047         Process some special ARM style mangling forms that don't fit
3048         the normal pattern.  For example:
3049
3050                 __vtbl__3foo            (foo virtual table)
3051                 __vtbl__3foo__3bar      (bar::foo virtual table)
3052
3053  */
3054
3055 static int
3056 arm_special (const char **mangled, string *declp)
3057 {
3058   int n;
3059   int success = 1;
3060   const char *scan;
3061
3062   if (strncmp (*mangled, ARM_VTABLE_STRING, ARM_VTABLE_STRLEN) == 0)
3063     {
3064       /* Found a ARM style virtual table, get past ARM_VTABLE_STRING
3065          and create the decl.  Note that we consume the entire mangled
3066          input string, which means that demangle_signature has no work
3067          to do.  */
3068       scan = *mangled + ARM_VTABLE_STRLEN;
3069       while (*scan != '\0')        /* first check it can be demangled */
3070         {
3071           n = consume_count (&scan);
3072           if (n == -1)
3073             {
3074               return (0);           /* no good */
3075             }
3076           scan += n;
3077           if (scan[0] == '_' && scan[1] == '_')
3078             {
3079               scan += 2;
3080             }
3081         }
3082       (*mangled) += ARM_VTABLE_STRLEN;
3083       while (**mangled != '\0')
3084         {
3085           n = consume_count (mangled);
3086           if (n == -1
3087               || n > (long) strlen (*mangled))
3088             return 0;
3089           string_prependn (declp, *mangled, n);
3090           (*mangled) += n;
3091           if ((*mangled)[0] == '_' && (*mangled)[1] == '_')
3092             {
3093               string_prepend (declp, "::");
3094               (*mangled) += 2;
3095             }
3096         }
3097       string_append (declp, " virtual table");
3098     }
3099   else
3100     {
3101       success = 0;
3102     }
3103   return (success);
3104 }
3105
3106 /*
3107
3108 LOCAL FUNCTION
3109
3110         demangle_qualified -- demangle 'Q' qualified name strings
3111
3112 SYNOPSIS
3113
3114         static int
3115         demangle_qualified (struct work_stuff *, const char *mangled,
3116                             string *result, int isfuncname, int append);
3117
3118 DESCRIPTION
3119
3120         Demangle a qualified name, such as "Q25Outer5Inner" which is
3121         the mangled form of "Outer::Inner".  The demangled output is
3122         prepended or appended to the result string according to the
3123         state of the append flag.
3124
3125         If isfuncname is nonzero, then the qualified name we are building
3126         is going to be used as a member function name, so if it is a
3127         constructor or destructor function, append an appropriate
3128         constructor or destructor name.  I.E. for the above example,
3129         the result for use as a constructor is "Outer::Inner::Inner"
3130         and the result for use as a destructor is "Outer::Inner::~Inner".
3131
3132 BUGS
3133
3134         Numeric conversion is ASCII dependent (FIXME).
3135
3136  */
3137
3138 static int
3139 demangle_qualified (struct work_stuff *work, const char **mangled,
3140                     string *result, int isfuncname, int append)
3141 {
3142   int qualifiers = 0;
3143   int success = 1;
3144   char num[2];
3145   string temp;
3146   string last_name;
3147   int bindex = register_Btype (work);
3148
3149   /* We only make use of ISFUNCNAME if the entity is a constructor or
3150      destructor.  */
3151   isfuncname = (isfuncname
3152                 && ((work->constructor & 1) || (work->destructor & 1)));
3153
3154   string_init (&temp);
3155   string_init (&last_name);
3156
3157   if ((*mangled)[0] == 'K')
3158     {
3159     /* Squangling qualified name reuse */
3160       int idx;
3161       (*mangled)++;
3162       idx = consume_count_with_underscores (mangled);
3163       if (idx == -1 || idx >= work -> numk)
3164         success = 0;
3165       else
3166         string_append (&temp, work -> ktypevec[idx]);
3167     }
3168   else
3169     switch ((*mangled)[1])
3170     {
3171     case '_':
3172       /* GNU mangled name with more than 9 classes.  The count is preceded
3173          by an underscore (to distinguish it from the <= 9 case) and followed
3174          by an underscore.  */
3175       (*mangled)++;
3176       qualifiers = consume_count_with_underscores (mangled);
3177       if (qualifiers == -1)
3178         success = 0;
3179       break;
3180
3181     case '1':
3182     case '2':
3183     case '3':
3184     case '4':
3185     case '5':
3186     case '6':
3187     case '7':
3188     case '8':
3189     case '9':
3190       /* The count is in a single digit.  */
3191       num[0] = (*mangled)[1];
3192       num[1] = '\0';
3193       qualifiers = atoi (num);
3194
3195       /* If there is an underscore after the digit, skip it.  This is
3196          said to be for ARM-qualified names, but the ARM makes no
3197          mention of such an underscore.  Perhaps cfront uses one.  */
3198       if ((*mangled)[2] == '_')
3199         {
3200           (*mangled)++;
3201         }
3202       (*mangled) += 2;
3203       break;
3204
3205     case '0':
3206     default:
3207       success = 0;
3208     }
3209
3210   if (!success)
3211     return success;
3212
3213   /* Pick off the names and collect them in the temp buffer in the order
3214      in which they are found, separated by '::'.  */
3215
3216   while (qualifiers-- > 0)
3217     {
3218       int remember_K = 1;
3219       string_clear (&last_name);
3220
3221       if (*mangled[0] == '_')
3222         (*mangled)++;
3223
3224       if (*mangled[0] == 't')
3225         {
3226           /* Here we always append to TEMP since we will want to use
3227              the template name without the template parameters as a
3228              constructor or destructor name.  The appropriate
3229              (parameter-less) value is returned by demangle_template
3230              in LAST_NAME.  We do not remember the template type here,
3231              in order to match the G++ mangling algorithm.  */
3232           success = demangle_template(work, mangled, &temp,
3233                                       &last_name, 1, 0);
3234           if (!success)
3235             break;
3236         }
3237       else if (*mangled[0] == 'K')
3238         {
3239           int idx;
3240           (*mangled)++;
3241           idx = consume_count_with_underscores (mangled);
3242           if (idx == -1 || idx >= work->numk)
3243             success = 0;
3244           else
3245             string_append (&temp, work->ktypevec[idx]);
3246           remember_K = 0;
3247
3248           if (!success) break;
3249         }
3250       else
3251         {
3252           if (EDG_DEMANGLING)
3253             {
3254               int namelength;
3255               /* Now recursively demangle the qualifier
3256                * This is necessary to deal with templates in
3257                * mangling styles like EDG */
3258               namelength = consume_count (mangled);
3259               if (namelength == -1)
3260                 {
3261                   success = 0;
3262                   break;
3263                 }
3264               recursively_demangle(work, mangled, &temp, namelength);
3265             }
3266           else
3267             {
3268               string_delete (&last_name);
3269               success = do_type (work, mangled, &last_name);
3270               if (!success)
3271                 break;
3272               string_appends (&temp, &last_name);
3273             }
3274         }
3275
3276       if (remember_K)
3277         remember_Ktype (work, temp.b, LEN_STRING (&temp));
3278
3279       if (qualifiers > 0)
3280         string_append (&temp, SCOPE_STRING (work));
3281     }
3282
3283   remember_Btype (work, temp.b, LEN_STRING (&temp), bindex);
3284
3285   /* If we are using the result as a function name, we need to append
3286      the appropriate '::' separated constructor or destructor name.
3287      We do this here because this is the most convenient place, where
3288      we already have a pointer to the name and the length of the name.  */
3289
3290   if (isfuncname)
3291     {
3292       string_append (&temp, SCOPE_STRING (work));
3293       if (work -> destructor & 1)
3294         string_append (&temp, "~");
3295       string_appends (&temp, &last_name);
3296     }
3297
3298   /* Now either prepend the temp buffer to the result, or append it,
3299      depending upon the state of the append flag.  */
3300
3301   if (append)
3302     string_appends (result, &temp);
3303   else
3304     {
3305       if (!STRING_EMPTY (result))
3306         string_append (&temp, SCOPE_STRING (work));
3307       string_prepends (result, &temp);
3308     }
3309
3310   string_delete (&last_name);
3311   string_delete (&temp);
3312   return (success);
3313 }
3314
3315 /*
3316
3317 LOCAL FUNCTION
3318
3319         get_count -- convert an ascii count to integer, consuming tokens
3320
3321 SYNOPSIS
3322
3323         static int
3324         get_count (const char **type, int *count)
3325
3326 DESCRIPTION
3327
3328         Assume that *type points at a count in a mangled name; set
3329         *count to its value, and set *type to the next character after
3330         the count.  There are some weird rules in effect here.
3331
3332         If *type does not point at a string of digits, return zero.
3333
3334         If *type points at a string of digits followed by an
3335         underscore, set *count to their value as an integer, advance
3336         *type to point *after the underscore, and return 1.
3337
3338         If *type points at a string of digits not followed by an
3339         underscore, consume only the first digit.  Set *count to its
3340         value as an integer, leave *type pointing after that digit,
3341         and return 1.
3342
3343         The excuse for this odd behavior: in the ARM and HP demangling
3344         styles, a type can be followed by a repeat count of the form
3345         `Nxy', where:
3346
3347         `x' is a single digit specifying how many additional copies
3348             of the type to append to the argument list, and
3349
3350         `y' is one or more digits, specifying the zero-based index of
3351             the first repeated argument in the list.  Yes, as you're
3352             unmangling the name you can figure this out yourself, but
3353             it's there anyway.
3354
3355         So, for example, in `bar__3fooFPiN51', the first argument is a
3356         pointer to an integer (`Pi'), and then the next five arguments
3357         are the same (`N5'), and the first repeat is the function's
3358         second argument (`1').
3359 */
3360
3361 static int
3362 get_count (const char **type, int *count)
3363 {
3364   const char *p;
3365   int n;
3366
3367   if (!ISDIGIT ((unsigned char)**type))
3368     return (0);
3369   else
3370     {
3371       *count = **type - '0';
3372       (*type)++;
3373       if (ISDIGIT ((unsigned char)**type))
3374         {
3375           p = *type;
3376           n = *count;
3377           do
3378             {
3379               n *= 10;
3380               n += *p - '0';
3381               p++;
3382             }
3383           while (ISDIGIT ((unsigned char)*p));
3384           if (*p == '_')
3385             {
3386               *type = p + 1;
3387               *count = n;
3388             }
3389         }
3390     }
3391   return (1);
3392 }
3393
3394 /* RESULT will be initialised here; it will be freed on failure.  The
3395    value returned is really a type_kind_t.  */
3396
3397 static int
3398 do_type (struct work_stuff *work, const char **mangled, string *result)
3399 {
3400   int n;
3401   int done;
3402   int success;
3403   string decl;
3404   const char *remembered_type;
3405   int type_quals;
3406   type_kind_t tk = tk_none;
3407
3408   string_init (&decl);
3409   string_init (result);
3410
3411   done = 0;
3412   success = 1;
3413   while (success && !done)
3414     {
3415       int member;
3416       switch (**mangled)
3417         {
3418
3419           /* A pointer type */
3420         case 'P':
3421         case 'p':
3422           (*mangled)++;
3423           if (! (work -> options & DMGL_JAVA))
3424             string_prepend (&decl, "*");
3425           if (tk == tk_none)
3426             tk = tk_pointer;
3427           break;
3428
3429           /* A reference type */
3430         case 'R':
3431           (*mangled)++;
3432           string_prepend (&decl, "&");
3433           if (tk == tk_none)
3434             tk = tk_reference;
3435           break;
3436
3437           /* An array */
3438         case 'A':
3439           {
3440             ++(*mangled);
3441             if (!STRING_EMPTY (&decl)
3442                 && (decl.b[0] == '*' || decl.b[0] == '&'))
3443               {
3444                 string_prepend (&decl, "(");
3445                 string_append (&decl, ")");
3446               }
3447             string_append (&decl, "[");
3448             if (**mangled != '_')
3449               success = demangle_template_value_parm (work, mangled, &decl,
3450                                                       tk_integral);
3451             if (**mangled == '_')
3452               ++(*mangled);
3453             string_append (&decl, "]");
3454             break;
3455           }
3456
3457         /* A back reference to a previously seen type */
3458         case 'T':
3459           (*mangled)++;
3460           if (!get_count (mangled, &n) || n >= work -> ntypes)
3461             {
3462               success = 0;
3463             }
3464           else
3465             {
3466               remembered_type = work -> typevec[n];
3467               mangled = &remembered_type;
3468             }
3469           break;
3470
3471           /* A function */
3472         case 'F':
3473           (*mangled)++;
3474             if (!STRING_EMPTY (&decl)
3475                 && (decl.b[0] == '*' || decl.b[0] == '&'))
3476             {
3477               string_prepend (&decl, "(");
3478               string_append (&decl, ")");
3479             }
3480           /* After picking off the function args, we expect to either find the
3481              function return type (preceded by an '_') or the end of the
3482              string.  */
3483           if (!demangle_nested_args (work, mangled, &decl)
3484               || (**mangled != '_' && **mangled != '\0'))
3485             {
3486               success = 0;
3487               break;
3488             }
3489           if (success && (**mangled == '_'))
3490             (*mangled)++;
3491           break;
3492
3493         case 'M':
3494         case 'O':
3495           {
3496             type_quals = TYPE_UNQUALIFIED;
3497
3498             member = **mangled == 'M';
3499             (*mangled)++;
3500
3501             string_append (&decl, ")");
3502
3503             /* We don't need to prepend `::' for a qualified name;
3504                demangle_qualified will do that for us.  */
3505             if (**mangled != 'Q')
3506               string_prepend (&decl, SCOPE_STRING (work));
3507
3508             if (ISDIGIT ((unsigned char)**mangled))
3509               {
3510                 n = consume_count (mangled);
3511                 if (n == -1
3512                     || (int) strlen (*mangled) < n)
3513                   {
3514                     success = 0;
3515                     break;
3516                   }
3517                 string_prependn (&decl, *mangled, n);
3518                 *mangled += n;
3519               }
3520             else if (**mangled == 'X' || **mangled == 'Y')
3521               {
3522                 string temp;
3523                 do_type (work, mangled, &temp);
3524                 string_prepends (&decl, &temp);
3525                 string_delete (&temp);
3526               }
3527             else if (**mangled == 't')
3528               {
3529                 string temp;
3530                 string_init (&temp);
3531                 success = demangle_template (work, mangled, &temp,
3532                                              NULL, 1, 1);
3533                 if (success)
3534                   {
3535                     string_prependn (&decl, temp.b, temp.p - temp.b);
3536                     string_delete (&temp);
3537                   }
3538                 else
3539                   break;
3540               }
3541             else if (**mangled == 'Q')
3542               {
3543                 success = demangle_qualified (work, mangled, &decl,
3544                                               /*isfuncnam=*/0, 
3545                                               /*append=*/0);
3546                 if (!success)
3547                   break;
3548               }
3549             else
3550               {
3551                 success = 0;
3552                 break;
3553               }
3554
3555             string_prepend (&decl, "(");
3556             if (member)
3557               {
3558                 switch (**mangled)
3559                   {
3560                   case 'C':
3561                   case 'V':
3562                   case 'u':
3563                     type_quals |= code_for_qualifier (**mangled);
3564                     (*mangled)++;
3565                     break;
3566
3567                   default:
3568                     break;
3569                   }
3570
3571                 if (*(*mangled)++ != 'F')
3572                   {
3573                     success = 0;
3574                     break;
3575                   }
3576               }
3577             if ((member && !demangle_nested_args (work, mangled, &decl))
3578                 || **mangled != '_')
3579               {
3580                 success = 0;
3581                 break;
3582               }
3583             (*mangled)++;
3584             if (! PRINT_ANSI_QUALIFIERS)
3585               {
3586                 break;
3587               }
3588             if (type_quals != TYPE_UNQUALIFIED)
3589               {
3590                 APPEND_BLANK (&decl);
3591                 string_append (&decl, qualifier_string (type_quals));
3592               }
3593             break;
3594           }
3595         case 'G':
3596           (*mangled)++;
3597           break;
3598
3599         case 'C':
3600         case 'V':
3601         case 'u':
3602           if (PRINT_ANSI_QUALIFIERS)
3603             {
3604               if (!STRING_EMPTY (&decl))
3605                 string_prepend (&decl, " ");
3606
3607               string_prepend (&decl, demangle_qualifier (**mangled));
3608             }
3609           (*mangled)++;
3610           break;
3611           /*
3612             }
3613             */
3614
3615           /* fall through */
3616         default:
3617           done = 1;
3618           break;
3619         }
3620     }
3621
3622   if (success) switch (**mangled)
3623     {
3624       /* A qualified name, such as "Outer::Inner".  */
3625     case 'Q':
3626     case 'K':
3627       {
3628         success = demangle_qualified (work, mangled, result, 0, 1);
3629         break;
3630       }
3631
3632     /* A back reference to a previously seen squangled type */
3633     case 'B':
3634       (*mangled)++;
3635       if (!get_count (mangled, &n) || n >= work -> numb)
3636         success = 0;
3637       else
3638         string_append (result, work->btypevec[n]);
3639       break;
3640
3641     case 'X':
3642     case 'Y':
3643       /* A template parm.  We substitute the corresponding argument. */
3644       {
3645         int idx;
3646
3647         (*mangled)++;
3648         idx = consume_count_with_underscores (mangled);
3649
3650         if (idx == -1
3651             || (work->tmpl_argvec && idx >= work->ntmpl_args)
3652             || consume_count_with_underscores (mangled) == -1)
3653           {
3654             success = 0;
3655             break;
3656           }
3657
3658         if (work->tmpl_argvec)
3659           string_append (result, work->tmpl_argvec[idx]);
3660         else
3661           string_append_template_idx (result, idx);
3662
3663         success = 1;
3664       }
3665     break;
3666
3667     default:
3668       success = demangle_fund_type (work, mangled, result);
3669       if (tk == tk_none)
3670         tk = (type_kind_t) success;
3671       break;
3672     }
3673
3674   if (success)
3675     {
3676       if (!STRING_EMPTY (&decl))
3677         {
3678           string_append (result, " ");
3679           string_appends (result, &decl);
3680         }
3681     }
3682   else
3683     string_delete (result);
3684   string_delete (&decl);
3685
3686   if (success)
3687     /* Assume an integral type, if we're not sure.  */
3688     return (int) ((tk == tk_none) ? tk_integral : tk);
3689   else
3690     return 0;
3691 }
3692
3693 /* Given a pointer to a type string that represents a fundamental type
3694    argument (int, long, unsigned int, etc) in TYPE, a pointer to the
3695    string in which the demangled output is being built in RESULT, and
3696    the WORK structure, decode the types and add them to the result.
3697
3698    For example:
3699
3700         "Ci"    =>      "const int"
3701         "Sl"    =>      "signed long"
3702         "CUs"   =>      "const unsigned short"
3703
3704    The value returned is really a type_kind_t.  */
3705
3706 static int
3707 demangle_fund_type (struct work_stuff *work,
3708                     const char **mangled, string *result)
3709 {
3710   int done = 0;
3711   int success = 1;
3712   char buf[INTBUF_SIZE + 5 /* 'int%u_t' */];
3713   /* unsigned int dec = 0; */ /* JRS 2008-Oct-26: unused (see below) */
3714   type_kind_t tk = tk_integral;
3715
3716   /* First pick off any type qualifiers.  There can be more than one.  */
3717
3718   while (!done)
3719     {
3720       switch (**mangled)
3721         {
3722         case 'C':
3723         case 'V':
3724         case 'u':
3725           if (PRINT_ANSI_QUALIFIERS)
3726             {
3727               if (!STRING_EMPTY (result))
3728                 string_prepend (result, " ");
3729               string_prepend (result, demangle_qualifier (**mangled));
3730             }
3731           (*mangled)++;
3732           break;
3733         case 'U':
3734           (*mangled)++;
3735           APPEND_BLANK (result);
3736           string_append (result, "unsigned");
3737           break;
3738         case 'S': /* signed char only */
3739           (*mangled)++;
3740           APPEND_BLANK (result);
3741           string_append (result, "signed");
3742           break;
3743         case 'J':
3744           (*mangled)++;
3745           APPEND_BLANK (result);
3746           string_append (result, "__complex");
3747           break;
3748         default:
3749           done = 1;
3750           break;
3751         }
3752     }
3753
3754   /* Now pick off the fundamental type.  There can be only one.  */
3755
3756   switch (**mangled)
3757     {
3758     case '\0':
3759     case '_':
3760       break;
3761     case 'v':
3762       (*mangled)++;
3763       APPEND_BLANK (result);
3764       string_append (result, "void");
3765       break;
3766     case 'x':
3767       (*mangled)++;
3768       APPEND_BLANK (result);
3769       string_append (result, "long long");
3770       break;
3771     case 'l':
3772       (*mangled)++;
3773       APPEND_BLANK (result);
3774       string_append (result, "long");
3775       break;
3776     case 'i':
3777       (*mangled)++;
3778       APPEND_BLANK (result);
3779       string_append (result, "int");
3780       break;
3781     case 's':
3782       (*mangled)++;
3783       APPEND_BLANK (result);
3784       string_append (result, "short");
3785       break;
3786     case 'b':
3787       (*mangled)++;
3788       APPEND_BLANK (result);
3789       string_append (result, "bool");
3790       tk = tk_bool;
3791       break;
3792     case 'c':
3793       (*mangled)++;
3794       APPEND_BLANK (result);
3795       string_append (result, "char");
3796       tk = tk_char;
3797       break;
3798     case 'w':
3799       (*mangled)++;
3800       APPEND_BLANK (result);
3801       string_append (result, "wchar_t");
3802       tk = tk_char;
3803       break;
3804     case 'r':
3805       (*mangled)++;
3806       APPEND_BLANK (result);
3807       string_append (result, "long double");
3808       tk = tk_real;
3809       break;
3810     case 'd':
3811       (*mangled)++;
3812       APPEND_BLANK (result);
3813       string_append (result, "double");
3814       tk = tk_real;
3815       break;
3816     case 'f':
3817       (*mangled)++;
3818       APPEND_BLANK (result);
3819       string_append (result, "float");
3820       tk = tk_real;
3821       break;
3822     case 'G':
3823       (*mangled)++;
3824       if (!ISDIGIT ((unsigned char)**mangled))
3825         {
3826           success = 0;
3827           break;
3828         }
3829     case 'I':
3830       (*mangled)++;
3831       if (**mangled == '_')
3832         {
3833           int i;
3834           (*mangled)++;
3835           for (i = 0;
3836                i < (long) sizeof (buf) - 1 && **mangled && **mangled != '_';
3837                (*mangled)++, i++)
3838             buf[i] = **mangled;
3839           if (**mangled != '_')
3840             {
3841               success = 0;
3842               break;
3843             }
3844           buf[i] = '\0';
3845           (*mangled)++;
3846         }
3847       else
3848         {
3849           strncpy (buf, *mangled, 2);
3850           buf[2] = '\0';
3851           *mangled += min (strlen (*mangled), 2);
3852         }
3853       /* JRS 2008-Oct-26: the next two commented out lines have been
3854          replaced by the sprintf that follows.  This is to avoid use
3855          of sscanf.  This hack is merely copied from the old demangler
3856          port (by Michael Matz, Simon Hausmann?) -- I have no idea if
3857          it is really correct/safe, but it looks ok. */
3858       /*sscanf (buf, "%x", &dec);
3859       sprintf (buf, "int%u_t", dec);*/
3860       sprintf (buf, "%s", "intXX_t");
3861       /* end JRS 2008-Oct-26 */
3862       APPEND_BLANK (result);
3863       string_append (result, buf);
3864       break;
3865
3866       /* fall through */
3867       /* An explicit type, such as "6mytype" or "7integer" */
3868     case '0':
3869     case '1':
3870     case '2':
3871     case '3':
3872     case '4':
3873     case '5':
3874     case '6':
3875     case '7':
3876     case '8':
3877     case '9':
3878       {
3879         int bindex = register_Btype (work);
3880         string btype;
3881         string_init (&btype);
3882         if (demangle_class_name (work, mangled, &btype)) {
3883           remember_Btype (work, btype.b, LEN_STRING (&btype), bindex);
3884           APPEND_BLANK (result);
3885           string_appends (result, &btype);
3886         }
3887         else
3888           success = 0;
3889         string_delete (&btype);
3890         break;
3891       }
3892     case 't':
3893       {
3894         string btype;
3895         string_init (&btype);
3896         success = demangle_template (work, mangled, &btype, 0, 1, 1);
3897         string_appends (result, &btype);
3898         string_delete (&btype);
3899         break;
3900       }
3901     default:
3902       success = 0;
3903       break;
3904     }
3905
3906   return success ? ((int) tk) : 0;
3907 }
3908
3909
3910 /* Handle a template's value parameter for HP aCC (extension from ARM)
3911    **mangled points to 'S' or 'U' */
3912
3913 static int
3914 do_hpacc_template_const_value (struct work_stuff *work ATTRIBUTE_UNUSED,
3915                                const char **mangled, string *result)
3916 {
3917   int unsigned_const;
3918
3919   if (**mangled != 'U' && **mangled != 'S')
3920     return 0;
3921
3922   unsigned_const = (**mangled == 'U');
3923
3924   (*mangled)++;
3925
3926   switch (**mangled)
3927     {
3928       case 'N':
3929         string_append (result, "-");
3930         /* fall through */
3931       case 'P':
3932         (*mangled)++;
3933         break;
3934       case 'M':
3935         /* special case for -2^31 */
3936         string_append (result, "-2147483648");
3937         (*mangled)++;
3938         return 1;
3939       default:
3940         return 0;
3941     }
3942
3943   /* We have to be looking at an integer now */
3944   if (!(ISDIGIT ((unsigned char)**mangled)))
3945     return 0;
3946
3947   /* We only deal with integral values for template
3948      parameters -- so it's OK to look only for digits */
3949   while (ISDIGIT ((unsigned char)**mangled))
3950     {
3951       char_str[0] = **mangled;
3952       string_append (result, char_str);
3953       (*mangled)++;
3954     }
3955
3956   if (unsigned_const)
3957     string_append (result, "U");
3958
3959   /* FIXME? Some day we may have 64-bit (or larger :-) ) constants
3960      with L or LL suffixes. pai/1997-09-03 */
3961
3962   return 1; /* success */
3963 }
3964
3965 /* Handle a template's literal parameter for HP aCC (extension from ARM)
3966    **mangled is pointing to the 'A' */
3967
3968 static int
3969 do_hpacc_template_literal (struct work_stuff *work, const char **mangled,
3970                            string *result)
3971 {
3972   int literal_len = 0;
3973   char * recurse;
3974   char * recurse_dem;
3975
3976   if (**mangled != 'A')
3977     return 0;
3978
3979   (*mangled)++;
3980
3981   literal_len = consume_count (mangled);
3982
3983   if (literal_len <= 0)
3984     return 0;
3985
3986   /* Literal parameters are names of arrays, functions, etc.  and the
3987      canonical representation uses the address operator */
3988   string_append (result, "&");
3989
3990   /* Now recursively demangle the literal name */
3991   recurse = XNEWVEC (char, literal_len + 1);
3992   memcpy (recurse, *mangled, literal_len);
3993   recurse[literal_len] = '\000';
3994
3995   recurse_dem = ML_(cplus_demangle) (recurse, work->options);
3996
3997   if (recurse_dem)
3998     {
3999       string_append (result, recurse_dem);
4000       free (recurse_dem);
4001     }
4002   else
4003     {
4004       string_appendn (result, *mangled, literal_len);
4005     }
4006   (*mangled) += literal_len;
4007   free (recurse);
4008
4009   return 1;
4010 }
4011
4012 static int
4013 snarf_numeric_literal (const char **args, string *arg)
4014 {
4015   if (**args == '-')
4016     {
4017       char_str[0] = '-';
4018       string_append (arg, char_str);
4019       (*args)++;
4020     }
4021   else if (**args == '+')
4022     (*args)++;
4023
4024   if (!ISDIGIT ((unsigned char)**args))
4025     return 0;
4026
4027   while (ISDIGIT ((unsigned char)**args))
4028     {
4029       char_str[0] = **args;
4030       string_append (arg, char_str);
4031       (*args)++;
4032     }
4033
4034   return 1;
4035 }
4036
4037 /* Demangle the next argument, given by MANGLED into RESULT, which
4038    *should be an uninitialized* string.  It will be initialized here,
4039    and free'd should anything go wrong.  */
4040
4041 static int
4042 do_arg (struct work_stuff *work, const char **mangled, string *result)
4043 {
4044   /* Remember where we started so that we can record the type, for
4045      non-squangling type remembering.  */
4046   const char *start = *mangled;
4047
4048   string_init (result);
4049
4050   if (work->nrepeats > 0)
4051     {
4052       --work->nrepeats;
4053
4054       if (work->previous_argument == 0)
4055         return 0;
4056
4057       /* We want to reissue the previous type in this argument list.  */
4058       string_appends (result, work->previous_argument);
4059       return 1;
4060     }
4061
4062   if (**mangled == 'n')
4063     {
4064       /* A squangling-style repeat.  */
4065       (*mangled)++;
4066       work->nrepeats = consume_count(mangled);
4067
4068       if (work->nrepeats <= 0)
4069         /* This was not a repeat count after all.  */
4070         return 0;
4071
4072       if (work->nrepeats > 9)
4073         {
4074           if (**mangled != '_')
4075             /* The repeat count should be followed by an '_' in this
4076                case.  */
4077             return 0;
4078           else
4079             (*mangled)++;
4080         }
4081
4082       /* Now, the repeat is all set up.  */
4083       return do_arg (work, mangled, result);
4084     }
4085
4086   /* Save the result in WORK->previous_argument so that we can find it
4087      if it's repeated.  Note that saving START is not good enough: we
4088      do not want to add additional types to the back-referenceable
4089      type vector when processing a repeated type.  */
4090   if (work->previous_argument)
4091     string_delete (work->previous_argument);
4092   else
4093     work->previous_argument = XNEW (string);
4094
4095   if (!do_type (work, mangled, work->previous_argument))
4096     return 0;
4097
4098   string_appends (result, work->previous_argument);
4099
4100   remember_type (work, start, *mangled - start);
4101   return 1;
4102 }
4103
4104 static void
4105 remember_type (struct work_stuff *work, const char *start, int len)
4106 {
4107   char *tem;
4108
4109   if (work->forgetting_types)
4110     return;
4111
4112   if (work -> ntypes >= work -> typevec_size)
4113     {
4114       if (work -> typevec_size == 0)
4115         {
4116           work -> typevec_size = 3;
4117           work -> typevec = XNEWVEC (char *, work->typevec_size);
4118         }
4119       else
4120         {
4121           work -> typevec_size *= 2;
4122           work -> typevec
4123             = XRESIZEVEC (char *, work->typevec, work->typevec_size);
4124         }
4125     }
4126   tem = XNEWVEC (char, len + 1);
4127   memcpy (tem, start, len);
4128   tem[len] = '\0';
4129   work -> typevec[work -> ntypes++] = tem;
4130 }
4131
4132
4133 /* Remember a K type class qualifier. */
4134 static void
4135 remember_Ktype (struct work_stuff *work, const char *start, int len)
4136 {
4137   char *tem;
4138
4139   if (work -> numk >= work -> ksize)
4140     {
4141       if (work -> ksize == 0)
4142         {
4143           work -> ksize = 5;
4144           work -> ktypevec = XNEWVEC (char *, work->ksize);
4145         }
4146       else
4147         {
4148           work -> ksize *= 2;
4149           work -> ktypevec
4150             = XRESIZEVEC (char *, work->ktypevec, work->ksize);
4151         }
4152     }
4153   tem = XNEWVEC (char, len + 1);
4154   memcpy (tem, start, len);
4155   tem[len] = '\0';
4156   work -> ktypevec[work -> numk++] = tem;
4157 }
4158
4159 /* Register a B code, and get an index for it. B codes are registered
4160    as they are seen, rather than as they are completed, so map<temp<char> >
4161    registers map<temp<char> > as B0, and temp<char> as B1 */
4162
4163 static int
4164 register_Btype (struct work_stuff *work)
4165 {
4166   int ret;
4167
4168   if (work -> numb >= work -> bsize)
4169     {
4170       if (work -> bsize == 0)
4171         {
4172           work -> bsize = 5;
4173           work -> btypevec = XNEWVEC (char *, work->bsize);
4174         }
4175       else
4176         {
4177           work -> bsize *= 2;
4178           work -> btypevec
4179             = XRESIZEVEC (char *, work->btypevec, work->bsize);
4180         }
4181     }
4182   ret = work -> numb++;
4183   work -> btypevec[ret] = NULL;
4184   return(ret);
4185 }
4186
4187 /* Store a value into a previously registered B code type. */
4188
4189 static void
4190 remember_Btype (struct work_stuff *work, const char *start,
4191                 int len, int indx)
4192 {
4193   char *tem;
4194
4195   tem = XNEWVEC (char, len + 1);
4196   memcpy (tem, start, len);
4197   tem[len] = '\0';
4198   work -> btypevec[indx] = tem;
4199 }
4200
4201 /* Lose all the info related to B and K type codes. */
4202 static void
4203 forget_B_and_K_types (struct work_stuff *work)
4204 {
4205   int i;
4206
4207   while (work -> numk > 0)
4208     {
4209       i = --(work -> numk);
4210       if (work -> ktypevec[i] != NULL)
4211         {
4212           free (work -> ktypevec[i]);
4213           work -> ktypevec[i] = NULL;
4214         }
4215     }
4216
4217   while (work -> numb > 0)
4218     {
4219       i = --(work -> numb);
4220       if (work -> btypevec[i] != NULL)
4221         {
4222           free (work -> btypevec[i]);
4223           work -> btypevec[i] = NULL;
4224         }
4225     }
4226 }
4227 /* Forget the remembered types, but not the type vector itself.  */
4228
4229 static void
4230 forget_types (struct work_stuff *work)
4231 {
4232   int i;
4233
4234   while (work -> ntypes > 0)
4235     {
4236       i = --(work -> ntypes);
4237       if (work -> typevec[i] != NULL)
4238         {
4239           free (work -> typevec[i]);
4240           work -> typevec[i] = NULL;
4241         }
4242     }
4243 }
4244
4245 /* Process the argument list part of the signature, after any class spec
4246    has been consumed, as well as the first 'F' character (if any).  For
4247    example:
4248
4249    "__als__3fooRT0"             =>      process "RT0"
4250    "complexfunc5__FPFPc_PFl_i"  =>      process "PFPc_PFl_i"
4251
4252    DECLP must be already initialised, usually non-empty.  It won't be freed
4253    on failure.
4254
4255    Note that g++ differs significantly from ARM and lucid style mangling
4256    with regards to references to previously seen types.  For example, given
4257    the source fragment:
4258
4259      class foo {
4260        public:
4261        foo::foo (int, foo &ia, int, foo &ib, int, foo &ic);
4262      };
4263
4264      foo::foo (int, foo &ia, int, foo &ib, int, foo &ic) { ia = ib = ic; }
4265      void foo (int, foo &ia, int, foo &ib, int, foo &ic) { ia = ib = ic; }
4266
4267    g++ produces the names:
4268
4269      __3fooiRT0iT2iT2
4270      foo__FiR3fooiT1iT1
4271
4272    while lcc (and presumably other ARM style compilers as well) produces:
4273
4274      foo__FiR3fooT1T2T1T2
4275      __ct__3fooFiR3fooT1T2T1T2
4276
4277    Note that g++ bases its type numbers starting at zero and counts all
4278    previously seen types, while lucid/ARM bases its type numbers starting
4279    at one and only considers types after it has seen the 'F' character
4280    indicating the start of the function args.  For lucid/ARM style, we
4281    account for this difference by discarding any previously seen types when
4282    we see the 'F' character, and subtracting one from the type number
4283    reference.
4284
4285  */
4286
4287 static int
4288 demangle_args (struct work_stuff *work, const char **mangled,
4289                string *declp)
4290 {
4291   string arg;
4292   int need_comma = 0;
4293   int r;
4294   int t;
4295   const char *tem;
4296   char temptype;
4297
4298   if (PRINT_ARG_TYPES)
4299     {
4300       string_append (declp, "(");
4301       if (**mangled == '\0')
4302         {
4303           string_append (declp, "void");
4304         }
4305     }
4306
4307   while ((**mangled != '_' && **mangled != '\0' && **mangled != 'e')
4308          || work->nrepeats > 0)
4309     {
4310       if ((**mangled == 'N') || (**mangled == 'T'))
4311         {
4312           temptype = *(*mangled)++;
4313
4314           if (temptype == 'N')
4315             {
4316               if (!get_count (mangled, &r))
4317                 {
4318                   return (0);
4319                 }
4320             }
4321           else
4322             {
4323               r = 1;
4324             }
4325           if ((HP_DEMANGLING || ARM_DEMANGLING || EDG_DEMANGLING) && work -> ntypes >= 10)
4326             {
4327               /* If we have 10 or more types we might have more than a 1 digit
4328                  index so we'll have to consume the whole count here. This
4329                  will lose if the next thing is a type name preceded by a
4330                  count but it's impossible to demangle that case properly
4331                  anyway. Eg if we already have 12 types is T12Pc "(..., type1,
4332                  Pc, ...)"  or "(..., type12, char *, ...)" */
4333               if ((t = consume_count(mangled)) <= 0)
4334                 {
4335                   return (0);
4336                 }
4337             }
4338           else
4339             {
4340               if (!get_count (mangled, &t))
4341                 {
4342                   return (0);
4343                 }
4344             }
4345           if (LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING)
4346             {
4347               t--;
4348             }
4349           /* Validate the type index.  Protect against illegal indices from
4350              malformed type strings.  */
4351           if ((t < 0) || (t >= work -> ntypes))
4352             {
4353               return (0);
4354             }
4355           while (work->nrepeats > 0 || --r >= 0)
4356             {
4357               tem = work -> typevec[t];
4358               if (need_comma && PRINT_ARG_TYPES)
4359                 {
4360                   string_append (declp, ", ");
4361                 }
4362               if (!do_arg (work, &tem, &arg))
4363                 {
4364                   return (0);
4365                 }
4366               if (PRINT_ARG_TYPES)
4367                 {
4368                   string_appends (declp, &arg);
4369                 }
4370               string_delete (&arg);
4371               need_comma = 1;
4372             }
4373         }
4374       else
4375         {
4376           if (need_comma && PRINT_ARG_TYPES)
4377             string_append (declp, ", ");
4378           if (!do_arg (work, mangled, &arg))
4379             return (0);
4380           if (PRINT_ARG_TYPES)
4381             string_appends (declp, &arg);
4382           string_delete (&arg);
4383           need_comma = 1;
4384         }
4385     }
4386
4387   if (**mangled == 'e')
4388     {
4389       (*mangled)++;
4390       if (PRINT_ARG_TYPES)
4391         {
4392           if (need_comma)
4393             {
4394               string_append (declp, ",");
4395             }
4396           string_append (declp, "...");
4397         }
4398     }
4399
4400   if (PRINT_ARG_TYPES)
4401     {
4402       string_append (declp, ")");
4403     }
4404   return (1);
4405 }
4406
4407 /* Like demangle_args, but for demangling the argument lists of function
4408    and method pointers or references, not top-level declarations.  */
4409
4410 static int
4411 demangle_nested_args (struct work_stuff *work, const char **mangled,
4412                       string *declp)
4413 {
4414   string* saved_previous_argument;
4415   int result;
4416   int saved_nrepeats;
4417
4418   /* The G++ name-mangling algorithm does not remember types on nested
4419      argument lists, unless -fsquangling is used, and in that case the
4420      type vector updated by remember_type is not used.  So, we turn
4421      off remembering of types here.  */
4422   ++work->forgetting_types;
4423
4424   /* For the repeat codes used with -fsquangling, we must keep track of
4425      the last argument.  */
4426   saved_previous_argument = work->previous_argument;
4427   saved_nrepeats = work->nrepeats;
4428   work->previous_argument = 0;
4429   work->nrepeats = 0;
4430
4431   /* Actually demangle the arguments.  */
4432   result = demangle_args (work, mangled, declp);
4433
4434   /* Restore the previous_argument field.  */
4435   if (work->previous_argument)
4436     {
4437       string_delete (work->previous_argument);
4438       free ((char *) work->previous_argument);
4439     }
4440   work->previous_argument = saved_previous_argument;
4441   --work->forgetting_types;
4442   work->nrepeats = saved_nrepeats;
4443
4444   return result;
4445 }
4446
4447 /* Returns 1 if a valid function name was found or 0 otherwise.  */
4448
4449 static int 
4450 demangle_function_name (struct work_stuff *work, const char **mangled,
4451                         string *declp, const char *scan)
4452 {
4453   size_t i;
4454   string type;
4455   const char *tem;
4456
4457   string_appendn (declp, (*mangled), scan - (*mangled));
4458   string_need (declp, 1);
4459   *(declp -> p) = '\0';
4460
4461   /* Consume the function name, including the "__" separating the name
4462      from the signature.  We are guaranteed that SCAN points to the
4463      separator.  */
4464
4465   (*mangled) = scan + 2;
4466   /* We may be looking at an instantiation of a template function:
4467      foo__Xt1t2_Ft3t4, where t1, t2, ... are template arguments and a
4468      following _F marks the start of the function arguments.  Handle
4469      the template arguments first. */
4470
4471   if (HP_DEMANGLING && (**mangled == 'X'))
4472     {
4473       demangle_arm_hp_template (work, mangled, 0, declp);
4474       /* This leaves MANGLED pointing to the 'F' marking func args */
4475     }
4476
4477   if (LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING)
4478     {
4479
4480       /* See if we have an ARM style constructor or destructor operator.
4481          If so, then just record it, clear the decl, and return.
4482          We can't build the actual constructor/destructor decl until later,
4483          when we recover the class name from the signature.  */
4484
4485       if (strcmp (declp -> b, "__ct") == 0)
4486         {
4487           work -> constructor += 1;
4488           string_clear (declp);
4489           return 1;
4490         }
4491       else if (strcmp (declp -> b, "__dt") == 0)
4492         {
4493           work -> destructor += 1;
4494           string_clear (declp);
4495           return 1;
4496         }
4497     }
4498
4499   if (declp->p - declp->b >= 3
4500       && declp->b[0] == 'o'
4501       && declp->b[1] == 'p'
4502       && strchr (cplus_markers, declp->b[2]) != NULL)
4503     {
4504       /* see if it's an assignment expression */
4505       if (declp->p - declp->b >= 10 /* op$assign_ */
4506           && memcmp (declp->b + 3, "assign_", 7) == 0)
4507         {
4508           for (i = 0; i < ARRAY_SIZE (optable); i++)
4509             {
4510               int len = declp->p - declp->b - 10;
4511               if ((int) strlen (optable[i].in) == len
4512                   && memcmp (optable[i].in, declp->b + 10, len) == 0)
4513                 {
4514                   string_clear (declp);
4515                   string_append (declp, "operator");
4516                   string_append (declp, optable[i].out);
4517                   string_append (declp, "=");
4518                   break;
4519                 }
4520             }
4521         }
4522       else
4523         {
4524           for (i = 0; i < ARRAY_SIZE (optable); i++)
4525             {
4526               int len = declp->p - declp->b - 3;
4527               if ((int) strlen (optable[i].in) == len
4528                   && memcmp (optable[i].in, declp->b + 3, len) == 0)
4529                 {
4530                   string_clear (declp);
4531                   string_append (declp, "operator");
4532                   string_append (declp, optable[i].out);
4533                   break;
4534                 }
4535             }
4536         }
4537     }
4538   else if (declp->p - declp->b >= 5 && memcmp (declp->b, "type", 4) == 0
4539            && strchr (cplus_markers, declp->b[4]) != NULL)
4540     {
4541       /* type conversion operator */
4542       tem = declp->b + 5;
4543       if (do_type (work, &tem, &type))
4544         {
4545           string_clear (declp);
4546           string_append (declp, "operator ");
4547           string_appends (declp, &type);
4548           string_delete (&type);
4549         }
4550     }
4551   else if (declp->b[0] == '_' && declp->b[1] == '_'
4552            && declp->b[2] == 'o' && declp->b[3] == 'p')
4553     {
4554       /* ANSI.  */
4555       /* type conversion operator.  */
4556       tem = declp->b + 4;
4557       if (do_type (work, &tem, &type))
4558         {
4559           string_clear (declp);
4560           string_append (declp, "operator ");
4561           string_appends (declp, &type);
4562           string_delete (&type);
4563         }
4564     }
4565   else if (declp->b[0] == '_' && declp->b[1] == '_'
4566            && ISLOWER((unsigned char)declp->b[2])
4567            && ISLOWER((unsigned char)declp->b[3]))
4568     {
4569       if (declp->b[4] == '\0')
4570         {
4571           /* Operator.  */
4572           for (i = 0; i < ARRAY_SIZE (optable); i++)
4573             {
4574               if (strlen (optable[i].in) == 2
4575                   && memcmp (optable[i].in, declp->b + 2, 2) == 0)
4576                 {
4577                   string_clear (declp);
4578                   string_append (declp, "operator");
4579                   string_append (declp, optable[i].out);
4580                   break;
4581                 }
4582             }
4583         }
4584
4585       /* BEGIN hack inserted 20050403 by JRS to deal with apparently
4586          non-cfront compliant new[]/delete[] manglings generated by
4587          the Portland Group's C++ compiler. */
4588       else 
4589       if (strcmp (declp -> b, "__nwa") == 0) {
4590          string_clear (declp);
4591          string_append (declp, "operator new[]");
4592       }
4593       else 
4594       if (strcmp (declp -> b, "__dla") == 0) {
4595          string_clear (declp);
4596          string_append (declp, "operator delete[]");
4597       }
4598       /* END hack */
4599
4600       else
4601         {
4602           if (declp->b[2] == 'a' && declp->b[5] == '\0')
4603             {
4604               /* Assignment.  */
4605               for (i = 0; i < ARRAY_SIZE (optable); i++)
4606                 {
4607                   if (strlen (optable[i].in) == 3
4608                       && memcmp (optable[i].in, declp->b + 2, 3) == 0)
4609                     {
4610                       string_clear (declp);
4611                       string_append (declp, "operator");
4612                       string_append (declp, optable[i].out);
4613                       break;
4614                     }
4615                 }
4616             }
4617         }
4618     }
4619
4620   /* If a function name was obtained but it's not valid, we were not
4621      successful.  */
4622   if (LEN_STRING (declp) == 1 && declp->b[0] == '.')
4623     return 0;
4624   else
4625     return 1;
4626 }
4627
4628 /* a mini string-handling package */
4629
4630 static void
4631 string_need (string *s, int n)
4632 {
4633   int tem;
4634
4635   if (s->b == NULL)
4636     {
4637       if (n < 32)
4638         {
4639           n = 32;
4640         }
4641       s->p = s->b = XNEWVEC (char, n);
4642       s->e = s->b + n;
4643     }
4644   else if (s->e - s->p < n)
4645     {
4646       tem = s->p - s->b;
4647       n += tem;
4648       n *= 2;
4649       s->b = XRESIZEVEC (char, s->b, n);
4650       s->p = s->b + tem;
4651       s->e = s->b + n;
4652     }
4653 }
4654
4655 static void
4656 string_delete (string *s)
4657 {
4658   if (s->b != NULL)
4659     {
4660       free (s->b);
4661       s->b = s->e = s->p = NULL;
4662     }
4663 }
4664
4665 static void
4666 string_init (string *s)
4667 {
4668   s->b = s->p = s->e = NULL;
4669 }
4670
4671 static void
4672 string_clear (string *s)
4673 {
4674   s->p = s->b;
4675 }
4676
4677 #if 0
4678
4679 static int
4680 string_empty (string *s)
4681 {
4682   return (s->b == s->p);
4683 }
4684
4685 #endif
4686
4687 static void
4688 string_append (string *p, const char *s)
4689 {
4690   int n;
4691   if (s == NULL || *s == '\0')
4692     return;
4693   n = strlen (s);
4694   string_need (p, n);
4695   memcpy (p->p, s, n);
4696   p->p += n;
4697 }
4698
4699 static void
4700 string_appends (string *p, string *s)
4701 {
4702   int n;
4703
4704   if (s->b != s->p)
4705     {
4706       n = s->p - s->b;
4707       string_need (p, n);
4708       memcpy (p->p, s->b, n);
4709       p->p += n;
4710     }
4711 }
4712
4713 static void
4714 string_appendn (string *p, const char *s, int n)
4715 {
4716   if (n != 0)
4717     {
4718       string_need (p, n);
4719       memcpy (p->p, s, n);
4720       p->p += n;
4721     }
4722 }
4723
4724 static void
4725 string_prepend (string *p, const char *s)
4726 {
4727   if (s != NULL && *s != '\0')
4728     {
4729       string_prependn (p, s, strlen (s));
4730     }
4731 }
4732
4733 static void
4734 string_prepends (string *p, string *s)
4735 {
4736   if (s->b != s->p)
4737     {
4738       string_prependn (p, s->b, s->p - s->b);
4739     }
4740 }
4741
4742 static void
4743 string_prependn (string *p, const char *s, int n)
4744 {
4745   char *q;
4746
4747   if (n != 0)
4748     {
4749       string_need (p, n);
4750       for (q = p->p - 1; q >= p->b; q--)
4751         {
4752           q[n] = q[0];
4753         }
4754       memcpy (p->b, s, n);
4755       p->p += n;
4756     }
4757 }
4758
4759 static void
4760 string_append_template_idx (string *s, int idx)
4761 {
4762   char buf[INTBUF_SIZE + 1 /* 'T' */];
4763   sprintf(buf, "T%d", idx);
4764   string_append (s, buf);
4765 }