OSDN Git Service

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