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