]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libcxxrt/libelftc_dem_gnu3.c
Minimize libc++ errno-related header diffs with upstream
[FreeBSD/FreeBSD.git] / contrib / libcxxrt / libelftc_dem_gnu3.c
1 /*-
2  * Copyright (c) 2007 Hyogeol Lee <hyogeollee@gmail.com>
3  * Copyright (c) 2015-2017 Kai Wang <kaiwang27@gmail.com>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer
11  *    in this position and unchanged.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 #include <sys/types.h>
28 #include <assert.h>
29 #include <ctype.h>
30 #include <errno.h>
31 #include <limits.h>
32 #include <stdbool.h>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36
37 /**
38  * @file cpp_demangle.c
39  * @brief Decode IA-64 C++ ABI style implementation.
40  *
41  * IA-64 standard ABI(Itanium C++ ABI) references.
42  *
43  * http://www.codesourcery.com/cxx-abi/abi.html#mangling \n
44  * http://www.codesourcery.com/cxx-abi/abi-mangling.html
45  */
46
47 /** @brief Dynamic vector data for string. */
48 struct vector_str {
49         /** Current size */
50         size_t          size;
51         /** Total capacity */
52         size_t          capacity;
53         /** String array */
54         char            **container;
55 };
56
57 #define BUFFER_GROWFACTOR       1.618
58 #define BUFFER_GROW(x)          (((x)+0.5)*BUFFER_GROWFACTOR)
59
60 #define ELFTC_FAILURE           0
61 #define ELFTC_ISDIGIT(C)        (isdigit((C) & 0xFF))
62 #define ELFTC_SUCCESS           1
63
64 #define VECTOR_DEF_CAPACITY     8
65
66 enum type_qualifier {
67         TYPE_PTR, TYPE_REF, TYPE_CMX, TYPE_IMG, TYPE_EXT, TYPE_RST, TYPE_VAT,
68         TYPE_CST, TYPE_VEC, TYPE_RREF
69 };
70
71 struct vector_type_qualifier {
72         size_t size, capacity;
73         enum type_qualifier *q_container;
74         struct vector_str ext_name;
75 };
76
77 enum read_cmd {
78         READ_FAIL, READ_NEST, READ_TMPL, READ_EXPR, READ_EXPL, READ_LOCAL,
79         READ_TYPE, READ_FUNC, READ_PTRMEM
80 };
81
82 struct read_cmd_item {
83         enum read_cmd cmd;
84         void *data;
85 };
86
87 struct vector_read_cmd {
88         size_t size, capacity;
89         struct read_cmd_item *r_container;
90 };
91
92 enum push_qualifier {
93         PUSH_ALL_QUALIFIER,
94         PUSH_CV_QUALIFIER,
95         PUSH_NON_CV_QUALIFIER,
96 };
97
98 struct cpp_demangle_data {
99         struct vector_str        output;        /* output string vector */
100         struct vector_str        subst;         /* substitution string vector */
101         struct vector_str        tmpl;
102         struct vector_str        class_type;
103         struct vector_str       *cur_output;    /* ptr to current output vec */
104         struct vector_read_cmd   cmd;
105         bool                     mem_rst;       /* restrict member function */
106         bool                     mem_vat;       /* volatile member function */
107         bool                     mem_cst;       /* const member function */
108         bool                     mem_ref;       /* lvalue-ref member func */
109         bool                     mem_rref;      /* rvalue-ref member func */
110         bool                     is_tmpl;       /* template args */
111         bool                     is_functype;   /* function type */
112         bool                     ref_qualifier; /* ref qualifier */
113         enum type_qualifier      ref_qualifier_type; /* ref qualifier type */
114         enum push_qualifier      push_qualifier; /* which qualifiers to push */
115         int                      func_type;
116         const char              *cur;           /* current mangled name ptr */
117         const char              *last_sname;    /* last source name */
118 };
119
120 struct type_delimit {
121         bool paren;
122         bool firstp;
123 };
124
125 #define CPP_DEMANGLE_TRY_LIMIT  128
126 #define FLOAT_SPRINTF_TRY_LIMIT 5
127 #define FLOAT_QUADRUPLE_BYTES   16
128 #define FLOAT_EXTENED_BYTES     10
129
130 #define SIMPLE_HASH(x,y)        (64 * x + y)
131 #define DEM_PUSH_STR(d,s)       cpp_demangle_push_str((d), (s), strlen((s)))
132 #define VEC_PUSH_STR(d,s)       vector_str_push((d), (s), strlen((s)))
133
134 static size_t   get_strlen_sum(const struct vector_str *v);
135 static bool     vector_str_grow(struct vector_str *v);
136
137 static size_t
138 get_strlen_sum(const struct vector_str *v)
139 {
140         size_t i, len = 0;
141
142         if (v == NULL)
143                 return (0);
144
145         assert(v->size > 0);
146
147         for (i = 0; i < v->size; ++i)
148                 len += strlen(v->container[i]);
149
150         return (len);
151 }
152
153 /**
154  * @brief Deallocate resource in vector_str.
155  */
156 static void
157 vector_str_dest(struct vector_str *v)
158 {
159         size_t i;
160
161         if (v == NULL)
162                 return;
163
164         for (i = 0; i < v->size; ++i)
165                 free(v->container[i]);
166
167         free(v->container);
168 }
169
170 /**
171  * @brief Find string in vector_str.
172  * @param v Destination vector.
173  * @param o String to find.
174  * @param l Length of the string.
175  * @return -1 at failed, 0 at not found, 1 at found.
176  */
177 static int
178 vector_str_find(const struct vector_str *v, const char *o, size_t l)
179 {
180         size_t i;
181
182         if (v == NULL || o == NULL)
183                 return (-1);
184
185         for (i = 0; i < v->size; ++i)
186                 if (strncmp(v->container[i], o, l) == 0)
187                         return (1);
188
189         return (0);
190 }
191
192 /**
193  * @brief Get new allocated flat string from vector.
194  *
195  * If l is not NULL, return length of the string.
196  * @param v Destination vector.
197  * @param l Length of the string.
198  * @return NULL at failed or NUL terminated new allocated string.
199  */
200 static char *
201 vector_str_get_flat(const struct vector_str *v, size_t *l)
202 {
203         ssize_t elem_pos, elem_size, rtn_size;
204         size_t i;
205         char *rtn;
206
207         if (v == NULL || v->size == 0)
208                 return (NULL);
209
210         if ((rtn_size = get_strlen_sum(v)) == 0)
211                 return (NULL);
212
213         if ((rtn = malloc(sizeof(char) * (rtn_size + 1))) == NULL)
214                 return (NULL);
215
216         elem_pos = 0;
217         for (i = 0; i < v->size; ++i) {
218                 elem_size = strlen(v->container[i]);
219
220                 memcpy(rtn + elem_pos, v->container[i], elem_size);
221
222                 elem_pos += elem_size;
223         }
224
225         rtn[rtn_size] = '\0';
226
227         if (l != NULL)
228                 *l = rtn_size;
229
230         return (rtn);
231 }
232
233 static bool
234 vector_str_grow(struct vector_str *v)
235 {
236         size_t i, tmp_cap;
237         char **tmp_ctn;
238
239         if (v == NULL)
240                 return (false);
241
242         assert(v->capacity > 0);
243
244         tmp_cap = BUFFER_GROW(v->capacity);
245
246         assert(tmp_cap > v->capacity);
247
248         if ((tmp_ctn = malloc(sizeof(char *) * tmp_cap)) == NULL)
249                 return (false);
250
251         for (i = 0; i < v->size; ++i)
252                 tmp_ctn[i] = v->container[i];
253
254         free(v->container);
255
256         v->container = tmp_ctn;
257         v->capacity = tmp_cap;
258
259         return (true);
260 }
261
262 /**
263  * @brief Initialize vector_str.
264  * @return false at failed, true at success.
265  */
266 static bool
267 vector_str_init(struct vector_str *v)
268 {
269
270         if (v == NULL)
271                 return (false);
272
273         v->size = 0;
274         v->capacity = VECTOR_DEF_CAPACITY;
275
276         assert(v->capacity > 0);
277
278         if ((v->container = malloc(sizeof(char *) * v->capacity)) == NULL)
279                 return (false);
280
281         assert(v->container != NULL);
282
283         return (true);
284 }
285
286 /**
287  * @brief Remove last element in vector_str.
288  * @return false at failed, true at success.
289  */
290 static bool
291 vector_str_pop(struct vector_str *v)
292 {
293
294         if (v == NULL)
295                 return (false);
296
297         if (v->size == 0)
298                 return (true);
299
300         --v->size;
301
302         free(v->container[v->size]);
303         v->container[v->size] = NULL;
304
305         return (true);
306 }
307
308 /**
309  * @brief Push back string to vector.
310  * @return false at failed, true at success.
311  */
312 static bool
313 vector_str_push(struct vector_str *v, const char *str, size_t len)
314 {
315
316         if (v == NULL || str == NULL)
317                 return (false);
318
319         if (v->size == v->capacity && vector_str_grow(v) == false)
320                 return (false);
321
322         if ((v->container[v->size] = malloc(sizeof(char) * (len + 1))) == NULL)
323                 return (false);
324
325         snprintf(v->container[v->size], len + 1, "%s", str);
326
327         ++v->size;
328
329         return (true);
330 }
331
332 /**
333  * @brief Push front org vector to det vector.
334  * @return false at failed, true at success.
335  */
336 static bool
337 vector_str_push_vector_head(struct vector_str *dst, struct vector_str *org)
338 {
339         size_t i, j, tmp_cap;
340         char **tmp_ctn;
341
342         if (dst == NULL || org == NULL)
343                 return (false);
344
345         tmp_cap = BUFFER_GROW(dst->size + org->size);
346
347         if ((tmp_ctn = malloc(sizeof(char *) * tmp_cap)) == NULL)
348                 return (false);
349
350         for (i = 0; i < org->size; ++i)
351                 if ((tmp_ctn[i] = strdup(org->container[i])) == NULL) {
352                         for (j = 0; j < i; ++j)
353                                 free(tmp_ctn[j]);
354
355                         free(tmp_ctn);
356
357                         return (false);
358                 }
359
360         for (i = 0; i < dst->size; ++i)
361                 tmp_ctn[i + org->size] = dst->container[i];
362
363         free(dst->container);
364
365         dst->container = tmp_ctn;
366         dst->capacity = tmp_cap;
367         dst->size += org->size;
368
369         return (true);
370 }
371
372 /**
373  * @brief Push org vector to the tail of det vector.
374  * @return false at failed, true at success.
375  */
376 static bool
377 vector_str_push_vector(struct vector_str *dst, struct vector_str *org)
378 {
379         size_t i, j, tmp_cap;
380         char **tmp_ctn;
381
382         if (dst == NULL || org == NULL)
383                 return (false);
384
385         tmp_cap = BUFFER_GROW(dst->size + org->size);
386
387         if ((tmp_ctn = malloc(sizeof(char *) * tmp_cap)) == NULL)
388                 return (false);
389
390         for (i = 0; i < dst->size; ++i)
391                 tmp_ctn[i] = dst->container[i];
392
393         for (i = 0; i < org->size; ++i)
394                 if ((tmp_ctn[i + dst->size] = strdup(org->container[i])) ==
395                     NULL) {
396                         for (j = 0; j < i + dst->size; ++j)
397                                 free(tmp_ctn[j]);
398
399                         free(tmp_ctn);
400
401                         return (false);
402                 }
403
404         free(dst->container);
405
406         dst->container = tmp_ctn;
407         dst->capacity = tmp_cap;
408         dst->size += org->size;
409
410         return (true);
411 }
412
413 /**
414  * @brief Get new allocated flat string from vector between begin and end.
415  *
416  * If r_len is not NULL, string length will be returned.
417  * @return NULL at failed or NUL terminated new allocated string.
418  */
419 static char *
420 vector_str_substr(const struct vector_str *v, size_t begin, size_t end,
421     size_t *r_len)
422 {
423         size_t cur, i, len;
424         char *rtn;
425
426         if (v == NULL || begin > end)
427                 return (NULL);
428
429         len = 0;
430         for (i = begin; i < end + 1; ++i)
431                 len += strlen(v->container[i]);
432
433         if ((rtn = malloc(sizeof(char) * (len + 1))) == NULL)
434                 return (NULL);
435
436         if (r_len != NULL)
437                 *r_len = len;
438
439         cur = 0;
440         for (i = begin; i < end + 1; ++i) {
441                 len = strlen(v->container[i]);
442                 memcpy(rtn + cur, v->container[i], len);
443                 cur += len;
444         }
445         rtn[cur] = '\0';
446
447         return (rtn);
448 }
449
450 static void     cpp_demangle_data_dest(struct cpp_demangle_data *);
451 static int      cpp_demangle_data_init(struct cpp_demangle_data *,
452                     const char *);
453 static int      cpp_demangle_get_subst(struct cpp_demangle_data *, size_t);
454 static int      cpp_demangle_get_tmpl_param(struct cpp_demangle_data *, size_t);
455 static int      cpp_demangle_push_fp(struct cpp_demangle_data *,
456                     char *(*)(const char *, size_t));
457 static int      cpp_demangle_push_str(struct cpp_demangle_data *, const char *,
458                     size_t);
459 static int      cpp_demangle_pop_str(struct cpp_demangle_data *);
460 static int      cpp_demangle_push_subst(struct cpp_demangle_data *,
461                     const char *, size_t);
462 static int      cpp_demangle_push_subst_v(struct cpp_demangle_data *,
463                     struct vector_str *);
464 static int      cpp_demangle_push_type_qualifier(struct cpp_demangle_data *,
465                     struct vector_type_qualifier *, const char *);
466 static int      cpp_demangle_read_array(struct cpp_demangle_data *);
467 static int      cpp_demangle_read_encoding(struct cpp_demangle_data *);
468 static int      cpp_demangle_read_expr_primary(struct cpp_demangle_data *);
469 static int      cpp_demangle_read_expression(struct cpp_demangle_data *);
470 static int      cpp_demangle_read_expression_flat(struct cpp_demangle_data *,
471                     char **);
472 static int      cpp_demangle_read_expression_binary(struct cpp_demangle_data *,
473                     const char *, size_t);
474 static int      cpp_demangle_read_expression_unary(struct cpp_demangle_data *,
475                     const char *, size_t);
476 static int      cpp_demangle_read_expression_trinary(struct cpp_demangle_data *,
477                     const char *, size_t, const char *, size_t);
478 static int      cpp_demangle_read_function(struct cpp_demangle_data *, int *,
479                     struct vector_type_qualifier *);
480 static int      cpp_demangle_local_source_name(struct cpp_demangle_data *ddata);
481 static int      cpp_demangle_read_local_name(struct cpp_demangle_data *);
482 static int      cpp_demangle_read_name(struct cpp_demangle_data *);
483 static int      cpp_demangle_read_name_flat(struct cpp_demangle_data *,
484                     char**);
485 static int      cpp_demangle_read_nested_name(struct cpp_demangle_data *);
486 static int      cpp_demangle_read_number(struct cpp_demangle_data *, long *);
487 static int      cpp_demangle_read_number_as_string(struct cpp_demangle_data *,
488                     char **);
489 static int      cpp_demangle_read_nv_offset(struct cpp_demangle_data *);
490 static int      cpp_demangle_read_offset(struct cpp_demangle_data *);
491 static int      cpp_demangle_read_offset_number(struct cpp_demangle_data *);
492 static int      cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *,
493                     struct vector_type_qualifier *);
494 static int      cpp_demangle_read_sname(struct cpp_demangle_data *);
495 static int      cpp_demangle_read_subst(struct cpp_demangle_data *);
496 static int      cpp_demangle_read_subst_std(struct cpp_demangle_data *);
497 static int      cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *,
498                     const char *);
499 static int      cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *);
500 static int      cpp_demangle_read_tmpl_args(struct cpp_demangle_data *);
501 static int      cpp_demangle_read_tmpl_param(struct cpp_demangle_data *);
502 static int      cpp_demangle_read_type(struct cpp_demangle_data *,
503                     struct type_delimit *);
504 static int      cpp_demangle_read_type_flat(struct cpp_demangle_data *,
505                     char **);
506 static int      cpp_demangle_read_uqname(struct cpp_demangle_data *);
507 static int      cpp_demangle_read_v_offset(struct cpp_demangle_data *);
508 static char     *decode_fp_to_double(const char *, size_t);
509 static char     *decode_fp_to_float(const char *, size_t);
510 static char     *decode_fp_to_float128(const char *, size_t);
511 static char     *decode_fp_to_float80(const char *, size_t);
512 static char     *decode_fp_to_long_double(const char *, size_t);
513 static int      hex_to_dec(char);
514 static void     vector_read_cmd_dest(struct vector_read_cmd *);
515 static struct read_cmd_item *vector_read_cmd_find(struct vector_read_cmd *,
516                     enum read_cmd);
517 static int      vector_read_cmd_init(struct vector_read_cmd *);
518 static int      vector_read_cmd_pop(struct vector_read_cmd *);
519 static int      vector_read_cmd_push(struct vector_read_cmd *, enum read_cmd,
520                     void *);
521 static void     vector_type_qualifier_dest(struct vector_type_qualifier *);
522 static int      vector_type_qualifier_init(struct vector_type_qualifier *);
523 static int      vector_type_qualifier_push(struct vector_type_qualifier *,
524                     enum type_qualifier);
525
526 /**
527  * @brief Decode the input string by IA-64 C++ ABI style.
528  *
529  * GNU GCC v3 use IA-64 standard ABI.
530  * @return New allocated demangled string or NULL if failed.
531  * @todo 1. Testing and more test case. 2. Code cleaning.
532  */
533 char *
534 __cxa_demangle_gnu3(const char *org)
535 {
536         struct cpp_demangle_data ddata;
537         struct vector_str ret_type;
538         struct type_delimit td;
539         ssize_t org_len;
540         unsigned int limit;
541         char *rtn = NULL;
542         bool has_ret = false, more_type = false;
543
544         if (org == NULL)
545                 return (NULL);
546
547         org_len = strlen(org);
548         // Try demangling as a type for short encodings
549         if ((org_len < 2) || (org[0] != '_' || org[1] != 'Z' )) {
550                 if (!cpp_demangle_data_init(&ddata, org))
551                         return (NULL);
552                 if (!cpp_demangle_read_type(&ddata, 0))
553                         goto clean;
554                 rtn = vector_str_get_flat(&ddata.output, (size_t *) NULL);
555                 goto clean;
556         }
557         if (org_len > 11 && !strncmp(org, "_GLOBAL__I_", 11)) {
558                 if ((rtn = malloc(org_len + 19)) == NULL)
559                         return (NULL);
560                 snprintf(rtn, org_len + 19,
561                     "global constructors keyed to %s", org + 11);
562                 return (rtn);
563         }
564
565         if (!cpp_demangle_data_init(&ddata, org + 2))
566                 return (NULL);
567
568         if (!cpp_demangle_read_encoding(&ddata))
569                 goto clean;
570
571         /*
572          * Pop function name from substitution candidate list.
573          */
574         if (*ddata.cur != 0 && ddata.subst.size >= 1) {
575                 if (!vector_str_pop(&ddata.subst))
576                         goto clean;
577         }
578
579         td.paren = false;
580         td.firstp = true;
581         limit = 0;
582
583         /*
584          * The first type is a return type if we just demangled template
585          * args. (the template args is right next to the function name,
586          * which means it's a template function)
587          */
588         if (ddata.is_tmpl) {
589                 ddata.is_tmpl = false;
590                 if (!vector_str_init(&ret_type))
591                         goto clean;
592                 ddata.cur_output = &ret_type;
593                 has_ret = true;
594         }
595
596         while (*ddata.cur != '\0') {
597                 /*
598                  * Breaking at some gcc info at tail. e.g) @@GLIBCXX_3.4
599                  */
600                 if (*ddata.cur == '@' && *(ddata.cur + 1) == '@')
601                         break;
602
603                 if (has_ret) {
604                         /* Read return type */
605                         if (!cpp_demangle_read_type(&ddata, NULL))
606                                 goto clean;
607                 } else {
608                         /* Read function arg type */
609                         if (!cpp_demangle_read_type(&ddata, &td))
610                                 goto clean;
611                 }
612
613                 if (has_ret) {
614                         /* Push return type to the beginning */
615                         if (!VEC_PUSH_STR(&ret_type, " "))
616                                 goto clean;
617                         if (!vector_str_push_vector_head(&ddata.output,
618                             &ret_type))
619                                 goto clean;
620                         ddata.cur_output = &ddata.output;
621                         vector_str_dest(&ret_type);
622                         has_ret = false;
623                         more_type = true;
624                 } else if (more_type)
625                         more_type = false;
626                 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
627                         goto clean;
628         }
629         if (more_type)
630                 goto clean;
631
632         if (ddata.output.size == 0)
633                 goto clean;
634         if (td.paren && !VEC_PUSH_STR(&ddata.output, ")"))
635                 goto clean;
636         if (ddata.mem_vat && !VEC_PUSH_STR(&ddata.output, " volatile"))
637                 goto clean;
638         if (ddata.mem_cst && !VEC_PUSH_STR(&ddata.output, " const"))
639                 goto clean;
640         if (ddata.mem_rst && !VEC_PUSH_STR(&ddata.output, " restrict"))
641                 goto clean;
642         if (ddata.mem_ref && !VEC_PUSH_STR(&ddata.output, " &"))
643                 goto clean;
644         if (ddata.mem_rref && !VEC_PUSH_STR(&ddata.output, " &&"))
645                 goto clean;
646
647         rtn = vector_str_get_flat(&ddata.output, (size_t *) NULL);
648
649 clean:
650         if (has_ret)
651                 vector_str_dest(&ret_type);
652
653         cpp_demangle_data_dest(&ddata);
654
655         return (rtn);
656 }
657
658 static void
659 cpp_demangle_data_dest(struct cpp_demangle_data *d)
660 {
661
662         if (d == NULL)
663                 return;
664
665         vector_read_cmd_dest(&d->cmd);
666         vector_str_dest(&d->class_type);
667         vector_str_dest(&d->tmpl);
668         vector_str_dest(&d->subst);
669         vector_str_dest(&d->output);
670 }
671
672 static int
673 cpp_demangle_data_init(struct cpp_demangle_data *d, const char *cur)
674 {
675
676         if (d == NULL || cur == NULL)
677                 return (0);
678
679         if (!vector_str_init(&d->output))
680                 return (0);
681         if (!vector_str_init(&d->subst))
682                 goto clean1;
683         if (!vector_str_init(&d->tmpl))
684                 goto clean2;
685         if (!vector_str_init(&d->class_type))
686                 goto clean3;
687         if (!vector_read_cmd_init(&d->cmd))
688                 goto clean4;
689
690         assert(d->output.container != NULL);
691         assert(d->subst.container != NULL);
692         assert(d->tmpl.container != NULL);
693         assert(d->class_type.container != NULL);
694
695         d->mem_rst = false;
696         d->mem_vat = false;
697         d->mem_cst = false;
698         d->mem_ref = false;
699         d->mem_rref = false;
700         d->is_tmpl = false;
701         d->is_functype = false;
702         d->ref_qualifier = false;
703         d->push_qualifier = PUSH_ALL_QUALIFIER;
704         d->func_type = 0;
705         d->cur = cur;
706         d->cur_output = &d->output;
707         d->last_sname = NULL;
708
709         return (1);
710
711 clean4:
712         vector_str_dest(&d->class_type);
713 clean3:
714         vector_str_dest(&d->tmpl);
715 clean2:
716         vector_str_dest(&d->subst);
717 clean1:
718         vector_str_dest(&d->output);
719
720         return (0);
721 }
722
723 static int
724 cpp_demangle_push_fp(struct cpp_demangle_data *ddata,
725     char *(*decoder)(const char *, size_t))
726 {
727         size_t len;
728         int rtn;
729         const char *fp;
730         char *f;
731
732         if (ddata == NULL || decoder == NULL)
733                 return (0);
734
735         fp = ddata->cur;
736         while (*ddata->cur != 'E')
737                 ++ddata->cur;
738
739         if ((f = decoder(fp, ddata->cur - fp)) == NULL)
740                 return (0);
741
742         rtn = 0;
743         if ((len = strlen(f)) > 0)
744                 rtn = cpp_demangle_push_str(ddata, f, len);
745
746         free(f);
747
748         ++ddata->cur;
749
750         return (rtn);
751 }
752
753 static int
754 cpp_demangle_push_str(struct cpp_demangle_data *ddata, const char *str,
755     size_t len)
756 {
757
758         if (ddata == NULL || str == NULL || len == 0)
759                 return (0);
760
761         /*
762          * is_tmpl is used to check if the type (function arg) is right next
763          * to template args, and should always be cleared whenever new string
764          * pushed.
765          */
766         ddata->is_tmpl = false;
767
768         return (vector_str_push(ddata->cur_output, str, len));
769 }
770
771 static int
772 cpp_demangle_pop_str(struct cpp_demangle_data *ddata)
773 {
774
775         if (ddata == NULL)
776                 return (0);
777
778         return (vector_str_pop(ddata->cur_output));
779 }
780
781 static int
782 cpp_demangle_push_subst(struct cpp_demangle_data *ddata, const char *str,
783     size_t len)
784 {
785
786         if (ddata == NULL || str == NULL || len == 0)
787                 return (0);
788
789         if (!vector_str_find(&ddata->subst, str, len))
790                 return (vector_str_push(&ddata->subst, str, len));
791
792         return (1);
793 }
794
795 static int
796 cpp_demangle_push_subst_v(struct cpp_demangle_data *ddata, struct vector_str *v)
797 {
798         size_t str_len;
799         int rtn;
800         char *str;
801
802         if (ddata == NULL || v == NULL)
803                 return (0);
804
805         if ((str = vector_str_get_flat(v, &str_len)) == NULL)
806                 return (0);
807
808         rtn = cpp_demangle_push_subst(ddata, str, str_len);
809
810         free(str);
811
812         return (rtn);
813 }
814
815 static int
816 cpp_demangle_push_type_qualifier(struct cpp_demangle_data *ddata,
817     struct vector_type_qualifier *v, const char *type_str)
818 {
819         struct vector_str subst_v;
820         enum type_qualifier t;
821         size_t idx, e_idx, e_len;
822         char *buf;
823         int rtn;
824         bool cv;
825
826         if (ddata == NULL || v == NULL)
827                 return (0);
828
829         if ((idx = v->size) == 0)
830                 return (1);
831
832         rtn = 0;
833         if (type_str != NULL) {
834                 if (!vector_str_init(&subst_v))
835                         return (0);
836                 if (!VEC_PUSH_STR(&subst_v, type_str))
837                         goto clean;
838         }
839
840         cv = true;
841         e_idx = 0;
842         while (idx > 0) {
843                 switch (v->q_container[idx - 1]) {
844                 case TYPE_PTR:
845                         cv = false;
846                         if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
847                                 break;
848                         if (!DEM_PUSH_STR(ddata, "*"))
849                                 goto clean;
850                         if (type_str != NULL) {
851                                 if (!VEC_PUSH_STR(&subst_v, "*"))
852                                         goto clean;
853                                 if (!cpp_demangle_push_subst_v(ddata,
854                                     &subst_v))
855                                         goto clean;
856                         }
857                         break;
858
859                 case TYPE_REF:
860                         cv = false;
861                         if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
862                                 break;
863                         if (!DEM_PUSH_STR(ddata, "&"))
864                                 goto clean;
865                         if (type_str != NULL) {
866                                 if (!VEC_PUSH_STR(&subst_v, "&"))
867                                         goto clean;
868                                 if (!cpp_demangle_push_subst_v(ddata,
869                                     &subst_v))
870                                         goto clean;
871                         }
872                         break;
873
874                 case TYPE_RREF:
875                         cv = false;
876                         if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
877                                 break;
878                         if (!DEM_PUSH_STR(ddata, "&&"))
879                                 goto clean;
880                         if (type_str != NULL) {
881                                 if (!VEC_PUSH_STR(&subst_v, "&&"))
882                                         goto clean;
883                                 if (!cpp_demangle_push_subst_v(ddata,
884                                     &subst_v))
885                                         goto clean;
886                         }
887                         break;
888
889                 case TYPE_CMX:
890                         cv = false;
891                         if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
892                                 break;
893                         if (!DEM_PUSH_STR(ddata, " complex"))
894                                 goto clean;
895                         if (type_str != NULL) {
896                                 if (!VEC_PUSH_STR(&subst_v, " complex"))
897                                         goto clean;
898                                 if (!cpp_demangle_push_subst_v(ddata,
899                                     &subst_v))
900                                         goto clean;
901                         }
902                         break;
903
904                 case TYPE_IMG:
905                         cv = false;
906                         if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
907                                 break;
908                         if (!DEM_PUSH_STR(ddata, " imaginary"))
909                                 goto clean;
910                         if (type_str != NULL) {
911                                 if (!VEC_PUSH_STR(&subst_v, " imaginary"))
912                                         goto clean;
913                                 if (!cpp_demangle_push_subst_v(ddata,
914                                     &subst_v))
915                                         goto clean;
916                         }
917                         break;
918
919                 case TYPE_EXT:
920                         cv = false;
921                         if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
922                                 break;
923                         if (v->ext_name.size == 0 ||
924                             e_idx > v->ext_name.size - 1)
925                                 goto clean;
926                         if ((e_len = strlen(v->ext_name.container[e_idx])) ==
927                             0)
928                                 goto clean;
929                         if ((buf = malloc(e_len + 2)) == NULL)
930                                 goto clean;
931                         snprintf(buf, e_len + 2, " %s",
932                             v->ext_name.container[e_idx]);
933
934                         if (!DEM_PUSH_STR(ddata, buf)) {
935                                 free(buf);
936                                 goto clean;
937                         }
938
939                         if (type_str != NULL) {
940                                 if (!VEC_PUSH_STR(&subst_v, buf)) {
941                                         free(buf);
942                                         goto clean;
943                                 }
944                                 if (!cpp_demangle_push_subst_v(ddata,
945                                     &subst_v)) {
946                                         free(buf);
947                                         goto clean;
948                                 }
949                         }
950                         free(buf);
951                         ++e_idx;
952                         break;
953
954                 case TYPE_RST:
955                         if (ddata->push_qualifier == PUSH_NON_CV_QUALIFIER &&
956                             cv)
957                                 break;
958                         if (ddata->push_qualifier == PUSH_CV_QUALIFIER && !cv)
959                                 break;
960                         if (!DEM_PUSH_STR(ddata, " restrict"))
961                                 goto clean;
962                         if (type_str != NULL) {
963                                 if (!VEC_PUSH_STR(&subst_v, " restrict"))
964                                         goto clean;
965                                 if (idx - 1 > 0) {
966                                         t = v->q_container[idx - 2];
967                                         if (t == TYPE_RST || t == TYPE_VAT ||
968                                             t == TYPE_CST)
969                                                 break;
970                                 }
971                                 if (!cpp_demangle_push_subst_v(ddata,
972                                     &subst_v))
973                                         goto clean;
974                         }
975                         break;
976
977                 case TYPE_VAT:
978                         if (ddata->push_qualifier == PUSH_NON_CV_QUALIFIER &&
979                             cv)
980                                 break;
981                         if (ddata->push_qualifier == PUSH_CV_QUALIFIER && !cv)
982                                 break;
983                         if (!DEM_PUSH_STR(ddata, " volatile"))
984                                 goto clean;
985                         if (type_str != NULL) {
986                                 if (!VEC_PUSH_STR(&subst_v, " volatile"))
987                                         goto clean;
988                                 if (idx - 1 > 0) {
989                                         t = v->q_container[idx - 2];
990                                         if (t == TYPE_RST || t == TYPE_VAT ||
991                                             t == TYPE_CST)
992                                                 break;
993                                 }
994                                 if (!cpp_demangle_push_subst_v(ddata,
995                                     &subst_v))
996                                         goto clean;
997                         }
998                         break;
999
1000                 case TYPE_CST:
1001                         if (ddata->push_qualifier == PUSH_NON_CV_QUALIFIER &&
1002                             cv)
1003                                 break;
1004                         if (ddata->push_qualifier == PUSH_CV_QUALIFIER && !cv)
1005                                 break;
1006                         if (!DEM_PUSH_STR(ddata, " const"))
1007                                 goto clean;
1008                         if (type_str != NULL) {
1009                                 if (!VEC_PUSH_STR(&subst_v, " const"))
1010                                         goto clean;
1011                                 if (idx - 1 > 0) {
1012                                         t = v->q_container[idx - 2];
1013                                         if (t == TYPE_RST || t == TYPE_VAT ||
1014                                             t == TYPE_CST)
1015                                                 break;
1016                                 }
1017                                 if (!cpp_demangle_push_subst_v(ddata,
1018                                     &subst_v))
1019                                         goto clean;
1020                         }
1021                         break;
1022
1023                 case TYPE_VEC:
1024                         cv = false;
1025                         if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
1026                                 break;
1027                         if (v->ext_name.size == 0 ||
1028                             e_idx > v->ext_name.size - 1)
1029                                 goto clean;
1030                         if ((e_len = strlen(v->ext_name.container[e_idx])) ==
1031                             0)
1032                                 goto clean;
1033                         if ((buf = malloc(e_len + 12)) == NULL)
1034                                 goto clean;
1035                         snprintf(buf, e_len + 12, " __vector(%s)",
1036                             v->ext_name.container[e_idx]);
1037                         if (!DEM_PUSH_STR(ddata, buf)) {
1038                                 free(buf);
1039                                 goto clean;
1040                         }
1041                         if (type_str != NULL) {
1042                                 if (!VEC_PUSH_STR(&subst_v, buf)) {
1043                                         free(buf);
1044                                         goto clean;
1045                                 }
1046                                 if (!cpp_demangle_push_subst_v(ddata,
1047                                     &subst_v)) {
1048                                         free(buf);
1049                                         goto clean;
1050                                 }
1051                         }
1052                         free(buf);
1053                         ++e_idx;
1054                         break;
1055                 }
1056                 --idx;
1057         }
1058
1059         rtn = 1;
1060 clean:
1061         if (type_str != NULL)
1062                 vector_str_dest(&subst_v);
1063
1064         return (rtn);
1065 }
1066
1067 static int
1068 cpp_demangle_get_subst(struct cpp_demangle_data *ddata, size_t idx)
1069 {
1070         size_t len;
1071
1072         if (ddata == NULL || ddata->subst.size <= idx)
1073                 return (0);
1074         if ((len = strlen(ddata->subst.container[idx])) == 0)
1075                 return (0);
1076         if (!cpp_demangle_push_str(ddata, ddata->subst.container[idx], len))
1077                 return (0);
1078
1079         /* skip '_' */
1080         ++ddata->cur;
1081
1082         return (1);
1083 }
1084
1085 static int
1086 cpp_demangle_get_tmpl_param(struct cpp_demangle_data *ddata, size_t idx)
1087 {
1088         size_t len;
1089
1090         if (ddata == NULL || ddata->tmpl.size <= idx)
1091                 return (0);
1092         if ((len = strlen(ddata->tmpl.container[idx])) == 0)
1093                 return (0);
1094         if (!cpp_demangle_push_str(ddata, ddata->tmpl.container[idx], len))
1095                 return (0);
1096
1097         ++ddata->cur;
1098
1099         return (1);
1100 }
1101
1102 static int
1103 cpp_demangle_read_array(struct cpp_demangle_data *ddata)
1104 {
1105         size_t i, num_len, exp_len, p_idx, idx;
1106         const char *num;
1107         char *exp;
1108
1109         if (ddata == NULL || *(++ddata->cur) == '\0')
1110                 return (0);
1111
1112         if (*ddata->cur == '_') {
1113                 if (*(++ddata->cur) == '\0')
1114                         return (0);
1115
1116                 if (!cpp_demangle_read_type(ddata, NULL))
1117                         return (0);
1118
1119                 if (!DEM_PUSH_STR(ddata, " []"))
1120                         return (0);
1121         } else {
1122                 if (ELFTC_ISDIGIT(*ddata->cur) != 0) {
1123                         num = ddata->cur;
1124                         while (ELFTC_ISDIGIT(*ddata->cur) != 0)
1125                                 ++ddata->cur;
1126                         if (*ddata->cur != '_')
1127                                 return (0);
1128                         num_len = ddata->cur - num;
1129                         assert(num_len > 0);
1130                         if (*(++ddata->cur) == '\0')
1131                                 return (0);
1132                         if (!cpp_demangle_read_type(ddata, NULL))
1133                                 return (0);
1134                         if (!DEM_PUSH_STR(ddata, " ["))
1135                                 return (0);
1136                         if (!cpp_demangle_push_str(ddata, num, num_len))
1137                                 return (0);
1138                         if (!DEM_PUSH_STR(ddata, "]"))
1139                                 return (0);
1140                 } else {
1141                         p_idx = ddata->output.size;
1142                         if (!cpp_demangle_read_expression(ddata))
1143                                 return (0);
1144                         if ((exp = vector_str_substr(&ddata->output, p_idx,
1145                                  ddata->output.size - 1, &exp_len)) == NULL)
1146                                 return (0);
1147                         idx = ddata->output.size;
1148                         for (i = p_idx; i < idx; ++i)
1149                                 if (!vector_str_pop(&ddata->output)) {
1150                                         free(exp);
1151                                         return (0);
1152                                 }
1153                         if (*ddata->cur != '_') {
1154                                 free(exp);
1155                                 return (0);
1156                         }
1157                         ++ddata->cur;
1158                         if (*ddata->cur == '\0') {
1159                                 free(exp);
1160                                 return (0);
1161                         }
1162                         if (!cpp_demangle_read_type(ddata, NULL)) {
1163                                 free(exp);
1164                                 return (0);
1165                         }
1166                         if (!DEM_PUSH_STR(ddata, " [")) {
1167                                 free(exp);
1168                                 return (0);
1169                         }
1170                         if (!cpp_demangle_push_str(ddata, exp, exp_len)) {
1171                                 free(exp);
1172                                 return (0);
1173                         }
1174                         if (!DEM_PUSH_STR(ddata, "]")) {
1175                                 free(exp);
1176                                 return (0);
1177                         }
1178                         free(exp);
1179                 }
1180         }
1181
1182         return (1);
1183 }
1184
1185 static int
1186 cpp_demangle_read_expr_primary(struct cpp_demangle_data *ddata)
1187 {
1188         const char *num;
1189
1190         if (ddata == NULL || *(++ddata->cur) == '\0')
1191                 return (0);
1192
1193         if (*ddata->cur == '_' && *(ddata->cur + 1) == 'Z') {
1194                 ddata->cur += 2;
1195                 if (*ddata->cur == '\0')
1196                         return (0);
1197                 if (!cpp_demangle_read_encoding(ddata))
1198                         return (0);
1199                 ++ddata->cur;
1200                 return (1);
1201         }
1202
1203         switch (*ddata->cur) {
1204         case 'b':
1205                 if (*(ddata->cur + 2) != 'E')
1206                         return (0);
1207                 switch (*(++ddata->cur)) {
1208                 case '0':
1209                         ddata->cur += 2;
1210                         return (DEM_PUSH_STR(ddata, "false"));
1211                 case '1':
1212                         ddata->cur += 2;
1213                         return (DEM_PUSH_STR(ddata, "true"));
1214                 default:
1215                         return (0);
1216                 }
1217
1218         case 'd':
1219                 ++ddata->cur;
1220                 return (cpp_demangle_push_fp(ddata, decode_fp_to_double));
1221
1222         case 'e':
1223                 ++ddata->cur;
1224                 if (sizeof(long double) == 10)
1225                         return (cpp_demangle_push_fp(ddata,
1226                             decode_fp_to_double));
1227                 return (cpp_demangle_push_fp(ddata, decode_fp_to_float80));
1228
1229         case 'f':
1230                 ++ddata->cur;
1231                 return (cpp_demangle_push_fp(ddata, decode_fp_to_float));
1232
1233         case 'g':
1234                 ++ddata->cur;
1235                 if (sizeof(long double) == 16)
1236                         return (cpp_demangle_push_fp(ddata,
1237                             decode_fp_to_double));
1238                 return (cpp_demangle_push_fp(ddata, decode_fp_to_float128));
1239
1240         case 'i':
1241         case 'j':
1242         case 'l':
1243         case 'm':
1244         case 'n':
1245         case 's':
1246         case 't':
1247         case 'x':
1248         case 'y':
1249                 if (*(++ddata->cur) == 'n') {
1250                         if (!DEM_PUSH_STR(ddata, "-"))
1251                                 return (0);
1252                         ++ddata->cur;
1253                 }
1254                 num = ddata->cur;
1255                 while (*ddata->cur != 'E') {
1256                         if (!ELFTC_ISDIGIT(*ddata->cur))
1257                                 return (0);
1258                         ++ddata->cur;
1259                 }
1260                 ++ddata->cur;
1261                 return (cpp_demangle_push_str(ddata, num,
1262                     ddata->cur - num - 1));
1263
1264         default:
1265                 return (0);
1266         }
1267 }
1268
1269 static int
1270 cpp_demangle_read_expression(struct cpp_demangle_data *ddata)
1271 {
1272
1273         if (ddata == NULL || *ddata->cur == '\0')
1274                 return (0);
1275
1276         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
1277         case SIMPLE_HASH('s', 't'):
1278                 ddata->cur += 2;
1279                 return (cpp_demangle_read_type(ddata, NULL));
1280
1281         case SIMPLE_HASH('s', 'r'):
1282                 ddata->cur += 2;
1283                 if (!cpp_demangle_read_type(ddata, NULL))
1284                         return (0);
1285                 if (!cpp_demangle_read_uqname(ddata))
1286                         return (0);
1287                 if (*ddata->cur == 'I')
1288                         return (cpp_demangle_read_tmpl_args(ddata));
1289                 return (1);
1290
1291         case SIMPLE_HASH('a', 'a'):
1292                 /* operator && */
1293                 ddata->cur += 2;
1294                 return (cpp_demangle_read_expression_binary(ddata, "&&", 2));
1295
1296         case SIMPLE_HASH('a', 'd'):
1297                 /* operator & (unary) */
1298                 ddata->cur += 2;
1299                 return (cpp_demangle_read_expression_unary(ddata, "&", 1));
1300
1301         case SIMPLE_HASH('a', 'n'):
1302                 /* operator & */
1303                 ddata->cur += 2;
1304                 return (cpp_demangle_read_expression_binary(ddata, "&", 1));
1305
1306         case SIMPLE_HASH('a', 'N'):
1307                 /* operator &= */
1308                 ddata->cur += 2;
1309                 return (cpp_demangle_read_expression_binary(ddata, "&=", 2));
1310
1311         case SIMPLE_HASH('a', 'S'):
1312                 /* operator = */
1313                 ddata->cur += 2;
1314                 return (cpp_demangle_read_expression_binary(ddata, "=", 1));
1315
1316         case SIMPLE_HASH('c', 'l'):
1317                 /* operator () */
1318                 ddata->cur += 2;
1319                 return (cpp_demangle_read_expression_binary(ddata, "()", 2));
1320
1321         case SIMPLE_HASH('c', 'm'):
1322                 /* operator , */
1323                 ddata->cur += 2;
1324                 return (cpp_demangle_read_expression_binary(ddata, ",", 1));
1325
1326         case SIMPLE_HASH('c', 'o'):
1327                 /* operator ~ */
1328                 ddata->cur += 2;
1329                 return (cpp_demangle_read_expression_binary(ddata, "~", 1));
1330
1331         case SIMPLE_HASH('c', 'v'):
1332                 /* operator (cast) */
1333                 ddata->cur += 2;
1334                 return (cpp_demangle_read_expression_binary(ddata, "(cast)", 6));
1335
1336         case SIMPLE_HASH('d', 'a'):
1337                 /* operator delete [] */
1338                 ddata->cur += 2;
1339                 return (cpp_demangle_read_expression_unary(ddata, "delete []", 9));
1340
1341         case SIMPLE_HASH('d', 'e'):
1342                 /* operator * (unary) */
1343                 ddata->cur += 2;
1344                 return (cpp_demangle_read_expression_unary(ddata, "*", 1));
1345
1346         case SIMPLE_HASH('d', 'l'):
1347                 /* operator delete */
1348                 ddata->cur += 2;
1349                 return (cpp_demangle_read_expression_unary(ddata, "delete", 6));
1350
1351         case SIMPLE_HASH('d', 'v'):
1352                 /* operator / */
1353                 ddata->cur += 2;
1354                 return (cpp_demangle_read_expression_binary(ddata, "/", 1));
1355
1356         case SIMPLE_HASH('d', 'V'):
1357                 /* operator /= */
1358                 ddata->cur += 2;
1359                 return (cpp_demangle_read_expression_binary(ddata, "/=", 2));
1360
1361         case SIMPLE_HASH('e', 'o'):
1362                 /* operator ^ */
1363                 ddata->cur += 2;
1364                 return (cpp_demangle_read_expression_binary(ddata, "^", 1));
1365
1366         case SIMPLE_HASH('e', 'O'):
1367                 /* operator ^= */
1368                 ddata->cur += 2;
1369                 return (cpp_demangle_read_expression_binary(ddata, "^=", 2));
1370
1371         case SIMPLE_HASH('e', 'q'):
1372                 /* operator == */
1373                 ddata->cur += 2;
1374                 return (cpp_demangle_read_expression_binary(ddata, "==", 2));
1375
1376         case SIMPLE_HASH('g', 'e'):
1377                 /* operator >= */
1378                 ddata->cur += 2;
1379                 return (cpp_demangle_read_expression_binary(ddata, ">=", 2));
1380
1381         case SIMPLE_HASH('g', 't'):
1382                 /* operator > */
1383                 ddata->cur += 2;
1384                 return (cpp_demangle_read_expression_binary(ddata, ">", 1));
1385
1386         case SIMPLE_HASH('i', 'x'):
1387                 /* operator [] */
1388                 ddata->cur += 2;
1389                 return (cpp_demangle_read_expression_binary(ddata, "[]", 2));
1390
1391         case SIMPLE_HASH('l', 'e'):
1392                 /* operator <= */
1393                 ddata->cur += 2;
1394                 return (cpp_demangle_read_expression_binary(ddata, "<=", 2));
1395
1396         case SIMPLE_HASH('l', 's'):
1397                 /* operator << */
1398                 ddata->cur += 2;
1399                 return (cpp_demangle_read_expression_binary(ddata, "<<", 2));
1400
1401         case SIMPLE_HASH('l', 'S'):
1402                 /* operator <<= */
1403                 ddata->cur += 2;
1404                 return (cpp_demangle_read_expression_binary(ddata, "<<=", 3));
1405
1406         case SIMPLE_HASH('l', 't'):
1407                 /* operator < */
1408                 ddata->cur += 2;
1409                 return (cpp_demangle_read_expression_binary(ddata, "<", 1));
1410
1411         case SIMPLE_HASH('m', 'i'):
1412                 /* operator - */
1413                 ddata->cur += 2;
1414                 return (cpp_demangle_read_expression_binary(ddata, "-", 1));
1415
1416         case SIMPLE_HASH('m', 'I'):
1417                 /* operator -= */
1418                 ddata->cur += 2;
1419                 return (cpp_demangle_read_expression_binary(ddata, "-=", 2));
1420
1421         case SIMPLE_HASH('m', 'l'):
1422                 /* operator * */
1423                 ddata->cur += 2;
1424                 return (cpp_demangle_read_expression_binary(ddata, "*", 1));
1425
1426         case SIMPLE_HASH('m', 'L'):
1427                 /* operator *= */
1428                 ddata->cur += 2;
1429                 return (cpp_demangle_read_expression_binary(ddata, "*=", 2));
1430
1431         case SIMPLE_HASH('m', 'm'):
1432                 /* operator -- */
1433                 ddata->cur += 2;
1434                 return (cpp_demangle_read_expression_binary(ddata, "--", 2));
1435
1436         case SIMPLE_HASH('n', 'a'):
1437                 /* operator new[] */
1438                 ddata->cur += 2;
1439                 return (cpp_demangle_read_expression_unary(ddata, "new []", 6));
1440
1441         case SIMPLE_HASH('n', 'e'):
1442                 /* operator != */
1443                 ddata->cur += 2;
1444                 return (cpp_demangle_read_expression_binary(ddata, "!=", 2));
1445
1446         case SIMPLE_HASH('n', 'g'):
1447                 /* operator - (unary) */
1448                 ddata->cur += 2;
1449                 return (cpp_demangle_read_expression_unary(ddata, "-", 1));
1450
1451         case SIMPLE_HASH('n', 't'):
1452                 /* operator ! */
1453                 ddata->cur += 2;
1454                 return (cpp_demangle_read_expression_binary(ddata, "!", 1));
1455
1456         case SIMPLE_HASH('n', 'w'):
1457                 /* operator new */
1458                 ddata->cur += 2;
1459                 return (cpp_demangle_read_expression_unary(ddata, "new", 3));
1460
1461         case SIMPLE_HASH('o', 'o'):
1462                 /* operator || */
1463                 ddata->cur += 2;
1464                 return (cpp_demangle_read_expression_binary(ddata, "||", 2));
1465
1466         case SIMPLE_HASH('o', 'r'):
1467                 /* operator | */
1468                 ddata->cur += 2;
1469                 return (cpp_demangle_read_expression_binary(ddata, "|", 1));
1470
1471         case SIMPLE_HASH('o', 'R'):
1472                 /* operator |= */
1473                 ddata->cur += 2;
1474                 return (cpp_demangle_read_expression_binary(ddata, "|=", 2));
1475
1476         case SIMPLE_HASH('p', 'l'):
1477                 /* operator + */
1478                 ddata->cur += 2;
1479                 return (cpp_demangle_read_expression_binary(ddata, "+", 1));
1480
1481         case SIMPLE_HASH('p', 'L'):
1482                 /* operator += */
1483                 ddata->cur += 2;
1484                 return (cpp_demangle_read_expression_binary(ddata, "+=", 2));
1485
1486         case SIMPLE_HASH('p', 'm'):
1487                 /* operator ->* */
1488                 ddata->cur += 2;
1489                 return (cpp_demangle_read_expression_binary(ddata, "->*", 3));
1490
1491         case SIMPLE_HASH('p', 'p'):
1492                 /* operator ++ */
1493                 ddata->cur += 2;
1494                 return (cpp_demangle_read_expression_binary(ddata, "++", 2));
1495
1496         case SIMPLE_HASH('p', 's'):
1497                 /* operator + (unary) */
1498                 ddata->cur += 2;
1499                 return (cpp_demangle_read_expression_unary(ddata, "+", 1));
1500
1501         case SIMPLE_HASH('p', 't'):
1502                 /* operator -> */
1503                 ddata->cur += 2;
1504                 return (cpp_demangle_read_expression_binary(ddata, "->", 2));
1505
1506         case SIMPLE_HASH('q', 'u'):
1507                 /* operator ? */
1508                 ddata->cur += 2;
1509                 return (cpp_demangle_read_expression_trinary(ddata, "?", 1,
1510                     ":", 1));
1511
1512         case SIMPLE_HASH('r', 'm'):
1513                 /* operator % */
1514                 ddata->cur += 2;
1515                 return (cpp_demangle_read_expression_binary(ddata, "%", 1));
1516
1517         case SIMPLE_HASH('r', 'M'):
1518                 /* operator %= */
1519                 ddata->cur += 2;
1520                 return (cpp_demangle_read_expression_binary(ddata, "%=", 2));
1521
1522         case SIMPLE_HASH('r', 's'):
1523                 /* operator >> */
1524                 ddata->cur += 2;
1525                 return (cpp_demangle_read_expression_binary(ddata, ">>", 2));
1526
1527         case SIMPLE_HASH('r', 'S'):
1528                 /* operator >>= */
1529                 ddata->cur += 2;
1530                 return (cpp_demangle_read_expression_binary(ddata, ">>=", 3));
1531
1532         case SIMPLE_HASH('r', 'z'):
1533                 /* operator sizeof */
1534                 ddata->cur += 2;
1535                 return (cpp_demangle_read_expression_unary(ddata, "sizeof", 6));
1536
1537         case SIMPLE_HASH('s', 'v'):
1538                 /* operator sizeof */
1539                 ddata->cur += 2;
1540                 return (cpp_demangle_read_expression_unary(ddata, "sizeof", 6));
1541         }
1542
1543         switch (*ddata->cur) {
1544         case 'L':
1545                 return (cpp_demangle_read_expr_primary(ddata));
1546         case 'T':
1547                 return (cpp_demangle_read_tmpl_param(ddata));
1548         }
1549
1550         return (0);
1551 }
1552
1553 static int
1554 cpp_demangle_read_expression_flat(struct cpp_demangle_data *ddata, char **str)
1555 {
1556         struct vector_str *output;
1557         size_t i, p_idx, idx, exp_len;
1558         char *exp;
1559
1560         output = &ddata->output;
1561
1562         p_idx = output->size;
1563
1564         if (!cpp_demangle_read_expression(ddata))
1565                 return (0);
1566
1567         if ((exp = vector_str_substr(output, p_idx, output->size - 1,
1568             &exp_len)) == NULL)
1569                 return (0);
1570
1571         idx = output->size;
1572         for (i = p_idx; i < idx; ++i) {
1573                 if (!vector_str_pop(output)) {
1574                         free(exp);
1575                         return (0);
1576                 }
1577         }
1578
1579         *str = exp;
1580
1581         return (1);
1582 }
1583
1584 static int
1585 cpp_demangle_read_expression_binary(struct cpp_demangle_data *ddata,
1586     const char *name, size_t len)
1587 {
1588
1589         if (ddata == NULL || name == NULL || len == 0)
1590                 return (0);
1591         if (!cpp_demangle_read_expression(ddata))
1592                 return (0);
1593         if (!cpp_demangle_push_str(ddata, name, len))
1594                 return (0);
1595
1596         return (cpp_demangle_read_expression(ddata));
1597 }
1598
1599 static int
1600 cpp_demangle_read_expression_unary(struct cpp_demangle_data *ddata,
1601     const char *name, size_t len)
1602 {
1603
1604         if (ddata == NULL || name == NULL || len == 0)
1605                 return (0);
1606         if (!cpp_demangle_read_expression(ddata))
1607                 return (0);
1608
1609         return (cpp_demangle_push_str(ddata, name, len));
1610 }
1611
1612 static int
1613 cpp_demangle_read_expression_trinary(struct cpp_demangle_data *ddata,
1614     const char *name1, size_t len1, const char *name2, size_t len2)
1615 {
1616
1617         if (ddata == NULL || name1 == NULL || len1 == 0 || name2 == NULL ||
1618             len2 == 0)
1619                 return (0);
1620
1621         if (!cpp_demangle_read_expression(ddata))
1622                 return (0);
1623         if (!cpp_demangle_push_str(ddata, name1, len1))
1624                 return (0);
1625         if (!cpp_demangle_read_expression(ddata))
1626                 return (0);
1627         if (!cpp_demangle_push_str(ddata, name2, len2))
1628                 return (0);
1629
1630         return (cpp_demangle_read_expression(ddata));
1631 }
1632
1633 static int
1634 cpp_demangle_read_function(struct cpp_demangle_data *ddata, int *ext_c,
1635     struct vector_type_qualifier *v)
1636 {
1637         struct type_delimit td;
1638         struct read_cmd_item *rc;
1639         size_t class_type_size, class_type_len, limit;
1640         const char *class_type;
1641         int i;
1642         bool paren, non_cv_qualifier;
1643
1644         if (ddata == NULL || *ddata->cur != 'F' || v == NULL)
1645                 return (0);
1646
1647         ++ddata->cur;
1648         if (*ddata->cur == 'Y') {
1649                 if (ext_c != NULL)
1650                         *ext_c = 1;
1651                 ++ddata->cur;
1652         }
1653
1654         /* Return type */
1655         if (!cpp_demangle_read_type(ddata, NULL))
1656                 return (0);
1657
1658         if (*ddata->cur != 'E') {
1659                 if (!DEM_PUSH_STR(ddata, " "))
1660                         return (0);
1661
1662                 non_cv_qualifier = false;
1663                 if (v->size > 0) {
1664                         for (i = 0; (size_t) i < v->size; i++) {
1665                                 if (v->q_container[i] != TYPE_RST &&
1666                                     v->q_container[i] != TYPE_VAT &&
1667                                     v->q_container[i] != TYPE_CST) {
1668                                         non_cv_qualifier = true;
1669                                         break;
1670                                 }
1671                         }
1672                 }
1673
1674                 paren = false;
1675                 rc = vector_read_cmd_find(&ddata->cmd, READ_PTRMEM);
1676                 if (non_cv_qualifier || rc != NULL) {
1677                         if (!DEM_PUSH_STR(ddata, "("))
1678                                 return (0);
1679                         paren = true;
1680                 }
1681
1682                 /* Push non-cv qualifiers. */
1683                 ddata->push_qualifier = PUSH_NON_CV_QUALIFIER;
1684                 if (!cpp_demangle_push_type_qualifier(ddata, v, NULL))
1685                         return (0);
1686
1687                 if (rc) {
1688                         if (non_cv_qualifier && !DEM_PUSH_STR(ddata, " "))
1689                                 return (0);
1690                         if ((class_type_size = ddata->class_type.size) == 0)
1691                                 return (0);
1692                         class_type =
1693                             ddata->class_type.container[class_type_size - 1];
1694                         if (class_type == NULL)
1695                                 return (0);
1696                         if ((class_type_len = strlen(class_type)) == 0)
1697                                 return (0);
1698                         if (!cpp_demangle_push_str(ddata, class_type,
1699                             class_type_len))
1700                                 return (0);
1701                         if (!DEM_PUSH_STR(ddata, "::*"))
1702                                 return (0);
1703                         /* Push pointer-to-member qualifiers. */
1704                         ddata->push_qualifier = PUSH_ALL_QUALIFIER;
1705                         if (!cpp_demangle_push_type_qualifier(ddata, rc->data,
1706                             NULL))
1707                                 return (0);
1708                         ++ddata->func_type;
1709                 }
1710
1711                 if (paren) {
1712                         if (!DEM_PUSH_STR(ddata, ")"))
1713                                 return (0);
1714                         paren = false;
1715                 }
1716
1717                 td.paren = false;
1718                 td.firstp = true;
1719                 limit = 0;
1720                 ddata->is_functype = true;
1721                 for (;;) {
1722                         if (!cpp_demangle_read_type(ddata, &td))
1723                                 return (0);
1724                         if (*ddata->cur == 'E')
1725                                 break;
1726                         if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1727                                 return (0);
1728                 }
1729                 ddata->is_functype = false;
1730                 if (td.paren) {
1731                         if (!DEM_PUSH_STR(ddata, ")"))
1732                                 return (0);
1733                         td.paren = false;
1734                 }
1735
1736                 /* Push CV qualifiers. */
1737                 ddata->push_qualifier = PUSH_CV_QUALIFIER;
1738                 if (!cpp_demangle_push_type_qualifier(ddata, v, NULL))
1739                         return (0);
1740
1741                 ddata->push_qualifier = PUSH_ALL_QUALIFIER;
1742
1743                 /* Release type qualifier vector. */
1744                 vector_type_qualifier_dest(v);
1745                 if (!vector_type_qualifier_init(v))
1746                         return (0);
1747
1748                 /* Push ref-qualifiers. */
1749                 if (ddata->ref_qualifier) {
1750                         switch (ddata->ref_qualifier_type) {
1751                         case TYPE_REF:
1752                                 if (!DEM_PUSH_STR(ddata, " &"))
1753                                         return (0);
1754                                 break;
1755                         case TYPE_RREF:
1756                                 if (!DEM_PUSH_STR(ddata, " &&"))
1757                                         return (0);
1758                                 break;
1759                         default:
1760                                 return (0);
1761                         }
1762                         ddata->ref_qualifier = false;
1763                 }
1764         }
1765
1766         ++ddata->cur;
1767
1768         return (1);
1769 }
1770
1771 /* read encoding, encoding are function name, data name, special-name */
1772 static int
1773 cpp_demangle_read_encoding(struct cpp_demangle_data *ddata)
1774 {
1775         char *name, *type, *num_str;
1776         long offset;
1777         int rtn;
1778
1779         if (ddata == NULL || *ddata->cur == '\0')
1780                 return (0);
1781
1782         /* special name */
1783         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
1784         case SIMPLE_HASH('G', 'A'):
1785                 if (!DEM_PUSH_STR(ddata, "hidden alias for "))
1786                         return (0);
1787                 ddata->cur += 2;
1788                 if (*ddata->cur == '\0')
1789                         return (0);
1790                 return (cpp_demangle_read_encoding(ddata));
1791
1792         case SIMPLE_HASH('G', 'R'):
1793                 if (!DEM_PUSH_STR(ddata, "reference temporary #"))
1794                         return (0);
1795                 ddata->cur += 2;
1796                 if (*ddata->cur == '\0')
1797                         return (0);
1798                 if (!cpp_demangle_read_name_flat(ddata, &name))
1799                         return (0);
1800                 rtn = 0;
1801                 if (!cpp_demangle_read_number_as_string(ddata, &num_str))
1802                         goto clean1;
1803                 if (!DEM_PUSH_STR(ddata, num_str))
1804                         goto clean2;
1805                 if (!DEM_PUSH_STR(ddata, " for "))
1806                         goto clean2;
1807                 if (!DEM_PUSH_STR(ddata, name))
1808                         goto clean2;
1809                 rtn = 1;
1810         clean2:
1811                 free(num_str);
1812         clean1:
1813                 free(name);
1814                 return (rtn);
1815
1816         case SIMPLE_HASH('G', 'T'):
1817                 ddata->cur += 2;
1818                 if (*ddata->cur == '\0')
1819                         return (0);
1820                 switch (*ddata->cur) {
1821                 case 'n':
1822                         if (!DEM_PUSH_STR(ddata, "non-transaction clone for "))
1823                                 return (0);
1824                         break;
1825                 case 't':
1826                 default:
1827                         if (!DEM_PUSH_STR(ddata, "transaction clone for "))
1828                                 return (0);
1829                         break;
1830                 }
1831                 ++ddata->cur;
1832                 return (cpp_demangle_read_encoding(ddata));
1833
1834         case SIMPLE_HASH('G', 'V'):
1835                 /* sentry object for 1 time init */
1836                 if (!DEM_PUSH_STR(ddata, "guard variable for "))
1837                         return (0);
1838                 ddata->cur += 2;
1839                 break;
1840
1841         case SIMPLE_HASH('T', 'c'):
1842                 /* virtual function covariant override thunk */
1843                 if (!DEM_PUSH_STR(ddata,
1844                     "virtual function covariant override "))
1845                         return (0);
1846                 ddata->cur += 2;
1847                 if (*ddata->cur == '\0')
1848                         return (0);
1849                 if (!cpp_demangle_read_offset(ddata))
1850                         return (0);
1851                 if (!cpp_demangle_read_offset(ddata))
1852                         return (0);
1853                 return (cpp_demangle_read_encoding(ddata));
1854
1855         case SIMPLE_HASH('T', 'C'):
1856                 /* construction vtable */
1857                 if (!DEM_PUSH_STR(ddata, "construction vtable for "))
1858                         return (0);
1859                 ddata->cur += 2;
1860                 if (*ddata->cur == '\0')
1861                         return (0);
1862                 if (!cpp_demangle_read_type_flat(ddata, &type))
1863                         return (0);
1864                 rtn = 0;
1865                 if (!cpp_demangle_read_number(ddata, &offset))
1866                         goto clean3;
1867                 if (*ddata->cur++ != '_')
1868                         goto clean3;
1869                 if (!cpp_demangle_read_type(ddata, NULL))
1870                         goto clean3;
1871                 if (!DEM_PUSH_STR(ddata, "-in-"))
1872                         goto clean3;
1873                 if (!DEM_PUSH_STR(ddata, type))
1874                         goto clean3;
1875                 rtn = 1;
1876         clean3:
1877                 free(type);
1878                 return (rtn);
1879
1880         case SIMPLE_HASH('T', 'D'):
1881                 /* typeinfo common proxy */
1882                 break;
1883
1884         case SIMPLE_HASH('T', 'F'):
1885                 /* typeinfo fn */
1886                 if (!DEM_PUSH_STR(ddata, "typeinfo fn for "))
1887                         return (0);
1888                 ddata->cur += 2;
1889                 if (*ddata->cur == '\0')
1890                         return (0);
1891                 return (cpp_demangle_read_type(ddata, NULL));
1892
1893         case SIMPLE_HASH('T', 'h'):
1894                 /* virtual function non-virtual override thunk */
1895                 if (!DEM_PUSH_STR(ddata,
1896                     "virtual function non-virtual override "))
1897                         return (0);
1898                 ddata->cur += 2;
1899                 if (*ddata->cur == '\0')
1900                         return (0);
1901                 if (!cpp_demangle_read_nv_offset(ddata))
1902                         return (0);
1903                 return (cpp_demangle_read_encoding(ddata));
1904
1905         case SIMPLE_HASH('T', 'H'):
1906                 /* TLS init function */
1907                 if (!DEM_PUSH_STR(ddata, "TLS init function for "))
1908                         return (0);
1909                 ddata->cur += 2;
1910                 if (*ddata->cur == '\0')
1911                         return (0);
1912                 break;
1913
1914         case SIMPLE_HASH('T', 'I'):
1915                 /* typeinfo structure */
1916                 if (!DEM_PUSH_STR(ddata, "typeinfo for "))
1917                         return (0);
1918                 ddata->cur += 2;
1919                 if (*ddata->cur == '\0')
1920                         return (0);
1921                 return (cpp_demangle_read_type(ddata, NULL));
1922
1923         case SIMPLE_HASH('T', 'J'):
1924                 /* java class */
1925                 if (!DEM_PUSH_STR(ddata, "java Class for "))
1926                         return (0);
1927                 ddata->cur += 2;
1928                 if (*ddata->cur == '\0')
1929                         return (0);
1930                 return (cpp_demangle_read_type(ddata, NULL));
1931
1932         case SIMPLE_HASH('T', 'S'):
1933                 /* RTTI name (NTBS) */
1934                 if (!DEM_PUSH_STR(ddata, "typeinfo name for "))
1935                         return (0);
1936                 ddata->cur += 2;
1937                 if (*ddata->cur == '\0')
1938                         return (0);
1939                 return (cpp_demangle_read_type(ddata, NULL));
1940
1941         case SIMPLE_HASH('T', 'T'):
1942                 /* VTT table */
1943                 if (!DEM_PUSH_STR(ddata, "VTT for "))
1944                         return (0);
1945                 ddata->cur += 2;
1946                 if (*ddata->cur == '\0')
1947                         return (0);
1948                 return (cpp_demangle_read_type(ddata, NULL));
1949
1950         case SIMPLE_HASH('T', 'v'):
1951                 /* virtual function virtual override thunk */
1952                 if (!DEM_PUSH_STR(ddata, "virtual function virtual override "))
1953                         return (0);
1954                 ddata->cur += 2;
1955                 if (*ddata->cur == '\0')
1956                         return (0);
1957                 if (!cpp_demangle_read_v_offset(ddata))
1958                         return (0);
1959                 return (cpp_demangle_read_encoding(ddata));
1960
1961         case SIMPLE_HASH('T', 'V'):
1962                 /* virtual table */
1963                 if (!DEM_PUSH_STR(ddata, "vtable for "))
1964                         return (0);
1965                 ddata->cur += 2;
1966                 if (*ddata->cur == '\0')
1967                         return (0);
1968                 return (cpp_demangle_read_type(ddata, NULL));
1969
1970         case SIMPLE_HASH('T', 'W'):
1971                 /* TLS wrapper function */
1972                 if (!DEM_PUSH_STR(ddata, "TLS wrapper function for "))
1973                         return (0);
1974                 ddata->cur += 2;
1975                 if (*ddata->cur == '\0')
1976                         return (0);
1977                 break;
1978         }
1979
1980         return (cpp_demangle_read_name(ddata));
1981 }
1982
1983 static int
1984 cpp_demangle_read_local_name(struct cpp_demangle_data *ddata)
1985 {
1986         struct vector_str local_name;
1987         struct type_delimit td;
1988         size_t limit;
1989         bool  more_type;
1990
1991         if (ddata == NULL)
1992                 return (0);
1993         if (*(++ddata->cur) == '\0')
1994                 return (0);
1995
1996         if (!vector_str_init(&local_name))
1997                 return (0);
1998         ddata->cur_output = &local_name;
1999
2000         if (!cpp_demangle_read_encoding(ddata)) {
2001                 vector_str_dest(&local_name);
2002                 return (0);
2003         }
2004
2005         ddata->cur_output = &ddata->output;
2006
2007         td.paren = false;
2008         td.firstp = true;
2009         more_type = false;
2010         limit = 0;
2011
2012         /*
2013          * The first type is a return type if we just demangled template
2014          * args. (the template args is right next to the function name,
2015          * which means it's a template function)
2016          */
2017         if (ddata->is_tmpl) {
2018                 ddata->is_tmpl = false;
2019
2020                 /* Read return type */
2021                 if (!cpp_demangle_read_type(ddata, NULL)) {
2022                         vector_str_dest(&local_name);
2023                         return (0);
2024                 }
2025
2026                 more_type = true;
2027         }
2028
2029         /* Now we can push the name after possible return type is handled. */
2030         if (!vector_str_push_vector(&ddata->output, &local_name)) {
2031                 vector_str_dest(&local_name);
2032                 return (0);
2033         }
2034         vector_str_dest(&local_name);
2035
2036         while (*ddata->cur != '\0') {
2037                 if (!cpp_demangle_read_type(ddata, &td))
2038                         return (0);
2039                 if (more_type)
2040                         more_type = false;
2041                 if (*ddata->cur == 'E')
2042                         break;
2043                 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
2044                         return (0);
2045         }
2046         if (more_type)
2047                 return (0);
2048
2049         if (*(++ddata->cur) == '\0')
2050                 return (0);
2051         if (td.paren == true) {
2052                 if (!DEM_PUSH_STR(ddata, ")"))
2053                         return (0);
2054                 td.paren = false;
2055         }
2056         if (*ddata->cur == 's')
2057                 ++ddata->cur;
2058         else {
2059                 if (!DEM_PUSH_STR(ddata, "::"))
2060                         return (0);
2061                 if (!cpp_demangle_read_name(ddata))
2062                         return (0);
2063         }
2064         if (*ddata->cur == '_') {
2065                 ++ddata->cur;
2066                 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
2067                         ++ddata->cur;
2068         }
2069
2070         return (1);
2071 }
2072
2073 static int
2074 cpp_demangle_read_name(struct cpp_demangle_data *ddata)
2075 {
2076         struct vector_str *output, v;
2077         size_t p_idx, subst_str_len;
2078         int rtn;
2079         char *subst_str;
2080
2081         if (ddata == NULL || *ddata->cur == '\0')
2082                 return (0);
2083
2084         output = ddata->cur_output;
2085
2086         subst_str = NULL;
2087
2088         switch (*ddata->cur) {
2089         case 'S':
2090                 return (cpp_demangle_read_subst(ddata));
2091         case 'N':
2092                 return (cpp_demangle_read_nested_name(ddata));
2093         case 'Z':
2094                 return (cpp_demangle_read_local_name(ddata));
2095         }
2096
2097         if (!vector_str_init(&v))
2098                 return (0);
2099
2100         p_idx = output->size;
2101         rtn = 0;
2102         if (!cpp_demangle_read_uqname(ddata))
2103                 goto clean;
2104         if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
2105             &subst_str_len)) == NULL)
2106                 goto clean;
2107         if (subst_str_len > 8 && strstr(subst_str, "operator") != NULL) {
2108                 rtn = 1;
2109                 goto clean;
2110         }
2111         if (!vector_str_push(&v, subst_str, subst_str_len))
2112                 goto clean;
2113         if (!cpp_demangle_push_subst_v(ddata, &v))
2114                 goto clean;
2115
2116         if (*ddata->cur == 'I') {
2117                 p_idx = output->size;
2118                 if (!cpp_demangle_read_tmpl_args(ddata))
2119                         goto clean;
2120                 free(subst_str);
2121                 if ((subst_str = vector_str_substr(output, p_idx,
2122                     output->size - 1, &subst_str_len)) == NULL)
2123                         goto clean;
2124                 if (!vector_str_push(&v, subst_str, subst_str_len))
2125                         goto clean;
2126                 if (!cpp_demangle_push_subst_v(ddata, &v))
2127                         goto clean;
2128         }
2129
2130         rtn = 1;
2131
2132 clean:
2133         free(subst_str);
2134         vector_str_dest(&v);
2135
2136         return (rtn);
2137 }
2138
2139 static int
2140 cpp_demangle_read_name_flat(struct cpp_demangle_data *ddata, char **str)
2141 {
2142         struct vector_str *output;
2143         size_t i, p_idx, idx, name_len;
2144         char *name;
2145
2146         output = ddata->cur_output;
2147
2148         p_idx = output->size;
2149
2150         if (!cpp_demangle_read_name(ddata))
2151                 return (0);
2152
2153         if ((name = vector_str_substr(output, p_idx, output->size - 1,
2154             &name_len)) == NULL)
2155                 return (0);
2156
2157         idx = output->size;
2158         for (i = p_idx; i < idx; ++i) {
2159                 if (!vector_str_pop(output)) {
2160                         free(name);
2161                         return (0);
2162                 }
2163         }
2164
2165         *str = name;
2166
2167         return (1);
2168 }
2169
2170 static int
2171 cpp_demangle_read_nested_name(struct cpp_demangle_data *ddata)
2172 {
2173         struct vector_str *output, v;
2174         size_t limit, p_idx, subst_str_len;
2175         int rtn;
2176         char *subst_str;
2177
2178         if (ddata == NULL || *ddata->cur != 'N')
2179                 return (0);
2180         if (*(++ddata->cur) == '\0')
2181                 return (0);
2182
2183         do {
2184                 switch (*ddata->cur) {
2185                 case 'r':
2186                         ddata->mem_rst = true;
2187                         break;
2188                 case 'V':
2189                         ddata->mem_vat = true;
2190                         break;
2191                 case 'K':
2192                         ddata->mem_cst = true;
2193                         break;
2194                 case 'R':
2195                         ddata->mem_ref = true;
2196                         break;
2197                 case 'O':
2198                         ddata->mem_rref = true;
2199                         break;
2200                 default:
2201                         goto next;
2202                 }
2203         } while (*(++ddata->cur));
2204
2205 next:
2206         output = ddata->cur_output;
2207         if (!vector_str_init(&v))
2208                 return (0);
2209
2210         rtn = 0;
2211         limit = 0;
2212         for (;;) {
2213                 p_idx = output->size;
2214                 switch (*ddata->cur) {
2215                 case 'I':
2216                         if (!cpp_demangle_read_tmpl_args(ddata))
2217                                 goto clean;
2218                         break;
2219                 case 'S':
2220                         if (!cpp_demangle_read_subst(ddata))
2221                                 goto clean;
2222                         break;
2223                 case 'T':
2224                         if (!cpp_demangle_read_tmpl_param(ddata))
2225                                 goto clean;
2226                         break;
2227                 default:
2228                         if (!cpp_demangle_read_uqname(ddata))
2229                                 goto clean;
2230                 }
2231
2232                 if (p_idx == output->size)
2233                         goto next_comp;
2234                 if ((subst_str = vector_str_substr(output, p_idx,
2235                     output->size - 1, &subst_str_len)) == NULL)
2236                         goto clean;
2237                 if (!vector_str_push(&v, subst_str, subst_str_len)) {
2238                         free(subst_str);
2239                         goto clean;
2240                 }
2241                 free(subst_str);
2242
2243                 if (!cpp_demangle_push_subst_v(ddata, &v))
2244                         goto clean;
2245
2246         next_comp:
2247                 if (*ddata->cur == 'E')
2248                         break;
2249                 else if (*ddata->cur != 'I' && *ddata->cur != 'C' &&
2250                     *ddata->cur != 'D' && p_idx != output->size) {
2251                         if (!DEM_PUSH_STR(ddata, "::"))
2252                                 goto clean;
2253                         if (!VEC_PUSH_STR(&v, "::"))
2254                                 goto clean;
2255                 }
2256                 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
2257                         goto clean;
2258         }
2259
2260         ++ddata->cur;
2261         rtn = 1;
2262
2263 clean:
2264         vector_str_dest(&v);
2265
2266         return (rtn);
2267 }
2268
2269 /*
2270  * read number
2271  * number ::= [n] <decimal>
2272  */
2273 static int
2274 cpp_demangle_read_number(struct cpp_demangle_data *ddata, long *rtn)
2275 {
2276         long len, negative_factor;
2277
2278         if (ddata == NULL || rtn == NULL)
2279                 return (0);
2280
2281         negative_factor = 1;
2282         if (*ddata->cur == 'n') {
2283                 negative_factor = -1;
2284
2285                 ++ddata->cur;
2286         }
2287         if (ELFTC_ISDIGIT(*ddata->cur) == 0)
2288                 return (0);
2289
2290         errno = 0;
2291         if ((len = strtol(ddata->cur, (char **) NULL, 10)) == 0 &&
2292             errno != 0)
2293                 return (0);
2294
2295         while (ELFTC_ISDIGIT(*ddata->cur) != 0)
2296                 ++ddata->cur;
2297
2298         assert(len >= 0);
2299         assert(negative_factor == 1 || negative_factor == -1);
2300
2301         *rtn = len * negative_factor;
2302
2303         return (1);
2304 }
2305
2306 static int
2307 cpp_demangle_read_number_as_string(struct cpp_demangle_data *ddata, char **str)
2308 {
2309         long n;
2310
2311         if (!cpp_demangle_read_number(ddata, &n)) {
2312                 *str = NULL;
2313                 return (0);
2314         }
2315
2316         if (asprintf(str, "%ld", n) < 0) {
2317                 *str = NULL;
2318                 return (0);
2319         }
2320
2321         return (1);
2322 }
2323
2324 static int
2325 cpp_demangle_read_nv_offset(struct cpp_demangle_data *ddata)
2326 {
2327
2328         if (ddata == NULL)
2329                 return (0);
2330
2331         if (!DEM_PUSH_STR(ddata, "offset : "))
2332                 return (0);
2333
2334         return (cpp_demangle_read_offset_number(ddata));
2335 }
2336
2337 /* read offset, offset are nv-offset, v-offset */
2338 static int
2339 cpp_demangle_read_offset(struct cpp_demangle_data *ddata)
2340 {
2341
2342         if (ddata == NULL)
2343                 return (0);
2344
2345         if (*ddata->cur == 'h') {
2346                 ++ddata->cur;
2347                 return (cpp_demangle_read_nv_offset(ddata));
2348         } else if (*ddata->cur == 'v') {
2349                 ++ddata->cur;
2350                 return (cpp_demangle_read_v_offset(ddata));
2351         }
2352
2353         return (0);
2354 }
2355
2356 static int
2357 cpp_demangle_read_offset_number(struct cpp_demangle_data *ddata)
2358 {
2359         bool negative;
2360         const char *start;
2361
2362         if (ddata == NULL || *ddata->cur == '\0')
2363                 return (0);
2364
2365         /* offset could be negative */
2366         if (*ddata->cur == 'n') {
2367                 negative = true;
2368                 start = ddata->cur + 1;
2369         } else {
2370                 negative = false;
2371                 start = ddata->cur;
2372         }
2373
2374         while (*ddata->cur != '_')
2375                 ++ddata->cur;
2376
2377         if (negative && !DEM_PUSH_STR(ddata, "-"))
2378                 return (0);
2379
2380         assert(start != NULL);
2381
2382         if (!cpp_demangle_push_str(ddata, start, ddata->cur - start))
2383                 return (0);
2384         if (!DEM_PUSH_STR(ddata, " "))
2385                 return (0);
2386
2387         ++ddata->cur;
2388
2389         return (1);
2390 }
2391
2392 static int
2393 cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *ddata,
2394     struct vector_type_qualifier *v)
2395 {
2396         size_t class_type_len, i, idx, p_idx;
2397         int p_func_type, rtn;
2398         char *class_type;
2399
2400         if (ddata == NULL || *ddata->cur != 'M' || *(++ddata->cur) == '\0')
2401                 return (0);
2402
2403         p_idx = ddata->output.size;
2404         if (!cpp_demangle_read_type(ddata, NULL))
2405                 return (0);
2406
2407         if ((class_type = vector_str_substr(&ddata->output, p_idx,
2408             ddata->output.size - 1, &class_type_len)) == NULL)
2409                 return (0);
2410
2411         rtn = 0;
2412         idx = ddata->output.size;
2413         for (i = p_idx; i < idx; ++i)
2414                 if (!vector_str_pop(&ddata->output))
2415                         goto clean1;
2416
2417         if (!vector_read_cmd_push(&ddata->cmd, READ_PTRMEM, v))
2418                 goto clean1;
2419
2420         if (!vector_str_push(&ddata->class_type, class_type, class_type_len))
2421                 goto clean2;
2422
2423         p_func_type = ddata->func_type;
2424         if (!cpp_demangle_read_type(ddata, NULL))
2425                 goto clean3;
2426
2427         if (p_func_type == ddata->func_type) {
2428                 if (!DEM_PUSH_STR(ddata, " "))
2429                         goto clean3;
2430                 if (!cpp_demangle_push_str(ddata, class_type, class_type_len))
2431                         goto clean3;
2432                 if (!DEM_PUSH_STR(ddata, "::*"))
2433                         goto clean3;
2434         }
2435
2436         rtn = 1;
2437 clean3:
2438         if (!vector_str_pop(&ddata->class_type))
2439                 rtn = 0;
2440 clean2:
2441         if (!vector_read_cmd_pop(&ddata->cmd))
2442                 rtn = 0;
2443 clean1:
2444         free(class_type);
2445
2446         vector_type_qualifier_dest(v);
2447         if (!vector_type_qualifier_init(v))
2448                 return (0);
2449
2450         return (rtn);
2451 }
2452
2453 /* read source-name, source-name is <len> <ID> */
2454 static int
2455 cpp_demangle_read_sname(struct cpp_demangle_data *ddata)
2456 {
2457         long len;
2458         int err;
2459
2460         if (ddata == NULL || cpp_demangle_read_number(ddata, &len) == 0 ||
2461             len <= 0)
2462                 return (0);
2463
2464         if (len == 12 && (memcmp("_GLOBAL__N_1", ddata->cur, 12) == 0))
2465                 err = DEM_PUSH_STR(ddata, "(anonymous namespace)");
2466         else
2467                 err = cpp_demangle_push_str(ddata, ddata->cur, len);
2468
2469         if (err == 0)
2470                 return (0);
2471
2472         assert(ddata->cur_output->size > 0);
2473         if (vector_read_cmd_find(&ddata->cmd, READ_TMPL) == NULL)
2474                 ddata->last_sname =
2475                     ddata->cur_output->container[ddata->output.size - 1];
2476
2477         ddata->cur += len;
2478
2479         return (1);
2480 }
2481
2482 static int
2483 cpp_demangle_read_subst(struct cpp_demangle_data *ddata)
2484 {
2485         long nth;
2486
2487         if (ddata == NULL || *ddata->cur == '\0')
2488                 return (0);
2489
2490         /* abbreviations of the form Sx */
2491         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
2492         case SIMPLE_HASH('S', 'a'):
2493                 /* std::allocator */
2494                 if (!DEM_PUSH_STR(ddata, "std::allocator"))
2495                         return (0);
2496                 ddata->cur += 2;
2497                 if (*ddata->cur == 'I')
2498                         return (cpp_demangle_read_subst_stdtmpl(ddata,
2499                             "std::allocator"));
2500                 return (1);
2501
2502         case SIMPLE_HASH('S', 'b'):
2503                 /* std::basic_string */
2504                 if (!DEM_PUSH_STR(ddata, "std::basic_string"))
2505                         return (0);
2506                 ddata->cur += 2;
2507                 if (*ddata->cur == 'I')
2508                         return (cpp_demangle_read_subst_stdtmpl(ddata,
2509                             "std::basic_string"));
2510                 return (1);
2511
2512         case SIMPLE_HASH('S', 'd'):
2513                 /* std::basic_iostream<char, std::char_traits<char> > */
2514                 if (!DEM_PUSH_STR(ddata, "std::basic_iostream<char, "
2515                     "std::char_traits<char> >"))
2516                         return (0);
2517                 ddata->last_sname = "basic_iostream";
2518                 ddata->cur += 2;
2519                 if (*ddata->cur == 'I')
2520                         return (cpp_demangle_read_subst_stdtmpl(ddata,
2521                             "std::basic_iostream<char, std::char_traits"
2522                                 "<char> >"));
2523                 return (1);
2524
2525         case SIMPLE_HASH('S', 'i'):
2526                 /* std::basic_istream<char, std::char_traits<char> > */
2527                 if (!DEM_PUSH_STR(ddata, "std::basic_istream<char, "
2528                     "std::char_traits<char> >"))
2529                         return (0);
2530                 ddata->last_sname = "basic_istream";
2531                 ddata->cur += 2;
2532                 if (*ddata->cur == 'I')
2533                         return (cpp_demangle_read_subst_stdtmpl(ddata,
2534                             "std::basic_istream<char, std::char_traits"
2535                                 "<char> >"));
2536                 return (1);
2537
2538         case SIMPLE_HASH('S', 'o'):
2539                 /* std::basic_ostream<char, std::char_traits<char> > */
2540                 if (!DEM_PUSH_STR(ddata, "std::basic_ostream<char, "
2541                     "std::char_traits<char> >"))
2542                         return (0);
2543                 ddata->last_sname = "basic_ostream";
2544                 ddata->cur += 2;
2545                 if (*ddata->cur == 'I')
2546                         return (cpp_demangle_read_subst_stdtmpl(ddata,
2547                             "std::basic_ostream<char, std::char_traits"
2548                                 "<char> >"));
2549                 return (1);
2550
2551         case SIMPLE_HASH('S', 's'):
2552                 /*
2553                  * std::basic_string<char, std::char_traits<char>,
2554                  * std::allocator<char> >
2555                  *
2556                  * a.k.a std::string
2557                  */
2558                 if (!DEM_PUSH_STR(ddata, "std::basic_string<char, "
2559                     "std::char_traits<char>, std::allocator<char> >"))
2560                         return (0);
2561                 ddata->last_sname = "string";
2562                 ddata->cur += 2;
2563                 if (*ddata->cur == 'I')
2564                         return (cpp_demangle_read_subst_stdtmpl(ddata,
2565                             "std::basic_string<char, std::char_traits<char>,"
2566                                 " std::allocator<char> >"));
2567                 return (1);
2568
2569         case SIMPLE_HASH('S', 't'):
2570                 /* std:: */
2571                 return (cpp_demangle_read_subst_std(ddata));
2572         }
2573
2574         if (*(++ddata->cur) == '\0')
2575                 return (0);
2576
2577         /* Skip unknown substitution abbreviations. */
2578         if (!(*ddata->cur >= '0' && *ddata->cur <= '9') &&
2579             !(*ddata->cur >= 'A' && *ddata->cur <= 'Z') &&
2580             *ddata->cur != '_') {
2581                 ++ddata->cur;
2582                 return (1);
2583         }
2584
2585         /* substitution */
2586         if (*ddata->cur == '_')
2587                 return (cpp_demangle_get_subst(ddata, 0));
2588         else {
2589                 errno = 0;
2590                 /* substitution number is base 36 */
2591                 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2592                     errno != 0)
2593                         return (0);
2594
2595                 /* first was '_', so increase one */
2596                 ++nth;
2597
2598                 while (*ddata->cur != '_')
2599                         ++ddata->cur;
2600
2601                 assert(nth > 0);
2602
2603                 return (cpp_demangle_get_subst(ddata, nth));
2604         }
2605
2606         /* NOTREACHED */
2607         return (0);
2608 }
2609
2610 static int
2611 cpp_demangle_read_subst_std(struct cpp_demangle_data *ddata)
2612 {
2613         struct vector_str *output, v;
2614         size_t p_idx, subst_str_len;
2615         int rtn;
2616         char *subst_str;
2617
2618         if (ddata == NULL)
2619                 return (0);
2620
2621         if (!vector_str_init(&v))
2622                 return (0);
2623
2624         subst_str = NULL;
2625         rtn = 0;
2626         if (!DEM_PUSH_STR(ddata, "std::"))
2627                 goto clean;
2628
2629         if (!VEC_PUSH_STR(&v, "std::"))
2630                 goto clean;
2631
2632         ddata->cur += 2;
2633
2634         output = ddata->cur_output;
2635
2636         p_idx = output->size;
2637         if (!cpp_demangle_read_uqname(ddata))
2638                 goto clean;
2639
2640         if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
2641             &subst_str_len)) == NULL)
2642                 goto clean;
2643
2644         if (!vector_str_push(&v, subst_str, subst_str_len))
2645                 goto clean;
2646
2647         if (!cpp_demangle_push_subst_v(ddata, &v))
2648                 goto clean;
2649
2650         if (*ddata->cur == 'I') {
2651                 p_idx = output->size;
2652                 if (!cpp_demangle_read_tmpl_args(ddata))
2653                         goto clean;
2654                 free(subst_str);
2655                 if ((subst_str = vector_str_substr(output, p_idx,
2656                     output->size - 1, &subst_str_len)) == NULL)
2657                         goto clean;
2658                 if (!vector_str_push(&v, subst_str, subst_str_len))
2659                         goto clean;
2660                 if (!cpp_demangle_push_subst_v(ddata, &v))
2661                         goto clean;
2662         }
2663
2664         rtn = 1;
2665 clean:
2666         free(subst_str);
2667         vector_str_dest(&v);
2668
2669         return (rtn);
2670 }
2671
2672 static int
2673 cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *ddata,
2674     const char *str)
2675 {
2676         struct vector_str *output;
2677         size_t p_idx, substr_len, len;
2678         int rtn;
2679         char *subst_str, *substr;
2680
2681         if (ddata == NULL || str == NULL)
2682                 return (0);
2683
2684         if ((len = strlen(str)) == 0)
2685                 return (0);
2686
2687         output = ddata->cur_output;
2688
2689         p_idx = output->size;
2690         substr = NULL;
2691         subst_str = NULL;
2692
2693         if (!cpp_demangle_read_tmpl_args(ddata))
2694                 return (0);
2695         if ((substr = vector_str_substr(output, p_idx, output->size - 1,
2696             &substr_len)) == NULL)
2697                 return (0);
2698
2699         rtn = 0;
2700         if ((subst_str = malloc(sizeof(char) * (substr_len + len + 1))) ==
2701             NULL)
2702                 goto clean;
2703
2704         memcpy(subst_str, str, len);
2705         memcpy(subst_str + len, substr, substr_len);
2706         subst_str[substr_len + len] = '\0';
2707
2708         if (!cpp_demangle_push_subst(ddata, subst_str, substr_len + len))
2709                 goto clean;
2710
2711         rtn = 1;
2712 clean:
2713         free(subst_str);
2714         free(substr);
2715
2716         return (rtn);
2717 }
2718
2719 static int
2720 cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *ddata)
2721 {
2722
2723         if (ddata == NULL || *ddata->cur == '\0')
2724                 return (0);
2725
2726         switch (*ddata->cur) {
2727         case 'L':
2728                 return (cpp_demangle_read_expr_primary(ddata));
2729         case 'X':
2730                 ++ddata->cur;
2731                 if (!cpp_demangle_read_expression(ddata))
2732                         return (0);
2733                 return (*ddata->cur++ == 'E');
2734         }
2735
2736         return (cpp_demangle_read_type(ddata, NULL));
2737 }
2738
2739 static int
2740 cpp_demangle_read_tmpl_args(struct cpp_demangle_data *ddata)
2741 {
2742         struct vector_str *v;
2743         size_t arg_len, idx, limit, size;
2744         char *arg;
2745
2746         if (ddata == NULL || *ddata->cur == '\0')
2747                 return (0);
2748
2749         ++ddata->cur;
2750
2751         if (!vector_read_cmd_push(&ddata->cmd, READ_TMPL, NULL))
2752                 return (0);
2753
2754         if (!DEM_PUSH_STR(ddata, "<"))
2755                 return (0);
2756
2757         limit = 0;
2758         v = ddata->cur_output;
2759         for (;;) {
2760                 idx = v->size;
2761                 if (!cpp_demangle_read_tmpl_arg(ddata))
2762                         return (0);
2763                 if ((arg = vector_str_substr(v, idx, v->size - 1, &arg_len)) ==
2764                     NULL)
2765                         return (0);
2766                 if (!vector_str_find(&ddata->tmpl, arg, arg_len) &&
2767                     !vector_str_push(&ddata->tmpl, arg, arg_len)) {
2768                         free(arg);
2769                         return (0);
2770                 }
2771
2772                 free(arg);
2773
2774                 if (*ddata->cur == 'E') {
2775                         ++ddata->cur;
2776                         size = v->size;
2777                         assert(size > 0);
2778                         if (!strncmp(v->container[size - 1], ">", 1)) {
2779                                 if (!DEM_PUSH_STR(ddata, " >"))
2780                                         return (0);
2781                         } else if (!DEM_PUSH_STR(ddata, ">"))
2782                                 return (0);
2783                         ddata->is_tmpl = true;
2784                         break;
2785                 } else if (*ddata->cur != 'I' &&
2786                     !DEM_PUSH_STR(ddata, ", "))
2787                         return (0);
2788
2789                 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
2790                         return (0);
2791         }
2792
2793         return (vector_read_cmd_pop(&ddata->cmd));
2794 }
2795
2796 /*
2797  * Read template parameter that forms in 'T[number]_'.
2798  * This function much like to read_subst but only for types.
2799  */
2800 static int
2801 cpp_demangle_read_tmpl_param(struct cpp_demangle_data *ddata)
2802 {
2803         long nth;
2804
2805         if (ddata == NULL || *ddata->cur != 'T')
2806                 return (0);
2807
2808         ++ddata->cur;
2809
2810         if (*ddata->cur == '_')
2811                 return (cpp_demangle_get_tmpl_param(ddata, 0));
2812         else {
2813
2814                 errno = 0;
2815                 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2816                     errno != 0)
2817                         return (0);
2818
2819                 /* T_ is first */
2820                 ++nth;
2821
2822                 while (*ddata->cur != '_')
2823                         ++ddata->cur;
2824
2825                 assert(nth > 0);
2826
2827                 return (cpp_demangle_get_tmpl_param(ddata, nth));
2828         }
2829
2830         /* NOTREACHED */
2831         return (0);
2832 }
2833
2834 static int
2835 cpp_demangle_read_type(struct cpp_demangle_data *ddata,
2836     struct type_delimit *td)
2837 {
2838         struct vector_type_qualifier v;
2839         struct vector_str *output, sv;
2840         size_t p_idx, type_str_len, subst_str_len;
2841         int extern_c, is_builtin;
2842         long len;
2843         const char *p;
2844         char *type_str, *exp_str, *num_str, *subst_str;
2845         bool skip_ref_qualifier, omit_void;
2846
2847         if (ddata == NULL)
2848                 return (0);
2849
2850         output = ddata->cur_output;
2851         if (td) {
2852                 if (td->paren == false) {
2853                         if (!DEM_PUSH_STR(ddata, "("))
2854                                 return (0);
2855                         if (ddata->output.size < 2)
2856                                 return (0);
2857                         td->paren = true;
2858                 }
2859
2860                 if (!td->firstp) {
2861                         if (*ddata->cur != 'I') {
2862                                 if (!DEM_PUSH_STR(ddata, ", "))
2863                                         return (0);
2864                         }
2865                 }
2866         }
2867
2868         assert(output != NULL);
2869         /*
2870          * [r, V, K] [P, R, O, C, G, U] builtin, function, class-enum, array
2871          * pointer-to-member, template-param, template-template-param, subst
2872          */
2873
2874         if (!vector_type_qualifier_init(&v))
2875                 return (0);
2876
2877         extern_c = 0;
2878         is_builtin = 1;
2879         p_idx = output->size;
2880         type_str = exp_str = num_str = NULL;
2881         skip_ref_qualifier = false;
2882
2883 again:
2884
2885         /* Clear ref-qualifier flag */
2886         if (*ddata->cur != 'R' && *ddata->cur != 'O' && *ddata->cur != 'E')
2887                 ddata->ref_qualifier = false;
2888
2889         /* builtin type */
2890         switch (*ddata->cur) {
2891         case 'a':
2892                 /* signed char */
2893                 if (!DEM_PUSH_STR(ddata, "signed char"))
2894                         goto clean;
2895                 ++ddata->cur;
2896                 goto rtn;
2897
2898         case 'A':
2899                 /* array type */
2900                 if (!cpp_demangle_read_array(ddata))
2901                         goto clean;
2902                 is_builtin = 0;
2903                 goto rtn;
2904
2905         case 'b':
2906                 /* bool */
2907                 if (!DEM_PUSH_STR(ddata, "bool"))
2908                         goto clean;
2909                 ++ddata->cur;
2910                 goto rtn;
2911
2912         case 'C':
2913                 /* complex pair */
2914                 if (!vector_type_qualifier_push(&v, TYPE_CMX))
2915                         goto clean;
2916                 ++ddata->cur;
2917                 if (td)
2918                         td->firstp = false;
2919                 goto again;
2920
2921         case 'c':
2922                 /* char */
2923                 if (!DEM_PUSH_STR(ddata, "char"))
2924                         goto clean;
2925                 ++ddata->cur;
2926                 goto rtn;
2927
2928         case 'd':
2929                 /* double */
2930                 if (!DEM_PUSH_STR(ddata, "double"))
2931                         goto clean;
2932                 ++ddata->cur;
2933                 goto rtn;
2934
2935         case 'D':
2936                 ++ddata->cur;
2937                 switch (*ddata->cur) {
2938                 case 'a':
2939                         /* auto */
2940                         if (!DEM_PUSH_STR(ddata, "auto"))
2941                                 goto clean;
2942                         ++ddata->cur;
2943                         break;
2944                 case 'c':
2945                         /* decltype(auto) */
2946                         if (!DEM_PUSH_STR(ddata, "decltype(auto)"))
2947                                 goto clean;
2948                         ++ddata->cur;
2949                         break;
2950                 case 'd':
2951                         /* IEEE 754r decimal floating point (64 bits) */
2952                         if (!DEM_PUSH_STR(ddata, "decimal64"))
2953                                 goto clean;
2954                         ++ddata->cur;
2955                         break;
2956                 case 'e':
2957                         /* IEEE 754r decimal floating point (128 bits) */
2958                         if (!DEM_PUSH_STR(ddata, "decimal128"))
2959                                 goto clean;
2960                         ++ddata->cur;
2961                         break;
2962                 case 'f':
2963                         /* IEEE 754r decimal floating point (32 bits) */
2964                         if (!DEM_PUSH_STR(ddata, "decimal32"))
2965                                 goto clean;
2966                         ++ddata->cur;
2967                         break;
2968                 case 'h':
2969                         /* IEEE 754r half-precision floating point (16 bits) */
2970                         if (!DEM_PUSH_STR(ddata, "half"))
2971                                 goto clean;
2972                         ++ddata->cur;
2973                         break;
2974                 case 'i':
2975                         /* char32_t */
2976                         if (!DEM_PUSH_STR(ddata, "char32_t"))
2977                                 goto clean;
2978                         ++ddata->cur;
2979                         break;
2980                 case 'n':
2981                         /* std::nullptr_t (i.e., decltype(nullptr)) */
2982                         if (!DEM_PUSH_STR(ddata, "decltype(nullptr)"))
2983                                 goto clean;
2984                         ++ddata->cur;
2985                         break;
2986                 case 's':
2987                         /* char16_t */
2988                         if (!DEM_PUSH_STR(ddata, "char16_t"))
2989                                 goto clean;
2990                         ++ddata->cur;
2991                         break;
2992                 case 'v':
2993                         /* gcc vector_size extension. */
2994                         ++ddata->cur;
2995                         if (*ddata->cur == '_') {
2996                                 ++ddata->cur;
2997                                 if (!cpp_demangle_read_expression_flat(ddata,
2998                                     &exp_str))
2999                                         goto clean;
3000                                 if (!VEC_PUSH_STR(&v.ext_name, exp_str))
3001                                         goto clean;
3002                         } else {
3003                                 if (!cpp_demangle_read_number_as_string(ddata,
3004                                     &num_str))
3005                                         goto clean;
3006                                 if (!VEC_PUSH_STR(&v.ext_name, num_str))
3007                                         goto clean;
3008                         }
3009                         if (*ddata->cur != '_')
3010                                 goto clean;
3011                         ++ddata->cur;
3012                         if (!vector_type_qualifier_push(&v, TYPE_VEC))
3013                                 goto clean;
3014                         if (td)
3015                                 td->firstp = false;
3016                         goto again;
3017                 default:
3018                         goto clean;
3019                 }
3020                 goto rtn;
3021
3022         case 'e':
3023                 /* long double */
3024                 if (!DEM_PUSH_STR(ddata, "long double"))
3025                         goto clean;
3026                 ++ddata->cur;
3027                 goto rtn;
3028
3029         case 'E':
3030                 /* unexpected end except ref-qualifiers */
3031                 if (ddata->ref_qualifier && ddata->is_functype) {
3032                         skip_ref_qualifier = true;
3033                         /* Pop the delimiter. */
3034                         cpp_demangle_pop_str(ddata);
3035                         goto rtn;
3036                 }
3037                 goto clean;
3038
3039         case 'f':
3040                 /* float */
3041                 if (!DEM_PUSH_STR(ddata, "float"))
3042                         goto clean;
3043                 ++ddata->cur;
3044                 goto rtn;
3045
3046         case 'F':
3047                 /* function */
3048                 if (!cpp_demangle_read_function(ddata, &extern_c, &v))
3049                         goto clean;
3050                 is_builtin = 0;
3051                 goto rtn;
3052
3053         case 'g':
3054                 /* __float128 */
3055                 if (!DEM_PUSH_STR(ddata, "__float128"))
3056                         goto clean;
3057                 ++ddata->cur;
3058                 goto rtn;
3059
3060         case 'G':
3061                 /* imaginary */
3062                 if (!vector_type_qualifier_push(&v, TYPE_IMG))
3063                         goto clean;
3064                 ++ddata->cur;
3065                 if (td)
3066                         td->firstp = false;
3067                 goto again;
3068
3069         case 'h':
3070                 /* unsigned char */
3071                 if (!DEM_PUSH_STR(ddata, "unsigned char"))
3072                         goto clean;
3073                 ++ddata->cur;
3074                 goto rtn;
3075
3076         case 'i':
3077                 /* int */
3078                 if (!DEM_PUSH_STR(ddata, "int"))
3079                         goto clean;
3080                 ++ddata->cur;
3081                 goto rtn;
3082
3083         case 'I':
3084                 /* template args. */
3085                 /* handles <substitute><template-args> */
3086                 p_idx = output->size;
3087                 if (!cpp_demangle_read_tmpl_args(ddata))
3088                         goto clean;
3089                 if ((subst_str = vector_str_substr(output, p_idx,
3090                     output->size - 1, &subst_str_len)) == NULL)
3091                         goto clean;
3092                 if (!vector_str_init(&sv)) {
3093                         free(subst_str);
3094                         goto clean;
3095                 }
3096                 if (!vector_str_push(&sv, subst_str, subst_str_len)) {
3097                         free(subst_str);
3098                         vector_str_dest(&sv);
3099                         goto clean;
3100                 }
3101                 free(subst_str);
3102                 if (!cpp_demangle_push_subst_v(ddata, &sv)) {
3103                         vector_str_dest(&sv);
3104                         goto clean;
3105                 }
3106                 vector_str_dest(&sv);
3107                 goto rtn;
3108
3109         case 'j':
3110                 /* unsigned int */
3111                 if (!DEM_PUSH_STR(ddata, "unsigned int"))
3112                         goto clean;
3113                 ++ddata->cur;
3114                 goto rtn;
3115
3116         case 'K':
3117                 /* const */
3118                 if (!vector_type_qualifier_push(&v, TYPE_CST))
3119                         goto clean;
3120                 ++ddata->cur;
3121                 if (td)
3122                         td->firstp = false;
3123                 goto again;
3124
3125         case 'l':
3126                 /* long */
3127                 if (!DEM_PUSH_STR(ddata, "long"))
3128                         goto clean;
3129                 ++ddata->cur;
3130                 goto rtn;
3131
3132         case 'm':
3133                 /* unsigned long */
3134                 if (!DEM_PUSH_STR(ddata, "unsigned long"))
3135                         goto clean;
3136
3137                 ++ddata->cur;
3138
3139                 goto rtn;
3140         case 'M':
3141                 /* pointer to member */
3142                 if (!cpp_demangle_read_pointer_to_member(ddata, &v))
3143                         goto clean;
3144                 is_builtin = 0;
3145                 goto rtn;
3146
3147         case 'n':
3148                 /* __int128 */
3149                 if (!DEM_PUSH_STR(ddata, "__int128"))
3150                         goto clean;
3151                 ++ddata->cur;
3152                 goto rtn;
3153
3154         case 'o':
3155                 /* unsigned __int128 */
3156                 if (!DEM_PUSH_STR(ddata, "unsigned __int128"))
3157                         goto clean;
3158                 ++ddata->cur;
3159                 goto rtn;
3160
3161         case 'O':
3162                 /* rvalue reference */
3163                 if (ddata->ref_qualifier)
3164                         goto clean;
3165                 if (!vector_type_qualifier_push(&v, TYPE_RREF))
3166                         goto clean;
3167                 ddata->ref_qualifier = true;
3168                 ddata->ref_qualifier_type = TYPE_RREF;
3169                 ++ddata->cur;
3170                 if (td)
3171                         td->firstp = false;
3172                 goto again;
3173
3174         case 'P':
3175                 /* pointer */
3176                 if (!vector_type_qualifier_push(&v, TYPE_PTR))
3177                         goto clean;
3178                 ++ddata->cur;
3179                 if (td)
3180                         td->firstp = false;
3181                 goto again;
3182
3183         case 'r':
3184                 /* restrict */
3185                 if (!vector_type_qualifier_push(&v, TYPE_RST))
3186                         goto clean;
3187                 ++ddata->cur;
3188                 if (td)
3189                         td->firstp = false;
3190                 goto again;
3191
3192         case 'R':
3193                 /* reference */
3194                 if (ddata->ref_qualifier)
3195                         goto clean;
3196                 if (!vector_type_qualifier_push(&v, TYPE_REF))
3197                         goto clean;
3198                 ddata->ref_qualifier = true;
3199                 ddata->ref_qualifier_type = TYPE_REF;
3200                 ++ddata->cur;
3201                 if (td)
3202                         td->firstp = false;
3203                 goto again;
3204
3205         case 's':
3206                 /* short, local string */
3207                 if (!DEM_PUSH_STR(ddata, "short"))
3208                         goto clean;
3209                 ++ddata->cur;
3210                 goto rtn;
3211
3212         case 'S':
3213                 /* substitution */
3214                 if (!cpp_demangle_read_subst(ddata))
3215                         goto clean;
3216                 is_builtin = 0;
3217                 goto rtn;
3218
3219         case 't':
3220                 /* unsigned short */
3221                 if (!DEM_PUSH_STR(ddata, "unsigned short"))
3222                         goto clean;
3223                 ++ddata->cur;
3224                 goto rtn;
3225
3226         case 'T':
3227                 /* template parameter */
3228                 if (!cpp_demangle_read_tmpl_param(ddata))
3229                         goto clean;
3230                 is_builtin = 0;
3231                 goto rtn;
3232
3233         case 'u':
3234                 /* vendor extended builtin */
3235                 ++ddata->cur;
3236                 if (!cpp_demangle_read_sname(ddata))
3237                         goto clean;
3238                 is_builtin = 0;
3239                 goto rtn;
3240
3241         case 'U':
3242                 /* vendor extended type qualifier */
3243                 ++ddata->cur;
3244                 if (!cpp_demangle_read_number(ddata, &len))
3245                         goto clean;
3246                 if (len <= 0)
3247                         goto clean;
3248                 if (!vector_str_push(&v.ext_name, ddata->cur, len))
3249                         goto clean;
3250                 ddata->cur += len;
3251                 if (!vector_type_qualifier_push(&v, TYPE_EXT))
3252                         goto clean;
3253                 if (td)
3254                         td->firstp = false;
3255                 goto again;
3256
3257         case 'v':
3258                 /* void */
3259                 omit_void = false;
3260                 if (td && td->firstp) {
3261                         /*
3262                          * peek into next bytes and see if we should omit
3263                          * the "void".
3264                          */
3265                         omit_void = true;
3266                         for (p = ddata->cur + 1; *p != '\0'; p++) {
3267                                 if (*p == 'E')
3268                                         break;
3269                                 if (*p != 'R' && *p != 'O') {
3270                                         omit_void = false;
3271                                         break;
3272                                 }
3273                         }
3274                 }
3275                 if (!omit_void && !DEM_PUSH_STR(ddata, "void"))
3276                         goto clean;
3277                 ++ddata->cur;
3278                 goto rtn;
3279
3280         case 'V':
3281                 /* volatile */
3282                 if (!vector_type_qualifier_push(&v, TYPE_VAT))
3283                         goto clean;
3284                 ++ddata->cur;
3285                 if (td)
3286                         td->firstp = false;
3287                 goto again;
3288
3289         case 'w':
3290                 /* wchar_t */
3291                 if (!DEM_PUSH_STR(ddata, "wchar_t"))
3292                         goto clean;
3293                 ++ddata->cur;
3294                 goto rtn;
3295
3296         case 'x':
3297                 /* long long */
3298                 if (!DEM_PUSH_STR(ddata, "long long"))
3299                         goto clean;
3300                 ++ddata->cur;
3301                 goto rtn;
3302
3303         case 'y':
3304                 /* unsigned long long */
3305                 if (!DEM_PUSH_STR(ddata, "unsigned long long"))
3306                         goto clean;
3307                 ++ddata->cur;
3308                 goto rtn;
3309
3310         case 'z':
3311                 /* ellipsis */
3312                 if (!DEM_PUSH_STR(ddata, "..."))
3313                         goto clean;
3314                 ++ddata->cur;
3315                 goto rtn;
3316         }
3317
3318         if (!cpp_demangle_read_name(ddata))
3319                 goto clean;
3320
3321         is_builtin = 0;
3322 rtn:
3323
3324         type_str = vector_str_substr(output, p_idx, output->size - 1,
3325             &type_str_len);
3326
3327         if (is_builtin == 0) {
3328                 if (!vector_str_find(&ddata->subst, type_str, type_str_len) &&
3329                     !vector_str_push(&ddata->subst, type_str, type_str_len))
3330                         goto clean;
3331         }
3332
3333         if (!skip_ref_qualifier &&
3334             !cpp_demangle_push_type_qualifier(ddata, &v, type_str))
3335                 goto clean;
3336
3337         if (td)
3338                 td->firstp = false;
3339
3340         free(type_str);
3341         free(exp_str);
3342         free(num_str);
3343         vector_type_qualifier_dest(&v);
3344
3345         return (1);
3346 clean:
3347         free(type_str);
3348         free(exp_str);
3349         free(num_str);
3350         vector_type_qualifier_dest(&v);
3351
3352         return (0);
3353 }
3354
3355 static int
3356 cpp_demangle_read_type_flat(struct cpp_demangle_data *ddata, char **str)
3357 {
3358         struct vector_str *output;
3359         size_t i, p_idx, idx, type_len;
3360         char *type;
3361
3362         output = ddata->cur_output;
3363
3364         p_idx = output->size;
3365
3366         if (!cpp_demangle_read_type(ddata, NULL))
3367                 return (0);
3368
3369         if ((type = vector_str_substr(output, p_idx, output->size - 1,
3370             &type_len)) == NULL)
3371                 return (0);
3372
3373         idx = output->size;
3374         for (i = p_idx; i < idx; ++i) {
3375                 if (!vector_str_pop(output)) {
3376                         free(type);
3377                         return (0);
3378                 }
3379         }
3380
3381         *str = type;
3382
3383         return (1);
3384 }
3385
3386 /*
3387  * read unqualified-name, unqualified name are operator-name, ctor-dtor-name,
3388  * source-name
3389  */
3390 static int
3391 cpp_demangle_read_uqname(struct cpp_demangle_data *ddata)
3392 {
3393         size_t len;
3394
3395         if (ddata == NULL || *ddata->cur == '\0')
3396                 return (0);
3397
3398         /* operator name */
3399         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
3400         case SIMPLE_HASH('a', 'a'):
3401                 /* operator && */
3402                 if (!DEM_PUSH_STR(ddata, "operator&&"))
3403                         return (0);
3404                 ddata->cur += 2;
3405                 return (1);
3406
3407         case SIMPLE_HASH('a', 'd'):
3408                 /* operator & (unary) */
3409                 if (!DEM_PUSH_STR(ddata, "operator&"))
3410                         return (0);
3411                 ddata->cur += 2;
3412                 return (1);
3413
3414         case SIMPLE_HASH('a', 'n'):
3415                 /* operator & */
3416                 if (!DEM_PUSH_STR(ddata, "operator&"))
3417                         return (0);
3418                 ddata->cur += 2;
3419                 return (1);
3420
3421         case SIMPLE_HASH('a', 'N'):
3422                 /* operator &= */
3423                 if (!DEM_PUSH_STR(ddata, "operator&="))
3424                         return (0);
3425                 ddata->cur += 2;
3426                 return (1);
3427
3428         case SIMPLE_HASH('a', 'S'):
3429                 /* operator = */
3430                 if (!DEM_PUSH_STR(ddata, "operator="))
3431                         return (0);
3432                 ddata->cur += 2;
3433                 return (1);
3434
3435         case SIMPLE_HASH('c', 'l'):
3436                 /* operator () */
3437                 if (!DEM_PUSH_STR(ddata, "operator()"))
3438                         return (0);
3439                 ddata->cur += 2;
3440                 return (1);
3441
3442         case SIMPLE_HASH('c', 'm'):
3443                 /* operator , */
3444                 if (!DEM_PUSH_STR(ddata, "operator,"))
3445                         return (0);
3446                 ddata->cur += 2;
3447                 return (1);
3448
3449         case SIMPLE_HASH('c', 'o'):
3450                 /* operator ~ */
3451                 if (!DEM_PUSH_STR(ddata, "operator~"))
3452                         return (0);
3453                 ddata->cur += 2;
3454                 return (1);
3455
3456         case SIMPLE_HASH('c', 'v'):
3457                 /* operator (cast) */
3458                 if (!DEM_PUSH_STR(ddata, "operator(cast)"))
3459                         return (0);
3460                 ddata->cur += 2;
3461                 return (cpp_demangle_read_type(ddata, NULL));
3462
3463         case SIMPLE_HASH('d', 'a'):
3464                 /* operator delete [] */
3465                 if (!DEM_PUSH_STR(ddata, "operator delete []"))
3466                         return (0);
3467                 ddata->cur += 2;
3468                 return (1);
3469
3470         case SIMPLE_HASH('d', 'e'):
3471                 /* operator * (unary) */
3472                 if (!DEM_PUSH_STR(ddata, "operator*"))
3473                         return (0);
3474                 ddata->cur += 2;
3475                 return (1);
3476
3477         case SIMPLE_HASH('d', 'l'):
3478                 /* operator delete */
3479                 if (!DEM_PUSH_STR(ddata, "operator delete"))
3480                         return (0);
3481                 ddata->cur += 2;
3482                 return (1);
3483
3484         case SIMPLE_HASH('d', 'v'):
3485                 /* operator / */
3486                 if (!DEM_PUSH_STR(ddata, "operator/"))
3487                         return (0);
3488                 ddata->cur += 2;
3489                 return (1);
3490
3491         case SIMPLE_HASH('d', 'V'):
3492                 /* operator /= */
3493                 if (!DEM_PUSH_STR(ddata, "operator/="))
3494                         return (0);
3495                 ddata->cur += 2;
3496                 return (1);
3497
3498         case SIMPLE_HASH('e', 'o'):
3499                 /* operator ^ */
3500                 if (!DEM_PUSH_STR(ddata, "operator^"))
3501                         return (0);
3502                 ddata->cur += 2;
3503                 return (1);
3504
3505         case SIMPLE_HASH('e', 'O'):
3506                 /* operator ^= */
3507                 if (!DEM_PUSH_STR(ddata, "operator^="))
3508                         return (0);
3509                 ddata->cur += 2;
3510                 return (1);
3511
3512         case SIMPLE_HASH('e', 'q'):
3513                 /* operator == */
3514                 if (!DEM_PUSH_STR(ddata, "operator=="))
3515                         return (0);
3516                 ddata->cur += 2;
3517                 return (1);
3518
3519         case SIMPLE_HASH('g', 'e'):
3520                 /* operator >= */
3521                 if (!DEM_PUSH_STR(ddata, "operator>="))
3522                         return (0);
3523                 ddata->cur += 2;
3524                 return (1);
3525
3526         case SIMPLE_HASH('g', 't'):
3527                 /* operator > */
3528                 if (!DEM_PUSH_STR(ddata, "operator>"))
3529                         return (0);
3530                 ddata->cur += 2;
3531                 return (1);
3532
3533         case SIMPLE_HASH('i', 'x'):
3534                 /* operator [] */
3535                 if (!DEM_PUSH_STR(ddata, "operator[]"))
3536                         return (0);
3537                 ddata->cur += 2;
3538                 return (1);
3539
3540         case SIMPLE_HASH('l', 'e'):
3541                 /* operator <= */
3542                 if (!DEM_PUSH_STR(ddata, "operator<="))
3543                         return (0);
3544                 ddata->cur += 2;
3545                 return (1);
3546
3547         case SIMPLE_HASH('l', 's'):
3548                 /* operator << */
3549                 if (!DEM_PUSH_STR(ddata, "operator<<"))
3550                         return (0);
3551                 ddata->cur += 2;
3552                 return (1);
3553
3554         case SIMPLE_HASH('l', 'S'):
3555                 /* operator <<= */
3556                 if (!DEM_PUSH_STR(ddata, "operator<<="))
3557                         return (0);
3558                 ddata->cur += 2;
3559                 return (1);
3560
3561         case SIMPLE_HASH('l', 't'):
3562                 /* operator < */
3563                 if (!DEM_PUSH_STR(ddata, "operator<"))
3564                         return (0);
3565                 ddata->cur += 2;
3566                 return (1);
3567
3568         case SIMPLE_HASH('m', 'i'):
3569                 /* operator - */
3570                 if (!DEM_PUSH_STR(ddata, "operator-"))
3571                         return (0);
3572                 ddata->cur += 2;
3573                 return (1);
3574
3575         case SIMPLE_HASH('m', 'I'):
3576                 /* operator -= */
3577                 if (!DEM_PUSH_STR(ddata, "operator-="))
3578                         return (0);
3579                 ddata->cur += 2;
3580                 return (1);
3581
3582         case SIMPLE_HASH('m', 'l'):
3583                 /* operator * */
3584                 if (!DEM_PUSH_STR(ddata, "operator*"))
3585                         return (0);
3586                 ddata->cur += 2;
3587                 return (1);
3588
3589         case SIMPLE_HASH('m', 'L'):
3590                 /* operator *= */
3591                 if (!DEM_PUSH_STR(ddata, "operator*="))
3592                         return (0);
3593                 ddata->cur += 2;
3594                 return (1);
3595
3596         case SIMPLE_HASH('m', 'm'):
3597                 /* operator -- */
3598                 if (!DEM_PUSH_STR(ddata, "operator--"))
3599                         return (0);
3600                 ddata->cur += 2;
3601                 return (1);
3602
3603         case SIMPLE_HASH('n', 'a'):
3604                 /* operator new[] */
3605                 if (!DEM_PUSH_STR(ddata, "operator new []"))
3606                         return (0);
3607                 ddata->cur += 2;
3608                 return (1);
3609
3610         case SIMPLE_HASH('n', 'e'):
3611                 /* operator != */
3612                 if (!DEM_PUSH_STR(ddata, "operator!="))
3613                         return (0);
3614                 ddata->cur += 2;
3615                 return (1);
3616
3617         case SIMPLE_HASH('n', 'g'):
3618                 /* operator - (unary) */
3619                 if (!DEM_PUSH_STR(ddata, "operator-"))
3620                         return (0);
3621                 ddata->cur += 2;
3622                 return (1);
3623
3624         case SIMPLE_HASH('n', 't'):
3625                 /* operator ! */
3626                 if (!DEM_PUSH_STR(ddata, "operator!"))
3627                         return (0);
3628                 ddata->cur += 2;
3629                 return (1);
3630
3631         case SIMPLE_HASH('n', 'w'):
3632                 /* operator new */
3633                 if (!DEM_PUSH_STR(ddata, "operator new"))
3634                         return (0);
3635                 ddata->cur += 2;
3636                 return (1);
3637
3638         case SIMPLE_HASH('o', 'o'):
3639                 /* operator || */
3640                 if (!DEM_PUSH_STR(ddata, "operator||"))
3641                         return (0);
3642                 ddata->cur += 2;
3643                 return (1);
3644
3645         case SIMPLE_HASH('o', 'r'):
3646                 /* operator | */
3647                 if (!DEM_PUSH_STR(ddata, "operator|"))
3648                         return (0);
3649                 ddata->cur += 2;
3650                 return (1);
3651
3652         case SIMPLE_HASH('o', 'R'):
3653                 /* operator |= */
3654                 if (!DEM_PUSH_STR(ddata, "operator|="))
3655                         return (0);
3656                 ddata->cur += 2;
3657                 return (1);
3658
3659         case SIMPLE_HASH('p', 'l'):
3660                 /* operator + */
3661                 if (!DEM_PUSH_STR(ddata, "operator+"))
3662                         return (0);
3663                 ddata->cur += 2;
3664                 return (1);
3665
3666         case SIMPLE_HASH('p', 'L'):
3667                 /* operator += */
3668                 if (!DEM_PUSH_STR(ddata, "operator+="))
3669                         return (0);
3670                 ddata->cur += 2;
3671                 return (1);
3672
3673         case SIMPLE_HASH('p', 'm'):
3674                 /* operator ->* */
3675                 if (!DEM_PUSH_STR(ddata, "operator->*"))
3676                         return (0);
3677                 ddata->cur += 2;
3678                 return (1);
3679
3680         case SIMPLE_HASH('p', 'p'):
3681                 /* operator ++ */
3682                 if (!DEM_PUSH_STR(ddata, "operator++"))
3683                         return (0);
3684                 ddata->cur += 2;
3685                 return (1);
3686
3687         case SIMPLE_HASH('p', 's'):
3688                 /* operator + (unary) */
3689                 if (!DEM_PUSH_STR(ddata, "operator+"))
3690                         return (0);
3691                 ddata->cur += 2;
3692                 return (1);
3693
3694         case SIMPLE_HASH('p', 't'):
3695                 /* operator -> */
3696                 if (!DEM_PUSH_STR(ddata, "operator->"))
3697                         return (0);
3698                 ddata->cur += 2;
3699                 return (1);
3700
3701         case SIMPLE_HASH('q', 'u'):
3702                 /* operator ? */
3703                 if (!DEM_PUSH_STR(ddata, "operator?"))
3704                         return (0);
3705                 ddata->cur += 2;
3706                 return (1);
3707
3708         case SIMPLE_HASH('r', 'm'):
3709                 /* operator % */
3710                 if (!DEM_PUSH_STR(ddata, "operator%"))
3711                         return (0);
3712                 ddata->cur += 2;
3713                 return (1);
3714
3715         case SIMPLE_HASH('r', 'M'):
3716                 /* operator %= */
3717                 if (!DEM_PUSH_STR(ddata, "operator%="))
3718                         return (0);
3719                 ddata->cur += 2;
3720                 return (1);
3721
3722         case SIMPLE_HASH('r', 's'):
3723                 /* operator >> */
3724                 if (!DEM_PUSH_STR(ddata, "operator>>"))
3725                         return (0);
3726                 ddata->cur += 2;
3727                 return (1);
3728
3729         case SIMPLE_HASH('r', 'S'):
3730                 /* operator >>= */
3731                 if (!DEM_PUSH_STR(ddata, "operator>>="))
3732                         return (0);
3733                 ddata->cur += 2;
3734                 return (1);
3735
3736         case SIMPLE_HASH('r', 'z'):
3737                 /* operator sizeof */
3738                 if (!DEM_PUSH_STR(ddata, "operator sizeof "))
3739                         return (0);
3740                 ddata->cur += 2;
3741                 return (1);
3742
3743         case SIMPLE_HASH('s', 'r'):
3744                 /* scope resolution operator */
3745                 if (!DEM_PUSH_STR(ddata, "scope resolution operator "))
3746                         return (0);
3747                 ddata->cur += 2;
3748                 return (1);
3749
3750         case SIMPLE_HASH('s', 'v'):
3751                 /* operator sizeof */
3752                 if (!DEM_PUSH_STR(ddata, "operator sizeof "))
3753                         return (0);
3754                 ddata->cur += 2;
3755                 return (1);
3756         }
3757
3758         /* vendor extened operator */
3759         if (*ddata->cur == 'v' && ELFTC_ISDIGIT(*(ddata->cur + 1))) {
3760                 if (!DEM_PUSH_STR(ddata, "vendor extened operator "))
3761                         return (0);
3762                 if (!cpp_demangle_push_str(ddata, ddata->cur + 1, 1))
3763                         return (0);
3764                 ddata->cur += 2;
3765                 return (cpp_demangle_read_sname(ddata));
3766         }
3767
3768         /* ctor-dtor-name */
3769         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
3770         case SIMPLE_HASH('C', '1'):
3771         case SIMPLE_HASH('C', '2'):
3772         case SIMPLE_HASH('C', '3'):
3773                 if (ddata->last_sname == NULL)
3774                         return (0);
3775                 if ((len = strlen(ddata->last_sname)) == 0)
3776                         return (0);
3777                 if (!DEM_PUSH_STR(ddata, "::"))
3778                         return (0);
3779                 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
3780                         return (0);
3781                 ddata->cur +=2;
3782                 return (1);
3783
3784         case SIMPLE_HASH('D', '0'):
3785         case SIMPLE_HASH('D', '1'):
3786         case SIMPLE_HASH('D', '2'):
3787                 if (ddata->last_sname == NULL)
3788                         return (0);
3789                 if ((len = strlen(ddata->last_sname)) == 0)
3790                         return (0);
3791                 if (!DEM_PUSH_STR(ddata, "::~"))
3792                         return (0);
3793                 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
3794                         return (0);
3795                 ddata->cur +=2;
3796                 return (1);
3797         }
3798
3799         /* source name */
3800         if (ELFTC_ISDIGIT(*ddata->cur) != 0)
3801                 return (cpp_demangle_read_sname(ddata));
3802
3803         /* local source name */
3804         if (*ddata->cur == 'L')
3805                 return (cpp_demangle_local_source_name(ddata));
3806
3807         return (1);
3808 }
3809
3810 /*
3811  * Read local source name.
3812  *
3813  * References:
3814  *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31775
3815  *   http://gcc.gnu.org/viewcvs?view=rev&revision=124467
3816  */
3817 static int
3818 cpp_demangle_local_source_name(struct cpp_demangle_data *ddata)
3819 {
3820         /* L */
3821         if (ddata == NULL || *ddata->cur != 'L')
3822                 return (0);
3823         ++ddata->cur;
3824
3825         /* source name */
3826         if (!cpp_demangle_read_sname(ddata))
3827                 return (0);
3828
3829         /* discriminator */
3830         if (*ddata->cur == '_') {
3831                 ++ddata->cur;
3832                 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
3833                         ++ddata->cur;
3834         }
3835
3836         return (1);
3837 }
3838
3839 static int
3840 cpp_demangle_read_v_offset(struct cpp_demangle_data *ddata)
3841 {
3842
3843         if (ddata == NULL)
3844                 return (0);
3845
3846         if (!DEM_PUSH_STR(ddata, "offset : "))
3847                 return (0);
3848
3849         if (!cpp_demangle_read_offset_number(ddata))
3850                 return (0);
3851
3852         if (!DEM_PUSH_STR(ddata, "virtual offset : "))
3853                 return (0);
3854
3855         return (!cpp_demangle_read_offset_number(ddata));
3856 }
3857
3858 /*
3859  * Decode floating point representation to string
3860  * Return new allocated string or NULL
3861  *
3862  * Todo
3863  * Replace these functions to macro.
3864  */
3865 static char *
3866 decode_fp_to_double(const char *p, size_t len)
3867 {
3868         double f;
3869         size_t rtn_len, limit, i;
3870         int byte;
3871         char *rtn;
3872
3873         if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(double))
3874                 return (NULL);
3875
3876         memset(&f, 0, sizeof(double));
3877
3878         for (i = 0; i < len / 2; ++i) {
3879                 byte = hex_to_dec(p[len - i * 2 - 1]) +
3880                     hex_to_dec(p[len - i * 2 - 2]) * 16;
3881
3882                 if (byte < 0 || byte > 255)
3883                         return (NULL);
3884
3885 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3886                 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3887 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3888                 ((unsigned char *)&f)[sizeof(double) - i - 1] =
3889                     (unsigned char)(byte);
3890 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3891         }
3892
3893         rtn_len = 64;
3894         limit = 0;
3895 again:
3896         if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3897                 return (NULL);
3898
3899         if (snprintf(rtn, rtn_len, "%fld", f) >= (int)rtn_len) {
3900                 free(rtn);
3901                 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3902                         return (NULL);
3903                 rtn_len *= BUFFER_GROWFACTOR;
3904                 goto again;
3905         }
3906
3907         return rtn;
3908 }
3909
3910 static char *
3911 decode_fp_to_float(const char *p, size_t len)
3912 {
3913         size_t i, rtn_len, limit;
3914         float f;
3915         int byte;
3916         char *rtn;
3917
3918         if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(float))
3919                 return (NULL);
3920
3921         memset(&f, 0, sizeof(float));
3922
3923         for (i = 0; i < len / 2; ++i) {
3924                 byte = hex_to_dec(p[len - i * 2 - 1]) +
3925                     hex_to_dec(p[len - i * 2 - 2]) * 16;
3926                 if (byte < 0 || byte > 255)
3927                         return (NULL);
3928 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3929                 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3930 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3931                 ((unsigned char *)&f)[sizeof(float) - i - 1] =
3932                     (unsigned char)(byte);
3933 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3934         }
3935
3936         rtn_len = 64;
3937         limit = 0;
3938 again:
3939         if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3940                 return (NULL);
3941
3942         if (snprintf(rtn, rtn_len, "%ff", f) >= (int)rtn_len) {
3943                 free(rtn);
3944                 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3945                         return (NULL);
3946                 rtn_len *= BUFFER_GROWFACTOR;
3947                 goto again;
3948         }
3949
3950         return rtn;
3951 }
3952
3953 static char *
3954 decode_fp_to_float128(const char *p, size_t len)
3955 {
3956         long double f;
3957         size_t rtn_len, limit, i;
3958         int byte;
3959         unsigned char buf[FLOAT_QUADRUPLE_BYTES];
3960         char *rtn;
3961
3962         switch(sizeof(long double)) {
3963         case FLOAT_QUADRUPLE_BYTES:
3964                 return (decode_fp_to_long_double(p, len));
3965         case FLOAT_EXTENED_BYTES:
3966                 if (p == NULL || len == 0 || len % 2 != 0 ||
3967                     len / 2 > FLOAT_QUADRUPLE_BYTES)
3968                         return (NULL);
3969
3970                 memset(buf, 0, FLOAT_QUADRUPLE_BYTES);
3971
3972                 for (i = 0; i < len / 2; ++i) {
3973                         byte = hex_to_dec(p[len - i * 2 - 1]) +
3974                             hex_to_dec(p[len - i * 2 - 2]) * 16;
3975                         if (byte < 0 || byte > 255)
3976                                 return (NULL);
3977 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3978                         buf[i] = (unsigned char)(byte);
3979 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3980                         buf[FLOAT_QUADRUPLE_BYTES - i -1] =
3981                             (unsigned char)(byte);
3982 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3983                 }
3984                 memset(&f, 0, FLOAT_EXTENED_BYTES);
3985
3986 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3987                 memcpy(&f, buf, FLOAT_EXTENED_BYTES);
3988 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3989                 memcpy(&f, buf + 6, FLOAT_EXTENED_BYTES);
3990 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3991
3992                 rtn_len = 256;
3993                 limit = 0;
3994 again:
3995                 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3996                         return (NULL);
3997
3998                 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3999                         free(rtn);
4000                         if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
4001                                 return (NULL);
4002                         rtn_len *= BUFFER_GROWFACTOR;
4003                         goto again;
4004                 }
4005
4006                 return (rtn);
4007         default:
4008                 return (NULL);
4009         }
4010 }
4011
4012 static char *
4013 decode_fp_to_float80(const char *p, size_t len)
4014 {
4015         long double f;
4016         size_t rtn_len, limit, i;
4017         int byte;
4018         unsigned char buf[FLOAT_EXTENED_BYTES];
4019         char *rtn;
4020
4021         switch(sizeof(long double)) {
4022         case FLOAT_QUADRUPLE_BYTES:
4023                 if (p == NULL || len == 0 || len % 2 != 0 ||
4024                     len / 2 > FLOAT_EXTENED_BYTES)
4025                         return (NULL);
4026
4027                 memset(buf, 0, FLOAT_EXTENED_BYTES);
4028
4029                 for (i = 0; i < len / 2; ++i) {
4030                         byte = hex_to_dec(p[len - i * 2 - 1]) +
4031                             hex_to_dec(p[len - i * 2 - 2]) * 16;
4032
4033                         if (byte < 0 || byte > 255)
4034                                 return (NULL);
4035
4036 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
4037                         buf[i] = (unsigned char)(byte);
4038 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
4039                         buf[FLOAT_EXTENED_BYTES - i -1] =
4040                             (unsigned char)(byte);
4041 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
4042                 }
4043
4044                 memset(&f, 0, FLOAT_QUADRUPLE_BYTES);
4045
4046 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
4047                 memcpy(&f, buf, FLOAT_EXTENED_BYTES);
4048 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
4049                 memcpy((unsigned char *)(&f) + 6, buf, FLOAT_EXTENED_BYTES);
4050 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
4051
4052                 rtn_len = 256;
4053                 limit = 0;
4054 again:
4055                 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
4056                         return (NULL);
4057
4058                 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
4059                         free(rtn);
4060                         if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
4061                                 return (NULL);
4062                         rtn_len *= BUFFER_GROWFACTOR;
4063                         goto again;
4064                 }
4065
4066                 return (rtn);
4067         case FLOAT_EXTENED_BYTES:
4068                 return (decode_fp_to_long_double(p, len));
4069         default:
4070                 return (NULL);
4071         }
4072 }
4073
4074 static char *
4075 decode_fp_to_long_double(const char *p, size_t len)
4076 {
4077         long double f;
4078         size_t rtn_len, limit, i;
4079         int byte;
4080         char *rtn;
4081
4082         if (p == NULL || len == 0 || len % 2 != 0 ||
4083             len / 2 > sizeof(long double))
4084                 return (NULL);
4085
4086         memset(&f, 0, sizeof(long double));
4087
4088         for (i = 0; i < len / 2; ++i) {
4089                 byte = hex_to_dec(p[len - i * 2 - 1]) +
4090                     hex_to_dec(p[len - i * 2 - 2]) * 16;
4091
4092                 if (byte < 0 || byte > 255)
4093                         return (NULL);
4094
4095 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
4096                 ((unsigned char *)&f)[i] = (unsigned char)(byte);
4097 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
4098                 ((unsigned char *)&f)[sizeof(long double) - i - 1] =
4099                     (unsigned char)(byte);
4100 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
4101         }
4102
4103         rtn_len = 256;
4104         limit = 0;
4105 again:
4106         if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
4107                 return (NULL);
4108
4109         if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
4110                 free(rtn);
4111                 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
4112                         return (NULL);
4113                 rtn_len *= BUFFER_GROWFACTOR;
4114                 goto again;
4115         }
4116
4117         return (rtn);
4118 }
4119
4120 /* Simple hex to integer function used by decode_to_* function. */
4121 static int
4122 hex_to_dec(char c)
4123 {
4124
4125         switch (c) {
4126         case '0':
4127                 return (0);
4128         case '1':
4129                 return (1);
4130         case '2':
4131                 return (2);
4132         case '3':
4133                 return (3);
4134         case '4':
4135                 return (4);
4136         case '5':
4137                 return (5);
4138         case '6':
4139                 return (6);
4140         case '7':
4141                 return (7);
4142         case '8':
4143                 return (8);
4144         case '9':
4145                 return (9);
4146         case 'a':
4147                 return (10);
4148         case 'b':
4149                 return (11);
4150         case 'c':
4151                 return (12);
4152         case 'd':
4153                 return (13);
4154         case 'e':
4155                 return (14);
4156         case 'f':
4157                 return (15);
4158         default:
4159                 return (-1);
4160         }
4161 }
4162
4163 /**
4164  * @brief Test input string is mangled by IA-64 C++ ABI style.
4165  *
4166  * Test string heads with "_Z" or "_GLOBAL__I_".
4167  * @return Return 0 at false.
4168  */
4169 bool
4170 is_cpp_mangled_gnu3(const char *org)
4171 {
4172         size_t len;
4173
4174         len = strlen(org);
4175         return ((len > 2 && *org == '_' && *(org + 1) == 'Z') ||
4176             (len > 11 && !strncmp(org, "_GLOBAL__I_", 11)));
4177 }
4178
4179 static void
4180 vector_read_cmd_dest(struct vector_read_cmd *v)
4181 {
4182
4183         if (v == NULL)
4184                 return;
4185
4186         free(v->r_container);
4187 }
4188
4189 static struct read_cmd_item *
4190 vector_read_cmd_find(struct vector_read_cmd *v, enum read_cmd dst)
4191 {
4192         int i;
4193
4194         if (v == NULL || dst == READ_FAIL)
4195                 return (NULL);
4196
4197         for (i = (int) v->size - 1; i >= 0; i--)
4198                 if (v->r_container[i].cmd == dst)
4199                         return (&v->r_container[i]);
4200
4201         return (NULL);
4202 }
4203
4204 static int
4205 vector_read_cmd_init(struct vector_read_cmd *v)
4206 {
4207
4208         if (v == NULL)
4209                 return (0);
4210
4211         v->size = 0;
4212         v->capacity = VECTOR_DEF_CAPACITY;
4213
4214         if ((v->r_container = malloc(sizeof(*v->r_container) * v->capacity))
4215             == NULL)
4216                 return (0);
4217
4218         return (1);
4219 }
4220
4221 static int
4222 vector_read_cmd_pop(struct vector_read_cmd *v)
4223 {
4224
4225         if (v == NULL || v->size == 0)
4226                 return (0);
4227
4228         --v->size;
4229         v->r_container[v->size].cmd = READ_FAIL;
4230         v->r_container[v->size].data = NULL;
4231
4232         return (1);
4233 }
4234
4235 static int
4236 vector_read_cmd_push(struct vector_read_cmd *v, enum read_cmd cmd, void *data)
4237 {
4238         struct read_cmd_item *tmp_r_ctn;
4239         size_t tmp_cap;
4240         size_t i;
4241
4242         if (v == NULL)
4243                 return (0);
4244
4245         if (v->size == v->capacity) {
4246                 tmp_cap = BUFFER_GROW(v->capacity);
4247                 if ((tmp_r_ctn = malloc(sizeof(*tmp_r_ctn) * tmp_cap)) == NULL)
4248                         return (0);
4249                 for (i = 0; i < v->size; ++i)
4250                         tmp_r_ctn[i] = v->r_container[i];
4251                 free(v->r_container);
4252                 v->r_container = tmp_r_ctn;
4253                 v->capacity = tmp_cap;
4254         }
4255
4256         v->r_container[v->size].cmd = cmd;
4257         v->r_container[v->size].data = data;
4258         ++v->size;
4259
4260         return (1);
4261 }
4262
4263 static void
4264 vector_type_qualifier_dest(struct vector_type_qualifier *v)
4265 {
4266
4267         if (v == NULL)
4268                 return;
4269
4270         free(v->q_container);
4271         vector_str_dest(&v->ext_name);
4272 }
4273
4274 /* size, capacity, ext_name */
4275 static int
4276 vector_type_qualifier_init(struct vector_type_qualifier *v)
4277 {
4278
4279         if (v == NULL)
4280                 return (0);
4281
4282         v->size = 0;
4283         v->capacity = VECTOR_DEF_CAPACITY;
4284
4285         if ((v->q_container = malloc(sizeof(enum type_qualifier) * v->capacity))
4286             == NULL)
4287                 return (0);
4288
4289         assert(v->q_container != NULL);
4290
4291         if (!vector_str_init(&v->ext_name)) {
4292                 free(v->q_container);
4293                 return (0);
4294         }
4295
4296         return (1);
4297 }
4298
4299 static int
4300 vector_type_qualifier_push(struct vector_type_qualifier *v,
4301     enum type_qualifier t)
4302 {
4303         enum type_qualifier *tmp_ctn;
4304         size_t tmp_cap;
4305         size_t i;
4306
4307         if (v == NULL)
4308                 return (0);
4309
4310         if (v->size == v->capacity) {
4311                 tmp_cap = BUFFER_GROW(v->capacity);
4312                 if ((tmp_ctn = malloc(sizeof(enum type_qualifier) * tmp_cap))
4313                     == NULL)
4314                         return (0);
4315                 for (i = 0; i < v->size; ++i)
4316                         tmp_ctn[i] = v->q_container[i];
4317                 free(v->q_container);
4318                 v->q_container = tmp_ctn;
4319                 v->capacity = tmp_cap;
4320         }
4321
4322         v->q_container[v->size] = t;
4323         ++v->size;
4324
4325         return (1);
4326 }