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