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