]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/libcxxrt/libelftc_dem_gnu3.c
MFC r368207,368607:
[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                         break;
1559                 case 't':
1560                 default:
1561                         if (!cpp_demangle_push_str(ddata,
1562                             "transaction clone for ", 22))
1563                                 return (0);
1564                         break;
1565                 }
1566                 ++ddata->cur;
1567                 return (cpp_demangle_read_encoding(ddata));
1568
1569         case SIMPLE_HASH('G', 'V'):
1570                 /* sentry object for 1 time init */
1571                 if (!cpp_demangle_push_str(ddata, "guard variable for ", 20))
1572                         return (0);
1573                 ddata->cur += 2;
1574                 break;
1575
1576         case SIMPLE_HASH('T', 'c'):
1577                 /* virtual function covariant override thunk */
1578                 if (!cpp_demangle_push_str(ddata,
1579                     "virtual function covariant override ", 36))
1580                         return (0);
1581                 ddata->cur += 2;
1582                 if (*ddata->cur == '\0')
1583                         return (0);
1584                 if (!cpp_demangle_read_offset(ddata))
1585                         return (0);
1586                 if (!cpp_demangle_read_offset(ddata))
1587                         return (0);
1588                 return (cpp_demangle_read_encoding(ddata));
1589
1590         case SIMPLE_HASH('T', 'C'):
1591                 /* construction vtable */
1592                 if (!cpp_demangle_push_str(ddata, "construction vtable for ",
1593                     24))
1594                         return (0);
1595                 ddata->cur += 2;
1596                 if (*ddata->cur == '\0')
1597                         return (0);
1598                 if (!cpp_demangle_read_type_flat(ddata, &type))
1599                         return (0);
1600                 rtn = 0;
1601                 if (!cpp_demangle_read_number(ddata, &offset))
1602                         goto clean3;
1603                 if (*ddata->cur++ != '_')
1604                         goto clean3;
1605                 if (!cpp_demangle_read_type(ddata, 0))
1606                         goto clean3;
1607                 if (!cpp_demangle_push_str(ddata, "-in-", 4))
1608                         goto clean3;
1609                 if (!cpp_demangle_push_str(ddata, type, strlen(type)))
1610                         goto clean3;
1611                 rtn = 1;
1612         clean3:
1613                 free(type);
1614                 return (rtn);
1615
1616         case SIMPLE_HASH('T', 'D'):
1617                 /* typeinfo common proxy */
1618                 break;
1619
1620         case SIMPLE_HASH('T', 'F'):
1621                 /* typeinfo fn */
1622                 if (!cpp_demangle_push_str(ddata, "typeinfo fn for ", 16))
1623                         return (0);
1624                 ddata->cur += 2;
1625                 if (*ddata->cur == '\0')
1626                         return (0);
1627                 return (cpp_demangle_read_type(ddata, 0));
1628
1629         case SIMPLE_HASH('T', 'h'):
1630                 /* virtual function non-virtual override thunk */
1631                 if (!cpp_demangle_push_str(ddata,
1632                     "virtual function non-virtual override ", 38))
1633                         return (0);
1634                 ddata->cur += 2;
1635                 if (*ddata->cur == '\0')
1636                         return (0);
1637                 if (!cpp_demangle_read_nv_offset(ddata))
1638                         return (0);
1639                 return (cpp_demangle_read_encoding(ddata));
1640
1641         case SIMPLE_HASH('T', 'H'):
1642                 /* TLS init function */
1643                 if (!cpp_demangle_push_str(ddata, "TLS init function for ",
1644                     22))
1645                         return (0);
1646                 ddata->cur += 2;
1647                 if (*ddata->cur == '\0')
1648                         return (0);
1649                 break;
1650
1651         case SIMPLE_HASH('T', 'I'):
1652                 /* typeinfo structure */
1653                 if (!cpp_demangle_push_str(ddata, "typeinfo for ", 13))
1654                         return (0);
1655                 ddata->cur += 2;
1656                 if (*ddata->cur == '\0')
1657                         return (0);
1658                 return (cpp_demangle_read_type(ddata, 0));
1659
1660         case SIMPLE_HASH('T', 'J'):
1661                 /* java class */
1662                 if (!cpp_demangle_push_str(ddata, "java Class for ", 15))
1663                         return (0);
1664                 ddata->cur += 2;
1665                 if (*ddata->cur == '\0')
1666                         return (0);
1667                 return (cpp_demangle_read_type(ddata, 0));
1668
1669         case SIMPLE_HASH('T', 'S'):
1670                 /* RTTI name (NTBS) */
1671                 if (!cpp_demangle_push_str(ddata, "typeinfo name for ", 18))
1672                         return (0);
1673                 ddata->cur += 2;
1674                 if (*ddata->cur == '\0')
1675                         return (0);
1676                 return (cpp_demangle_read_type(ddata, 0));
1677
1678         case SIMPLE_HASH('T', 'T'):
1679                 /* VTT table */
1680                 if (!cpp_demangle_push_str(ddata, "VTT for ", 8))
1681                         return (0);
1682                 ddata->cur += 2;
1683                 if (*ddata->cur == '\0')
1684                         return (0);
1685                 return (cpp_demangle_read_type(ddata, 0));
1686
1687         case SIMPLE_HASH('T', 'v'):
1688                 /* virtual function virtual override thunk */
1689                 if (!cpp_demangle_push_str(ddata,
1690                     "virtual function virtual override ", 34))
1691                         return (0);
1692                 ddata->cur += 2;
1693                 if (*ddata->cur == '\0')
1694                         return (0);
1695                 if (!cpp_demangle_read_v_offset(ddata))
1696                         return (0);
1697                 return (cpp_demangle_read_encoding(ddata));
1698
1699         case SIMPLE_HASH('T', 'V'):
1700                 /* virtual table */
1701                 if (!cpp_demangle_push_str(ddata, "vtable for ", 12))
1702                         return (0);
1703                 ddata->cur += 2;
1704                 if (*ddata->cur == '\0')
1705                         return (0);
1706                 return (cpp_demangle_read_type(ddata, 0));
1707
1708         case SIMPLE_HASH('T', 'W'):
1709                 /* TLS wrapper function */
1710                 if (!cpp_demangle_push_str(ddata, "TLS wrapper function for ",
1711                     25))
1712                         return (0);
1713                 ddata->cur += 2;
1714                 if (*ddata->cur == '\0')
1715                         return (0);
1716                 break;
1717         }
1718
1719         return (cpp_demangle_read_name(ddata));
1720 }
1721
1722 static int
1723 cpp_demangle_read_local_name(struct cpp_demangle_data *ddata)
1724 {
1725         size_t limit;
1726
1727         if (ddata == NULL)
1728                 return (0);
1729         if (*(++ddata->cur) == '\0')
1730                 return (0);
1731         if (!cpp_demangle_read_encoding(ddata))
1732                 return (0);
1733
1734         limit = 0;
1735         for (;;) {
1736                 if (!cpp_demangle_read_type(ddata, 1))
1737                         return (0);
1738                 if (*ddata->cur == 'E')
1739                         break;
1740                 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1741                         return (0);
1742         }
1743         if (*(++ddata->cur) == '\0')
1744                 return (0);
1745         if (ddata->paren == true) {
1746                 if (!cpp_demangle_push_str(ddata, ")", 1))
1747                         return (0);
1748                 ddata->paren = false;
1749         }
1750         if (*ddata->cur == 's')
1751                 ++ddata->cur;
1752         else {
1753                 if (!cpp_demangle_push_str(ddata, "::", 2))
1754                         return (0);
1755                 if (!cpp_demangle_read_name(ddata))
1756                         return (0);
1757         }
1758         if (*ddata->cur == '_') {
1759                 ++ddata->cur;
1760                 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
1761                         ++ddata->cur;
1762         }
1763
1764         return (1);
1765 }
1766
1767 static int
1768 cpp_demangle_read_name(struct cpp_demangle_data *ddata)
1769 {
1770         struct vector_str *output, v;
1771         size_t p_idx, subst_str_len;
1772         int rtn;
1773         char *subst_str;
1774
1775         if (ddata == NULL || *ddata->cur == '\0')
1776                 return (0);
1777
1778         output = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
1779
1780         subst_str = NULL;
1781
1782         switch (*ddata->cur) {
1783         case 'S':
1784                 return (cpp_demangle_read_subst(ddata));
1785         case 'N':
1786                 return (cpp_demangle_read_nested_name(ddata));
1787         case 'Z':
1788                 return (cpp_demangle_read_local_name(ddata));
1789         }
1790
1791         if (!vector_str_init(&v))
1792                 return (0);
1793
1794         p_idx = output->size;
1795         rtn = 0;
1796         if (!cpp_demangle_read_uqname(ddata))
1797                 goto clean;
1798         if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
1799             &subst_str_len)) == NULL)
1800                 goto clean;
1801         if (subst_str_len > 8 && strstr(subst_str, "operator") != NULL) {
1802                 rtn = 1;
1803                 goto clean;
1804         }
1805         if (!vector_str_push(&v, subst_str, subst_str_len))
1806                 goto clean;
1807         if (!cpp_demangle_push_subst_v(ddata, &v))
1808                 goto clean;
1809
1810         if (*ddata->cur == 'I') {
1811                 p_idx = output->size;
1812                 if (!cpp_demangle_read_tmpl_args(ddata))
1813                         goto clean;
1814                 free(subst_str);
1815                 if ((subst_str = vector_str_substr(output, p_idx,
1816                     output->size - 1, &subst_str_len)) == NULL)
1817                         goto clean;
1818                 if (!vector_str_push(&v, subst_str, subst_str_len))
1819                         goto clean;
1820                 if (!cpp_demangle_push_subst_v(ddata, &v))
1821                         goto clean;
1822         }
1823
1824         rtn = 1;
1825
1826 clean:
1827         free(subst_str);
1828         vector_str_dest(&v);
1829
1830         return (rtn);
1831 }
1832
1833 static int
1834 cpp_demangle_read_name_flat(struct cpp_demangle_data *ddata, char **str)
1835 {
1836         struct vector_str *output;
1837         size_t i, p_idx, idx, name_len;
1838         char *name;
1839
1840         output = ddata->push_head > 0 ? &ddata->output_tmp :
1841             &ddata->output;
1842
1843         p_idx = output->size;
1844
1845         if (!cpp_demangle_read_name(ddata))
1846                 return (0);
1847
1848         if ((name = vector_str_substr(output, p_idx, output->size - 1,
1849             &name_len)) == NULL)
1850                 return (0);
1851
1852         idx = output->size;
1853         for (i = p_idx; i < idx; ++i) {
1854                 if (!vector_str_pop(output)) {
1855                         free(name);
1856                         return (0);
1857                 }
1858         }
1859
1860         *str = name;
1861
1862         return (1);
1863 }
1864
1865 static int
1866 cpp_demangle_read_nested_name(struct cpp_demangle_data *ddata)
1867 {
1868         struct vector_str *output, v;
1869         size_t limit, p_idx, subst_str_len;
1870         int rtn;
1871         char *subst_str;
1872
1873         if (ddata == NULL || *ddata->cur != 'N')
1874                 return (0);
1875         if (*(++ddata->cur) == '\0')
1876                 return (0);
1877
1878         while (*ddata->cur == 'r' || *ddata->cur == 'V' ||
1879             *ddata->cur == 'K') {
1880                 switch (*ddata->cur) {
1881                 case 'r':
1882                         ddata->mem_rst = true;
1883                         break;
1884                 case 'V':
1885                         ddata->mem_vat = true;
1886                         break;
1887                 case 'K':
1888                         ddata->mem_cst = true;
1889                         break;
1890                 }
1891                 ++ddata->cur;
1892         }
1893
1894         output = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
1895         if (!vector_str_init(&v))
1896                 return (0);
1897
1898         rtn = 0;
1899         limit = 0;
1900         for (;;) {
1901                 p_idx = output->size;
1902                 switch (*ddata->cur) {
1903                 case 'I':
1904                         if (!cpp_demangle_read_tmpl_args(ddata))
1905                                 goto clean;
1906                         break;
1907                 case 'S':
1908                         if (!cpp_demangle_read_subst(ddata))
1909                                 goto clean;
1910                         break;
1911                 case 'T':
1912                         if (!cpp_demangle_read_tmpl_param(ddata))
1913                                 goto clean;
1914                         break;
1915                 default:
1916                         if (!cpp_demangle_read_uqname(ddata))
1917                                 goto clean;
1918                 }
1919
1920                 if ((subst_str = vector_str_substr(output, p_idx,
1921                     output->size - 1, &subst_str_len)) == NULL)
1922                         goto clean;
1923                 if (!vector_str_push(&v, subst_str, subst_str_len)) {
1924                         free(subst_str);
1925                         goto clean;
1926                 }
1927                 free(subst_str);
1928
1929                 if (!cpp_demangle_push_subst_v(ddata, &v))
1930                         goto clean;
1931                 if (*ddata->cur == 'E')
1932                         break;
1933                 else if (*ddata->cur != 'I' &&
1934                     *ddata->cur != 'C' && *ddata->cur != 'D') {
1935                         if (!cpp_demangle_push_str(ddata, "::", 2))
1936                                 goto clean;
1937                         if (!vector_str_push(&v, "::", 2))
1938                                 goto clean;
1939                 }
1940                 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1941                         goto clean;
1942         }
1943
1944         ++ddata->cur;
1945         rtn = 1;
1946
1947 clean:
1948         vector_str_dest(&v);
1949
1950         return (rtn);
1951 }
1952
1953 /*
1954  * read number
1955  * number ::= [n] <decimal>
1956  */
1957 static int
1958 cpp_demangle_read_number(struct cpp_demangle_data *ddata, long *rtn)
1959 {
1960         long len, negative_factor;
1961
1962         if (ddata == NULL || rtn == NULL)
1963                 return (0);
1964
1965         negative_factor = 1;
1966         if (*ddata->cur == 'n') {
1967                 negative_factor = -1;
1968
1969                 ++ddata->cur;
1970         }
1971         if (ELFTC_ISDIGIT(*ddata->cur) == 0)
1972                 return (0);
1973
1974         errno = 0;
1975         if ((len = strtol(ddata->cur, (char **) NULL, 10)) == 0 &&
1976             errno != 0)
1977                 return (0);
1978
1979         while (ELFTC_ISDIGIT(*ddata->cur) != 0)
1980                 ++ddata->cur;
1981
1982         assert(len >= 0);
1983         assert(negative_factor == 1 || negative_factor == -1);
1984
1985         *rtn = len * negative_factor;
1986
1987         return (1);
1988 }
1989
1990 static int
1991 cpp_demangle_read_number_as_string(struct cpp_demangle_data *ddata, char **str)
1992 {
1993         long n;
1994
1995         if (!cpp_demangle_read_number(ddata, &n)) {
1996                 *str = NULL;
1997                 return (0);
1998         }
1999
2000         if (asprintf(str, "%ld", n) < 0) {
2001                 *str = NULL;
2002                 return (0);
2003         }
2004
2005         return (1);
2006 }
2007
2008 static int
2009 cpp_demangle_read_nv_offset(struct cpp_demangle_data *ddata)
2010 {
2011
2012         if (ddata == NULL)
2013                 return (0);
2014
2015         if (!cpp_demangle_push_str(ddata, "offset : ", 9))
2016                 return (0);
2017
2018         return (cpp_demangle_read_offset_number(ddata));
2019 }
2020
2021 /* read offset, offset are nv-offset, v-offset */
2022 static int
2023 cpp_demangle_read_offset(struct cpp_demangle_data *ddata)
2024 {
2025
2026         if (ddata == NULL)
2027                 return (0);
2028
2029         if (*ddata->cur == 'h') {
2030                 ++ddata->cur;
2031                 return (cpp_demangle_read_nv_offset(ddata));
2032         } else if (*ddata->cur == 'v') {
2033                 ++ddata->cur;
2034                 return (cpp_demangle_read_v_offset(ddata));
2035         }
2036
2037         return (0);
2038 }
2039
2040 static int
2041 cpp_demangle_read_offset_number(struct cpp_demangle_data *ddata)
2042 {
2043         bool negative;
2044         const char *start;
2045
2046         if (ddata == NULL || *ddata->cur == '\0')
2047                 return (0);
2048
2049         /* offset could be negative */
2050         if (*ddata->cur == 'n') {
2051                 negative = true;
2052                 start = ddata->cur + 1;
2053         } else {
2054                 negative = false;
2055                 start = ddata->cur;
2056         }
2057
2058         while (*ddata->cur != '_')
2059                 ++ddata->cur;
2060
2061         if (negative && !cpp_demangle_push_str(ddata, "-", 1))
2062                 return (0);
2063
2064         assert(start != NULL);
2065
2066         if (!cpp_demangle_push_str(ddata, start, ddata->cur - start))
2067                 return (0);
2068         if (!cpp_demangle_push_str(ddata, " ", 1))
2069                 return (0);
2070
2071         ++ddata->cur;
2072
2073         return (1);
2074 }
2075
2076 static int
2077 cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *ddata)
2078 {
2079         size_t class_type_len, i, idx, p_idx;
2080         int p_func_type, rtn;
2081         char *class_type;
2082
2083         if (ddata == NULL || *ddata->cur != 'M' || *(++ddata->cur) == '\0')
2084                 return (0);
2085
2086         p_idx = ddata->output.size;
2087         if (!cpp_demangle_read_type(ddata, 0))
2088                 return (0);
2089
2090         if ((class_type = vector_str_substr(&ddata->output, p_idx,
2091             ddata->output.size - 1, &class_type_len)) == NULL)
2092                 return (0);
2093
2094         rtn = 0;
2095         idx = ddata->output.size;
2096         for (i = p_idx; i < idx; ++i)
2097                 if (!vector_str_pop(&ddata->output))
2098                         goto clean1;
2099
2100         if (!vector_read_cmd_push(&ddata->cmd, READ_PTRMEM))
2101                 goto clean1;
2102
2103         if (!vector_str_push(&ddata->class_type, class_type, class_type_len))
2104                 goto clean2;
2105
2106         p_func_type = ddata->func_type;
2107         if (!cpp_demangle_read_type(ddata, 0))
2108                 goto clean3;
2109
2110         if (p_func_type == ddata->func_type) {
2111                 if (!cpp_demangle_push_str(ddata, " ", 1))
2112                         goto clean3;
2113                 if (!cpp_demangle_push_str(ddata, class_type, class_type_len))
2114                         goto clean3;
2115                 if (!cpp_demangle_push_str(ddata, "::*", 3))
2116                         goto clean3;
2117         }
2118
2119         rtn = 1;
2120 clean3:
2121         if (!vector_str_pop(&ddata->class_type))
2122                 rtn = 0;
2123 clean2:
2124         if (!vector_read_cmd_pop(&ddata->cmd))
2125                 rtn = 0;
2126 clean1:
2127         free(class_type);
2128
2129         return (rtn);
2130 }
2131
2132 /* read source-name, source-name is <len> <ID> */
2133 static int
2134 cpp_demangle_read_sname(struct cpp_demangle_data *ddata)
2135 {
2136         long len;
2137         int err;
2138
2139         if (ddata == NULL || cpp_demangle_read_number(ddata, &len) == 0 ||
2140             len <= 0)
2141                 return (0);
2142
2143         if (len == 12 && (memcmp("_GLOBAL__N_1", ddata->cur, 12) == 0))
2144                 err = cpp_demangle_push_str(ddata, "(anonymous namespace)", 21);
2145         else
2146                 err = cpp_demangle_push_str(ddata, ddata->cur, len);
2147
2148         if (err == 0)
2149                 return (0);
2150
2151         assert(ddata->output.size > 0);
2152         if (vector_read_cmd_find(&ddata->cmd, READ_TMPL) == 0)
2153                 ddata->last_sname =
2154                     ddata->output.container[ddata->output.size - 1];
2155
2156         ddata->cur += len;
2157
2158         return (1);
2159 }
2160
2161 static int
2162 cpp_demangle_read_subst(struct cpp_demangle_data *ddata)
2163 {
2164         long nth;
2165
2166         if (ddata == NULL || *ddata->cur == '\0')
2167                 return (0);
2168
2169         /* abbreviations of the form Sx */
2170         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
2171         case SIMPLE_HASH('S', 'a'):
2172                 /* std::allocator */
2173                 if (cpp_demangle_push_str(ddata, "std::allocator", 14) == 0)
2174                         return (0);
2175                 ddata->cur += 2;
2176                 if (*ddata->cur == 'I')
2177                         return (cpp_demangle_read_subst_stdtmpl(ddata,
2178                             "std::allocator", 14));
2179                 return (1);
2180
2181         case SIMPLE_HASH('S', 'b'):
2182                 /* std::basic_string */
2183                 if (!cpp_demangle_push_str(ddata, "std::basic_string", 17))
2184                         return (0);
2185                 ddata->cur += 2;
2186                 if (*ddata->cur == 'I')
2187                         return (cpp_demangle_read_subst_stdtmpl(ddata,
2188                             "std::basic_string", 17));
2189                 return (1);
2190
2191         case SIMPLE_HASH('S', 'd'):
2192                 /* std::basic_iostream<char, std::char_traits<char> > */
2193                 if (!cpp_demangle_push_str(ddata, "std::basic_iostream", 19))
2194                         return (0);
2195                 ddata->last_sname = "basic_iostream";
2196                 ddata->cur += 2;
2197                 if (*ddata->cur == 'I')
2198                         return (cpp_demangle_read_subst_stdtmpl(ddata,
2199                             "std::basic_iostream", 19));
2200                 return (1);
2201
2202         case SIMPLE_HASH('S', 'i'):
2203                 /* std::basic_istream<char, std::char_traits<char> > */
2204                 if (!cpp_demangle_push_str(ddata, "std::basic_istream", 18))
2205                         return (0);
2206                 ddata->last_sname = "basic_istream";
2207                 ddata->cur += 2;
2208                 if (*ddata->cur == 'I')
2209                         return (cpp_demangle_read_subst_stdtmpl(ddata,
2210                             "std::basic_istream", 18));
2211                 return (1);
2212
2213         case SIMPLE_HASH('S', 'o'):
2214                 /* std::basic_ostream<char, std::char_traits<char> > */
2215                 if (!cpp_demangle_push_str(ddata, "std::basic_ostream", 18))
2216                         return (0);
2217                 ddata->last_sname = "basic_ostream";
2218                 ddata->cur += 2;
2219                 if (*ddata->cur == 'I')
2220                         return (cpp_demangle_read_subst_stdtmpl(ddata,
2221                             "std::basic_ostream", 18));
2222                 return (1);
2223
2224         case SIMPLE_HASH('S', 's'):
2225                 /*
2226                  * std::basic_string<char, std::char_traits<char>,
2227                  * std::allocator<char> >
2228                  *
2229                  * a.k.a std::string
2230                  */
2231                 if (!cpp_demangle_push_str(ddata, "std::string", 11))
2232                         return (0);
2233                 ddata->last_sname = "string";
2234                 ddata->cur += 2;
2235                 if (*ddata->cur == 'I')
2236                         return (cpp_demangle_read_subst_stdtmpl(ddata,
2237                             "std::string", 11));
2238                 return (1);
2239
2240         case SIMPLE_HASH('S', 't'):
2241                 /* std:: */
2242                 return (cpp_demangle_read_subst_std(ddata));
2243         }
2244
2245         if (*(++ddata->cur) == '\0')
2246                 return (0);
2247
2248         /* substitution */
2249         if (*ddata->cur == '_')
2250                 return (cpp_demangle_get_subst(ddata, 0));
2251         else {
2252                 errno = 0;
2253                 /* substitution number is base 36 */
2254                 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2255                     errno != 0)
2256                         return (0);
2257
2258                 /* first was '_', so increase one */
2259                 ++nth;
2260
2261                 while (*ddata->cur != '_')
2262                         ++ddata->cur;
2263
2264                 assert(nth > 0);
2265
2266                 return (cpp_demangle_get_subst(ddata, nth));
2267         }
2268
2269         /* NOTREACHED */
2270         return (0);
2271 }
2272
2273 static int
2274 cpp_demangle_read_subst_std(struct cpp_demangle_data *ddata)
2275 {
2276         struct vector_str *output, v;
2277         size_t p_idx, subst_str_len;
2278         int rtn;
2279         char *subst_str;
2280
2281         if (ddata == NULL)
2282                 return (0);
2283
2284         if (!vector_str_init(&v))
2285                 return (0);
2286
2287         subst_str = NULL;
2288         rtn = 0;
2289         if (!cpp_demangle_push_str(ddata, "std::", 5))
2290                 goto clean;
2291
2292         if (!vector_str_push(&v, "std::", 5))
2293                 goto clean;
2294
2295         ddata->cur += 2;
2296
2297         output = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
2298
2299         p_idx = output->size;
2300         if (!cpp_demangle_read_uqname(ddata))
2301                 goto clean;
2302
2303         if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
2304             &subst_str_len)) == NULL)
2305                 goto clean;
2306
2307         if (!vector_str_push(&v, subst_str, subst_str_len))
2308                 goto clean;
2309
2310         if (!cpp_demangle_push_subst_v(ddata, &v))
2311                 goto clean;
2312
2313         if (*ddata->cur == 'I') {
2314                 p_idx = output->size;
2315                 if (!cpp_demangle_read_tmpl_args(ddata))
2316                         goto clean;
2317                 free(subst_str);
2318                 if ((subst_str = vector_str_substr(output, p_idx,
2319                     output->size - 1, &subst_str_len)) == NULL)
2320                         goto clean;
2321                 if (!vector_str_push(&v, subst_str, subst_str_len))
2322                         goto clean;
2323                 if (!cpp_demangle_push_subst_v(ddata, &v))
2324                         goto clean;
2325         }
2326
2327         rtn = 1;
2328 clean:
2329         free(subst_str);
2330         vector_str_dest(&v);
2331
2332         return (rtn);
2333 }
2334
2335 static int
2336 cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *ddata,
2337     const char *str, size_t len)
2338 {
2339         struct vector_str *output;
2340         size_t p_idx, substr_len;
2341         int rtn;
2342         char *subst_str, *substr;
2343
2344         if (ddata == NULL || str == NULL || len == 0)
2345                 return (0);
2346
2347         output = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
2348
2349         p_idx = output->size;
2350         substr = NULL;
2351         subst_str = NULL;
2352
2353         if (!cpp_demangle_read_tmpl_args(ddata))
2354                 return (0);
2355         if ((substr = vector_str_substr(output, p_idx, output->size - 1,
2356             &substr_len)) == NULL)
2357                 return (0);
2358
2359         rtn = 0;
2360         if ((subst_str = malloc(sizeof(char) * (substr_len + len + 1))) ==
2361             NULL)
2362                 goto clean;
2363
2364         memcpy(subst_str, str, len);
2365         memcpy(subst_str + len, substr, substr_len);
2366         subst_str[substr_len + len] = '\0';
2367
2368         if (!cpp_demangle_push_subst(ddata, subst_str, substr_len + len))
2369                 goto clean;
2370
2371         rtn = 1;
2372 clean:
2373         free(subst_str);
2374         free(substr);
2375
2376         return (rtn);
2377 }
2378
2379 static int
2380 cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *ddata)
2381 {
2382
2383         if (ddata == NULL || *ddata->cur == '\0')
2384                 return (0);
2385
2386         switch (*ddata->cur) {
2387         case 'L':
2388                 return (cpp_demangle_read_expr_primary(ddata));
2389         case 'X':
2390                 return (cpp_demangle_read_expression(ddata));
2391         }
2392
2393         return (cpp_demangle_read_type(ddata, 0));
2394 }
2395
2396 static int
2397 cpp_demangle_read_tmpl_args(struct cpp_demangle_data *ddata)
2398 {
2399         struct vector_str *v;
2400         size_t arg_len, idx, limit, size;
2401         char *arg;
2402
2403         if (ddata == NULL || *ddata->cur == '\0')
2404                 return (0);
2405
2406         ++ddata->cur;
2407
2408         if (!vector_read_cmd_push(&ddata->cmd, READ_TMPL))
2409                 return (0);
2410
2411         if (!cpp_demangle_push_str(ddata, "<", 1))
2412                 return (0);
2413
2414         limit = 0;
2415         v = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
2416         for (;;) {
2417                 idx = v->size;
2418                 if (!cpp_demangle_read_tmpl_arg(ddata))
2419                         return (0);
2420                 if ((arg = vector_str_substr(v, idx, v->size - 1, &arg_len)) ==
2421                     NULL)
2422                         return (0);
2423                 if (!vector_str_find(&ddata->tmpl, arg, arg_len) &&
2424                     !vector_str_push(&ddata->tmpl, arg, arg_len)) {
2425                         free(arg);
2426                         return (0);
2427                 }
2428
2429                 free(arg);
2430
2431                 if (*ddata->cur == 'E') {
2432                         ++ddata->cur;
2433                         size = v->size;
2434                         assert(size > 0);
2435                         if (!strncmp(v->container[size - 1], ">", 1)) {
2436                                 if (!cpp_demangle_push_str(ddata, " >", 2))
2437                                         return (0);
2438                         } else if (!cpp_demangle_push_str(ddata, ">", 1))
2439                                 return (0);
2440                         break;
2441                 } else if (*ddata->cur != 'I' &&
2442                     !cpp_demangle_push_str(ddata, ", ", 2))
2443                         return (0);
2444
2445                 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
2446                         return (0);
2447         }
2448
2449         return (vector_read_cmd_pop(&ddata->cmd));
2450 }
2451
2452 /*
2453  * Read template parameter that forms in 'T[number]_'.
2454  * This function much like to read_subst but only for types.
2455  */
2456 static int
2457 cpp_demangle_read_tmpl_param(struct cpp_demangle_data *ddata)
2458 {
2459         long nth;
2460
2461         if (ddata == NULL || *ddata->cur != 'T')
2462                 return (0);
2463
2464         ++ddata->cur;
2465
2466         if (*ddata->cur == '_')
2467                 return (cpp_demangle_get_tmpl_param(ddata, 0));
2468         else {
2469
2470                 errno = 0;
2471                 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2472                     errno != 0)
2473                         return (0);
2474
2475                 /* T_ is first */
2476                 ++nth;
2477
2478                 while (*ddata->cur != '_')
2479                         ++ddata->cur;
2480
2481                 assert(nth > 0);
2482
2483                 return (cpp_demangle_get_tmpl_param(ddata, nth));
2484         }
2485
2486         /* NOTREACHED */
2487         return (0);
2488 }
2489
2490 static int
2491 cpp_demangle_read_type(struct cpp_demangle_data *ddata, int delimit)
2492 {
2493         struct vector_type_qualifier v;
2494         struct vector_str *output;
2495         size_t p_idx, type_str_len;
2496         int extern_c, is_builtin;
2497         long len;
2498         char *type_str, *exp_str, *num_str;
2499
2500         if (ddata == NULL)
2501                 return (0);
2502
2503         output = &ddata->output;
2504         if (ddata->output.size > 0 && !strncmp(ddata->output.container[ddata->output.size - 1], ">", 1)) {
2505                 ddata->push_head++;
2506                 output = &ddata->output_tmp;
2507         } else if (delimit == 1) {
2508                 if (ddata->paren == false) {
2509                         if (!cpp_demangle_push_str(ddata, "(", 1))
2510                                 return (0);
2511                         if (ddata->output.size < 2)
2512                                 return (0);
2513                         ddata->paren = true;
2514                         ddata->pfirst = true;
2515                         /* Need pop function name */
2516                         if (ddata->subst.size == 1 &&
2517                             !vector_str_pop(&ddata->subst))
2518                                 return (0);
2519                 }
2520
2521                 if (ddata->pfirst)
2522                         ddata->pfirst = false;
2523                 else if (*ddata->cur != 'I' &&
2524                     !cpp_demangle_push_str(ddata, ", ", 2))
2525                         return (0);
2526         }
2527
2528         assert(output != NULL);
2529         /*
2530          * [r, V, K] [P, R, C, G, U] builtin, function, class-enum, array
2531          * pointer-to-member, template-param, template-template-param, subst
2532          */
2533
2534         if (!vector_type_qualifier_init(&v))
2535                 return (0);
2536
2537         extern_c = 0;
2538         is_builtin = 1;
2539         p_idx = output->size;
2540         type_str = exp_str = num_str = NULL;
2541 again:
2542         /* builtin type */
2543         switch (*ddata->cur) {
2544         case 'a':
2545                 /* signed char */
2546                 if (!cpp_demangle_push_str(ddata, "signed char", 11))
2547                         goto clean;
2548                 ++ddata->cur;
2549                 goto rtn;
2550
2551         case 'A':
2552                 /* array type */
2553                 if (!cpp_demangle_read_array(ddata))
2554                         goto clean;
2555                 is_builtin = 0;
2556                 goto rtn;
2557
2558         case 'b':
2559                 /* bool */
2560                 if (!cpp_demangle_push_str(ddata, "bool", 4))
2561                         goto clean;
2562                 ++ddata->cur;
2563                 goto rtn;
2564
2565         case 'C':
2566                 /* complex pair */
2567                 if (!vector_type_qualifier_push(&v, TYPE_CMX))
2568                         goto clean;
2569                 ++ddata->cur;
2570                 goto again;
2571
2572         case 'c':
2573                 /* char */
2574                 if (!cpp_demangle_push_str(ddata, "char", 4))
2575                         goto clean;
2576                 ++ddata->cur;
2577                 goto rtn;
2578
2579         case 'd':
2580                 /* double */
2581                 if (!cpp_demangle_push_str(ddata, "double", 6))
2582                         goto clean;
2583                 ++ddata->cur;
2584                 goto rtn;
2585
2586         case 'D':
2587                 ++ddata->cur;
2588                 switch (*ddata->cur) {
2589                 case 'd':
2590                         /* IEEE 754r decimal floating point (64 bits) */
2591                         if (!cpp_demangle_push_str(ddata, "decimal64", 9))
2592                                 goto clean;
2593                         ++ddata->cur;
2594                         break;
2595                 case 'e':
2596                         /* IEEE 754r decimal floating point (128 bits) */
2597                         if (!cpp_demangle_push_str(ddata, "decimal128", 10))
2598                                 goto clean;
2599                         ++ddata->cur;
2600                         break;
2601                 case 'f':
2602                         /* IEEE 754r decimal floating point (32 bits) */
2603                         if (!cpp_demangle_push_str(ddata, "decimal32", 9))
2604                                 goto clean;
2605                         ++ddata->cur;
2606                         break;
2607                 case 'h':
2608                         /* IEEE 754r half-precision floating point (16 bits) */
2609                         if (!cpp_demangle_push_str(ddata, "half", 4))
2610                                 goto clean;
2611                         ++ddata->cur;
2612                         break;
2613                 case 'i':
2614                         /* char32_t */
2615                         if (!cpp_demangle_push_str(ddata, "char32_t", 8))
2616                                 goto clean;
2617                         ++ddata->cur;
2618                         break;
2619                 case 'n':
2620                         /* std::nullptr_t (i.e., decltype(nullptr)) */
2621                         if (!cpp_demangle_push_str(ddata, "decltype(nullptr)",
2622                             17))
2623                                 goto clean;
2624                         ++ddata->cur;
2625                         break;
2626                 case 's':
2627                         /* char16_t */
2628                         if (!cpp_demangle_push_str(ddata, "char16_t", 8))
2629                                 goto clean;
2630                         ++ddata->cur;
2631                         break;
2632                 case 'v':
2633                         /* gcc vector_size extension. */
2634                         ++ddata->cur;
2635                         if (*ddata->cur == '_') {
2636                                 ++ddata->cur;
2637                                 if (!cpp_demangle_read_expression_flat(ddata,
2638                                     &exp_str))
2639                                         goto clean;
2640                                 if (!vector_str_push(&v.ext_name, exp_str,
2641                                     strlen(exp_str)))
2642                                         goto clean;
2643                         } else {
2644                                 if (!cpp_demangle_read_number_as_string(ddata,
2645                                     &num_str))
2646                                         goto clean;
2647                                 if (!vector_str_push(&v.ext_name, num_str,
2648                                     strlen(num_str)))
2649                                         goto clean;
2650                         }
2651                         if (*ddata->cur != '_')
2652                                 goto clean;
2653                         ++ddata->cur;
2654                         if (!vector_type_qualifier_push(&v, TYPE_VEC))
2655                                 goto clean;
2656                         goto again;
2657                 default:
2658                         goto clean;
2659                 }
2660                 goto rtn;
2661
2662         case 'e':
2663                 /* long double */
2664                 if (!cpp_demangle_push_str(ddata, "long double", 11))
2665                         goto clean;
2666                 ++ddata->cur;
2667                 goto rtn;
2668
2669         case 'f':
2670                 /* float */
2671                 if (!cpp_demangle_push_str(ddata, "float", 5))
2672                         goto clean;
2673                 ++ddata->cur;
2674                 goto rtn;
2675
2676         case 'F':
2677                 /* function */
2678                 if (!cpp_demangle_read_function(ddata, &extern_c, &v))
2679                         goto clean;
2680                 is_builtin = 0;
2681                 goto rtn;
2682
2683         case 'g':
2684                 /* __float128 */
2685                 if (!cpp_demangle_push_str(ddata, "__float128", 10))
2686                         goto clean;
2687                 ++ddata->cur;
2688                 goto rtn;
2689
2690         case 'G':
2691                 /* imaginary */
2692                 if (!vector_type_qualifier_push(&v, TYPE_IMG))
2693                         goto clean;
2694                 ++ddata->cur;
2695                 goto again;
2696
2697         case 'h':
2698                 /* unsigned char */
2699                 if (!cpp_demangle_push_str(ddata, "unsigned char", 13))
2700                         goto clean;
2701                 ++ddata->cur;
2702                 goto rtn;
2703
2704         case 'i':
2705                 /* int */
2706                 if (!cpp_demangle_push_str(ddata, "int", 3))
2707                         goto clean;
2708                 ++ddata->cur;
2709                 goto rtn;
2710
2711         case 'j':
2712                 /* unsigned int */
2713                 if (!cpp_demangle_push_str(ddata, "unsigned int", 12))
2714                         goto clean;
2715                 ++ddata->cur;
2716                 goto rtn;
2717
2718         case 'K':
2719                 /* const */
2720                 if (!vector_type_qualifier_push(&v, TYPE_CST))
2721                         goto clean;
2722                 ++ddata->cur;
2723                 goto again;
2724
2725         case 'l':
2726                 /* long */
2727                 if (!cpp_demangle_push_str(ddata, "long", 4))
2728                         goto clean;
2729                 ++ddata->cur;
2730                 goto rtn;
2731
2732         case 'm':
2733                 /* unsigned long */
2734                 if (!cpp_demangle_push_str(ddata, "unsigned long", 13))
2735                         goto clean;
2736
2737                 ++ddata->cur;
2738
2739                 goto rtn;
2740         case 'M':
2741                 /* pointer to member */
2742                 if (!cpp_demangle_read_pointer_to_member(ddata))
2743                         goto clean;
2744                 is_builtin = 0;
2745                 goto rtn;
2746
2747         case 'n':
2748                 /* __int128 */
2749                 if (!cpp_demangle_push_str(ddata, "__int128", 8))
2750                         goto clean;
2751                 ++ddata->cur;
2752                 goto rtn;
2753
2754         case 'o':
2755                 /* unsigned __int128 */
2756                 if (!cpp_demangle_push_str(ddata, "unsigned __int128", 17))
2757                         goto clean;
2758                 ++ddata->cur;
2759                 goto rtn;
2760
2761         case 'P':
2762                 /* pointer */
2763                 if (!vector_type_qualifier_push(&v, TYPE_PTR))
2764                         goto clean;
2765                 ++ddata->cur;
2766                 goto again;
2767
2768         case 'r':
2769                 /* restrict */
2770                 if (!vector_type_qualifier_push(&v, TYPE_RST))
2771                         goto clean;
2772                 ++ddata->cur;
2773                 goto again;
2774
2775         case 'R':
2776                 /* reference */
2777                 if (!vector_type_qualifier_push(&v, TYPE_REF))
2778                         goto clean;
2779                 ++ddata->cur;
2780                 goto again;
2781
2782         case 's':
2783                 /* short, local string */
2784                 if (!cpp_demangle_push_str(ddata, "short", 5))
2785                         goto clean;
2786                 ++ddata->cur;
2787                 goto rtn;
2788
2789         case 'S':
2790                 /* substitution */
2791                 if (!cpp_demangle_read_subst(ddata))
2792                         goto clean;
2793                 is_builtin = 0;
2794                 goto rtn;
2795
2796         case 't':
2797                 /* unsigned short */
2798                 if (!cpp_demangle_push_str(ddata, "unsigned short", 14))
2799                         goto clean;
2800                 ++ddata->cur;
2801                 goto rtn;
2802
2803         case 'T':
2804                 /* template parameter */
2805                 if (!cpp_demangle_read_tmpl_param(ddata))
2806                         goto clean;
2807                 is_builtin = 0;
2808                 goto rtn;
2809
2810         case 'u':
2811                 /* vendor extended builtin */
2812                 ++ddata->cur;
2813                 if (!cpp_demangle_read_sname(ddata))
2814                         goto clean;
2815                 is_builtin = 0;
2816                 goto rtn;
2817
2818         case 'U':
2819                 /* vendor extended type qualifier */
2820                 if (!cpp_demangle_read_number(ddata, &len))
2821                         goto clean;
2822                 if (len <= 0)
2823                         goto clean;
2824                 if (!vector_str_push(&v.ext_name, ddata->cur, len))
2825                         return (0);
2826                 ddata->cur += len;
2827                 if (!vector_type_qualifier_push(&v, TYPE_EXT))
2828                         goto clean;
2829                 goto again;
2830
2831         case 'v':
2832                 /* void */
2833                 if (!cpp_demangle_push_str(ddata, "void", 4))
2834                         goto clean;
2835                 ++ddata->cur;
2836                 goto rtn;
2837
2838         case 'V':
2839                 /* volatile */
2840                 if (!vector_type_qualifier_push(&v, TYPE_VAT))
2841                         goto clean;
2842                 ++ddata->cur;
2843                 goto again;
2844
2845         case 'w':
2846                 /* wchar_t */
2847                 if (!cpp_demangle_push_str(ddata, "wchar_t", 7))
2848                         goto clean;
2849                 ++ddata->cur;
2850                 goto rtn;
2851
2852         case 'x':
2853                 /* long long */
2854                 if (!cpp_demangle_push_str(ddata, "long long", 9))
2855                         goto clean;
2856                 ++ddata->cur;
2857                 goto rtn;
2858
2859         case 'y':
2860                 /* unsigned long long */
2861                 if (!cpp_demangle_push_str(ddata, "unsigned long long", 18))
2862                         goto clean;
2863                 ++ddata->cur;
2864                 goto rtn;
2865
2866         case 'z':
2867                 /* ellipsis */
2868                 if (!cpp_demangle_push_str(ddata, "...", 3))
2869                         goto clean;
2870                 ++ddata->cur;
2871                 goto rtn;
2872         }
2873
2874         if (!cpp_demangle_read_name(ddata))
2875                 goto clean;
2876
2877         is_builtin = 0;
2878 rtn:
2879         if ((type_str = vector_str_substr(output, p_idx, output->size - 1,
2880             &type_str_len)) == NULL)
2881                 goto clean;
2882
2883         if (is_builtin == 0) {
2884                 if (!vector_str_find(&ddata->subst, type_str, type_str_len) &&
2885                     !vector_str_push(&ddata->subst, type_str, type_str_len))
2886                         goto clean;
2887         }
2888
2889         if (!cpp_demangle_push_type_qualifier(ddata, &v, type_str))
2890                 goto clean;
2891
2892         free(type_str);
2893         free(exp_str);
2894         free(num_str);
2895         vector_type_qualifier_dest(&v);
2896
2897         if (ddata->push_head > 0) {
2898                 if (*ddata->cur == 'I' && cpp_demangle_read_tmpl_args(ddata)
2899                     == 0)
2900                         return (0);
2901
2902                 if (--ddata->push_head > 0)
2903                         return (1);
2904
2905                 if (!vector_str_push(&ddata->output_tmp, " ", 1))
2906                         return (0);
2907
2908                 if (!vector_str_push_vector_head(&ddata->output,
2909                     &ddata->output_tmp))
2910                         return (0);
2911
2912                 vector_str_dest(&ddata->output_tmp);
2913                 if (!vector_str_init(&ddata->output_tmp))
2914                         return (0);
2915
2916                 if (!cpp_demangle_push_str(ddata, "(", 1))
2917                         return (0);
2918
2919                 ddata->paren = true;
2920                 ddata->pfirst = true;
2921         }
2922
2923         return (1);
2924 clean:
2925         free(type_str);
2926         free(exp_str);
2927         free(num_str);
2928         vector_type_qualifier_dest(&v);
2929
2930         return (0);
2931 }
2932
2933 static int
2934 cpp_demangle_read_type_flat(struct cpp_demangle_data *ddata, char **str)
2935 {
2936         struct vector_str *output;
2937         size_t i, p_idx, idx, type_len;
2938         char *type;
2939
2940         output = ddata->push_head > 0 ? &ddata->output_tmp :
2941             &ddata->output;
2942
2943         p_idx = output->size;
2944
2945         if (!cpp_demangle_read_type(ddata, 0))
2946                 return (0);
2947
2948         if ((type = vector_str_substr(output, p_idx, output->size - 1,
2949             &type_len)) == NULL)
2950                 return (0);
2951
2952         idx = output->size;
2953         for (i = p_idx; i < idx; ++i) {
2954                 if (!vector_str_pop(output)) {
2955                         free(type);
2956                         return (0);
2957                 }
2958         }
2959
2960         *str = type;
2961
2962         return (1);
2963 }
2964
2965 /*
2966  * read unqualified-name, unqualified name are operator-name, ctor-dtor-name,
2967  * source-name
2968  */
2969 static int
2970 cpp_demangle_read_uqname(struct cpp_demangle_data *ddata)
2971 {
2972         size_t len;
2973
2974         if (ddata == NULL || *ddata->cur == '\0')
2975                 return (0);
2976
2977         /* operator name */
2978         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
2979         case SIMPLE_HASH('a', 'a'):
2980                 /* operator && */
2981                 if (!cpp_demangle_push_str(ddata, "operator&&", 10))
2982                         return (0);
2983                 ddata->cur += 2;
2984                 return (1);
2985
2986         case SIMPLE_HASH('a', 'd'):
2987                 /* operator & (unary) */
2988                 if (!cpp_demangle_push_str(ddata, "operator&", 9))
2989                         return (0);
2990                 ddata->cur += 2;
2991                 return (1);
2992
2993         case SIMPLE_HASH('a', 'n'):
2994                 /* operator & */
2995                 if (!cpp_demangle_push_str(ddata, "operator&", 9))
2996                         return (0);
2997                 ddata->cur += 2;
2998                 return (1);
2999
3000         case SIMPLE_HASH('a', 'N'):
3001                 /* operator &= */
3002                 if (!cpp_demangle_push_str(ddata, "operator&=", 10))
3003                         return (0);
3004                 ddata->cur += 2;
3005                 return (1);
3006
3007         case SIMPLE_HASH('a', 'S'):
3008                 /* operator = */
3009                 if (!cpp_demangle_push_str(ddata, "operator=", 9))
3010                         return (0);
3011                 ddata->cur += 2;
3012                 return (1);
3013
3014         case SIMPLE_HASH('c', 'l'):
3015                 /* operator () */
3016                 if (!cpp_demangle_push_str(ddata, "operator()", 10))
3017                         return (0);
3018                 ddata->cur += 2;
3019                 return (1);
3020
3021         case SIMPLE_HASH('c', 'm'):
3022                 /* operator , */
3023                 if (!cpp_demangle_push_str(ddata, "operator,", 9))
3024                         return (0);
3025                 ddata->cur += 2;
3026                 return (1);
3027
3028         case SIMPLE_HASH('c', 'o'):
3029                 /* operator ~ */
3030                 if (!cpp_demangle_push_str(ddata, "operator~", 9))
3031                         return (0);
3032                 ddata->cur += 2;
3033                 return (1);
3034
3035         case SIMPLE_HASH('c', 'v'):
3036                 /* operator (cast) */
3037                 if (!cpp_demangle_push_str(ddata, "operator(cast)", 14))
3038                         return (0);
3039                 ddata->cur += 2;
3040                 return (cpp_demangle_read_type(ddata, 1));
3041
3042         case SIMPLE_HASH('d', 'a'):
3043                 /* operator delete [] */
3044                 if (!cpp_demangle_push_str(ddata, "operator delete []", 18))
3045                         return (0);
3046                 ddata->cur += 2;
3047                 return (1);
3048
3049         case SIMPLE_HASH('d', 'e'):
3050                 /* operator * (unary) */
3051                 if (!cpp_demangle_push_str(ddata, "operator*", 9))
3052                         return (0);
3053                 ddata->cur += 2;
3054                 return (1);
3055
3056         case SIMPLE_HASH('d', 'l'):
3057                 /* operator delete */
3058                 if (!cpp_demangle_push_str(ddata, "operator delete", 15))
3059                         return (0);
3060                 ddata->cur += 2;
3061                 return (1);
3062
3063         case SIMPLE_HASH('d', 'v'):
3064                 /* operator / */
3065                 if (!cpp_demangle_push_str(ddata, "operator/", 9))
3066                         return (0);
3067                 ddata->cur += 2;
3068                 return (1);
3069
3070         case SIMPLE_HASH('d', 'V'):
3071                 /* operator /= */
3072                 if (!cpp_demangle_push_str(ddata, "operator/=", 10))
3073                         return (0);
3074                 ddata->cur += 2;
3075                 return (1);
3076
3077         case SIMPLE_HASH('e', 'o'):
3078                 /* operator ^ */
3079                 if (!cpp_demangle_push_str(ddata, "operator^", 9))
3080                         return (0);
3081                 ddata->cur += 2;
3082                 return (1);
3083
3084         case SIMPLE_HASH('e', 'O'):
3085                 /* operator ^= */
3086                 if (!cpp_demangle_push_str(ddata, "operator^=", 10))
3087                         return (0);
3088                 ddata->cur += 2;
3089                 return (1);
3090
3091         case SIMPLE_HASH('e', 'q'):
3092                 /* operator == */
3093                 if (!cpp_demangle_push_str(ddata, "operator==", 10))
3094                         return (0);
3095                 ddata->cur += 2;
3096                 return (1);
3097
3098         case SIMPLE_HASH('g', 'e'):
3099                 /* operator >= */
3100                 if (!cpp_demangle_push_str(ddata, "operator>=", 10))
3101                         return (0);
3102                 ddata->cur += 2;
3103                 return (1);
3104
3105         case SIMPLE_HASH('g', 't'):
3106                 /* operator > */
3107                 if (!cpp_demangle_push_str(ddata, "operator>", 9))
3108                         return (0);
3109                 ddata->cur += 2;
3110                 return (1);
3111
3112         case SIMPLE_HASH('i', 'x'):
3113                 /* operator [] */
3114                 if (!cpp_demangle_push_str(ddata, "operator[]", 10))
3115                         return (0);
3116                 ddata->cur += 2;
3117                 return (1);
3118
3119         case SIMPLE_HASH('l', 'e'):
3120                 /* operator <= */
3121                 if (!cpp_demangle_push_str(ddata, "operator<=", 10))
3122                         return (0);
3123                 ddata->cur += 2;
3124                 return (1);
3125
3126         case SIMPLE_HASH('l', 's'):
3127                 /* operator << */
3128                 if (!cpp_demangle_push_str(ddata, "operator<<", 10))
3129                         return (0);
3130                 ddata->cur += 2;
3131                 return (1);
3132
3133         case SIMPLE_HASH('l', 'S'):
3134                 /* operator <<= */
3135                 if (!cpp_demangle_push_str(ddata, "operator<<=", 11))
3136                         return (0);
3137                 ddata->cur += 2;
3138                 return (1);
3139
3140         case SIMPLE_HASH('l', 't'):
3141                 /* operator < */
3142                 if (!cpp_demangle_push_str(ddata, "operator<", 9))
3143                         return (0);
3144                 ddata->cur += 2;
3145                 return (1);
3146
3147         case SIMPLE_HASH('m', 'i'):
3148                 /* operator - */
3149                 if (!cpp_demangle_push_str(ddata, "operator-", 9))
3150                         return (0);
3151                 ddata->cur += 2;
3152                 return (1);
3153
3154         case SIMPLE_HASH('m', 'I'):
3155                 /* operator -= */
3156                 if (!cpp_demangle_push_str(ddata, "operator-=", 10))
3157                         return (0);
3158                 ddata->cur += 2;
3159                 return (1);
3160
3161         case SIMPLE_HASH('m', 'l'):
3162                 /* operator * */
3163                 if (!cpp_demangle_push_str(ddata, "operator*", 9))
3164                         return (0);
3165                 ddata->cur += 2;
3166                 return (1);
3167
3168         case SIMPLE_HASH('m', 'L'):
3169                 /* operator *= */
3170                 if (!cpp_demangle_push_str(ddata, "operator*=", 10))
3171                         return (0);
3172                 ddata->cur += 2;
3173                 return (1);
3174
3175         case SIMPLE_HASH('m', 'm'):
3176                 /* operator -- */
3177                 if (!cpp_demangle_push_str(ddata, "operator--", 10))
3178                         return (0);
3179                 ddata->cur += 2;
3180                 return (1);
3181
3182         case SIMPLE_HASH('n', 'a'):
3183                 /* operator new[] */
3184                 if (!cpp_demangle_push_str(ddata, "operator new []", 15))
3185                         return (0);
3186                 ddata->cur += 2;
3187                 return (1);
3188
3189         case SIMPLE_HASH('n', 'e'):
3190                 /* operator != */
3191                 if (!cpp_demangle_push_str(ddata, "operator!=", 10))
3192                         return (0);
3193                 ddata->cur += 2;
3194                 return (1);
3195
3196         case SIMPLE_HASH('n', 'g'):
3197                 /* operator - (unary) */
3198                 if (!cpp_demangle_push_str(ddata, "operator-", 9))
3199                         return (0);
3200                 ddata->cur += 2;
3201                 return (1);
3202
3203         case SIMPLE_HASH('n', 't'):
3204                 /* operator ! */
3205                 if (!cpp_demangle_push_str(ddata, "operator!", 9))
3206                         return (0);
3207                 ddata->cur += 2;
3208                 return (1);
3209
3210         case SIMPLE_HASH('n', 'w'):
3211                 /* operator new */
3212                 if (!cpp_demangle_push_str(ddata, "operator new", 12))
3213                         return (0);
3214                 ddata->cur += 2;
3215                 return (1);
3216
3217         case SIMPLE_HASH('o', 'o'):
3218                 /* operator || */
3219                 if (!cpp_demangle_push_str(ddata, "operator||", 10))
3220                         return (0);
3221                 ddata->cur += 2;
3222                 return (1);
3223
3224         case SIMPLE_HASH('o', 'r'):
3225                 /* operator | */
3226                 if (!cpp_demangle_push_str(ddata, "operator|", 9))
3227                         return (0);
3228                 ddata->cur += 2;
3229                 return (1);
3230
3231         case SIMPLE_HASH('o', 'R'):
3232                 /* operator |= */
3233                 if (!cpp_demangle_push_str(ddata, "operator|=", 10))
3234                         return (0);
3235                 ddata->cur += 2;
3236                 return (1);
3237
3238         case SIMPLE_HASH('p', 'l'):
3239                 /* operator + */
3240                 if (!cpp_demangle_push_str(ddata, "operator+", 9))
3241                         return (0);
3242                 ddata->cur += 2;
3243                 return (1);
3244
3245         case SIMPLE_HASH('p', 'L'):
3246                 /* operator += */
3247                 if (!cpp_demangle_push_str(ddata, "operator+=", 10))
3248                         return (0);
3249                 ddata->cur += 2;
3250                 return (1);
3251
3252         case SIMPLE_HASH('p', 'm'):
3253                 /* operator ->* */
3254                 if (!cpp_demangle_push_str(ddata, "operator->*", 11))
3255                         return (0);
3256                 ddata->cur += 2;
3257                 return (1);
3258
3259         case SIMPLE_HASH('p', 'p'):
3260                 /* operator ++ */
3261                 if (!cpp_demangle_push_str(ddata, "operator++", 10))
3262                         return (0);
3263                 ddata->cur += 2;
3264                 return (1);
3265
3266         case SIMPLE_HASH('p', 's'):
3267                 /* operator + (unary) */
3268                 if (!cpp_demangle_push_str(ddata, "operator+", 9))
3269                         return (0);
3270                 ddata->cur += 2;
3271                 return (1);
3272
3273         case SIMPLE_HASH('p', 't'):
3274                 /* operator -> */
3275                 if (!cpp_demangle_push_str(ddata, "operator->", 10))
3276                         return (0);
3277                 ddata->cur += 2;
3278                 return (1);
3279
3280         case SIMPLE_HASH('q', 'u'):
3281                 /* operator ? */
3282                 if (!cpp_demangle_push_str(ddata, "operator?", 9))
3283                         return (0);
3284                 ddata->cur += 2;
3285                 return (1);
3286
3287         case SIMPLE_HASH('r', 'm'):
3288                 /* operator % */
3289                 if (!cpp_demangle_push_str(ddata, "operator%", 9))
3290                         return (0);
3291                 ddata->cur += 2;
3292                 return (1);
3293
3294         case SIMPLE_HASH('r', 'M'):
3295                 /* operator %= */
3296                 if (!cpp_demangle_push_str(ddata, "operator%=", 10))
3297                         return (0);
3298                 ddata->cur += 2;
3299                 return (1);
3300
3301         case SIMPLE_HASH('r', 's'):
3302                 /* operator >> */
3303                 if (!cpp_demangle_push_str(ddata, "operator>>", 10))
3304                         return (0);
3305                 ddata->cur += 2;
3306                 return (1);
3307
3308         case SIMPLE_HASH('r', 'S'):
3309                 /* operator >>= */
3310                 if (!cpp_demangle_push_str(ddata, "operator>>=", 11))
3311                         return (0);
3312                 ddata->cur += 2;
3313                 return (1);
3314
3315         case SIMPLE_HASH('r', 'z'):
3316                 /* operator sizeof */
3317                 if (!cpp_demangle_push_str(ddata, "operator sizeof ", 16))
3318                         return (0);
3319                 ddata->cur += 2;
3320                 return (1);
3321
3322         case SIMPLE_HASH('s', 'r'):
3323                 /* scope resolution operator */
3324                 if (!cpp_demangle_push_str(ddata, "scope resolution operator ",
3325                     26))
3326                         return (0);
3327                 ddata->cur += 2;
3328                 return (1);
3329
3330         case SIMPLE_HASH('s', 'v'):
3331                 /* operator sizeof */
3332                 if (!cpp_demangle_push_str(ddata, "operator sizeof ", 16))
3333                         return (0);
3334                 ddata->cur += 2;
3335                 return (1);
3336         }
3337
3338         /* vendor extened operator */
3339         if (*ddata->cur == 'v' && ELFTC_ISDIGIT(*(ddata->cur + 1))) {
3340                 if (!cpp_demangle_push_str(ddata, "vendor extened operator ",
3341                     24))
3342                         return (0);
3343                 if (!cpp_demangle_push_str(ddata, ddata->cur + 1, 1))
3344                         return (0);
3345                 ddata->cur += 2;
3346                 return (cpp_demangle_read_sname(ddata));
3347         }
3348
3349         /* ctor-dtor-name */
3350         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
3351         case SIMPLE_HASH('C', '1'):
3352                 /* FALLTHROUGH */
3353         case SIMPLE_HASH('C', '2'):
3354                 /* FALLTHROUGH */
3355         case SIMPLE_HASH('C', '3'):
3356                 if (ddata->last_sname == NULL)
3357                         return (0);
3358                 if ((len = strlen(ddata->last_sname)) == 0)
3359                         return (0);
3360                 if (!cpp_demangle_push_str(ddata, "::", 2))
3361                         return (0);
3362                 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
3363                         return (0);
3364                 ddata->cur +=2;
3365                 return (1);
3366
3367         case SIMPLE_HASH('D', '0'):
3368                 /* FALLTHROUGH */
3369         case SIMPLE_HASH('D', '1'):
3370                 /* FALLTHROUGH */
3371         case SIMPLE_HASH('D', '2'):
3372                 if (ddata->last_sname == NULL)
3373                         return (0);
3374                 if ((len = strlen(ddata->last_sname)) == 0)
3375                         return (0);
3376                 if (!cpp_demangle_push_str(ddata, "::~", 3))
3377                         return (0);
3378                 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
3379                         return (0);
3380                 ddata->cur +=2;
3381                 return (1);
3382         }
3383
3384         /* source name */
3385         if (ELFTC_ISDIGIT(*ddata->cur) != 0)
3386                 return (cpp_demangle_read_sname(ddata));
3387
3388         /* local source name */
3389         if (*ddata->cur == 'L')
3390                 return (cpp_demangle_local_source_name(ddata));
3391
3392         return (1);
3393 }
3394
3395 /*
3396  * Read local source name.
3397  *
3398  * References:
3399  *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31775
3400  *   http://gcc.gnu.org/viewcvs?view=rev&revision=124467
3401  */
3402 static int
3403 cpp_demangle_local_source_name(struct cpp_demangle_data *ddata)
3404 {
3405         /* L */
3406         if (ddata == NULL || *ddata->cur != 'L')
3407                 return (0);
3408         ++ddata->cur;
3409
3410         /* source name */
3411         if (!cpp_demangle_read_sname(ddata))
3412                 return (0);
3413
3414         /* discriminator */
3415         if (*ddata->cur == '_') {
3416                 ++ddata->cur;
3417                 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
3418                         ++ddata->cur;
3419         }
3420
3421         return (1);
3422 }
3423
3424 static int
3425 cpp_demangle_read_v_offset(struct cpp_demangle_data *ddata)
3426 {
3427
3428         if (ddata == NULL)
3429                 return (0);
3430
3431         if (!cpp_demangle_push_str(ddata, "offset : ", 9))
3432                 return (0);
3433
3434         if (!cpp_demangle_read_offset_number(ddata))
3435                 return (0);
3436
3437         if (!cpp_demangle_push_str(ddata, "virtual offset : ", 17))
3438                 return (0);
3439
3440         return (!cpp_demangle_read_offset_number(ddata));
3441 }
3442
3443 /*
3444  * Decode floating point representation to string
3445  * Return new allocated string or NULL
3446  *
3447  * Todo
3448  * Replace these functions to macro.
3449  */
3450 static char *
3451 decode_fp_to_double(const char *p, size_t len)
3452 {
3453         double f;
3454         size_t rtn_len, limit, i;
3455         int byte;
3456         char *rtn;
3457
3458         if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(double))
3459                 return (NULL);
3460
3461         memset(&f, 0, sizeof(double));
3462
3463         for (i = 0; i < len / 2; ++i) {
3464                 byte = hex_to_dec(p[len - i * 2 - 1]) +
3465                     hex_to_dec(p[len - i * 2 - 2]) * 16;
3466
3467                 if (byte < 0 || byte > 255)
3468                         return (NULL);
3469
3470 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3471                 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3472 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3473                 ((unsigned char *)&f)[sizeof(double) - i - 1] =
3474                     (unsigned char)(byte);
3475 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3476         }
3477
3478         rtn_len = 64;
3479         limit = 0;
3480 again:
3481         if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3482                 return (NULL);
3483
3484         if (snprintf(rtn, rtn_len, "%fld", f) >= (int)rtn_len) {
3485                 free(rtn);
3486                 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3487                         return (NULL);
3488                 rtn_len *= BUFFER_GROWFACTOR;
3489                 goto again;
3490         }
3491
3492         return rtn;
3493 }
3494
3495 static char *
3496 decode_fp_to_float(const char *p, size_t len)
3497 {
3498         size_t i, rtn_len, limit;
3499         float f;
3500         int byte;
3501         char *rtn;
3502
3503         if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(float))
3504                 return (NULL);
3505
3506         memset(&f, 0, sizeof(float));
3507
3508         for (i = 0; i < len / 2; ++i) {
3509                 byte = hex_to_dec(p[len - i * 2 - 1]) +
3510                     hex_to_dec(p[len - i * 2 - 2]) * 16;
3511                 if (byte < 0 || byte > 255)
3512                         return (NULL);
3513 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3514                 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3515 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3516                 ((unsigned char *)&f)[sizeof(float) - i - 1] =
3517                     (unsigned char)(byte);
3518 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3519         }
3520
3521         rtn_len = 64;
3522         limit = 0;
3523 again:
3524         if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3525                 return (NULL);
3526
3527         if (snprintf(rtn, rtn_len, "%ff", f) >= (int)rtn_len) {
3528                 free(rtn);
3529                 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3530                         return (NULL);
3531                 rtn_len *= BUFFER_GROWFACTOR;
3532                 goto again;
3533         }
3534
3535         return rtn;
3536 }
3537
3538 static char *
3539 decode_fp_to_float128(const char *p, size_t len)
3540 {
3541         long double f;
3542         size_t rtn_len, limit, i;
3543         int byte;
3544         unsigned char buf[FLOAT_QUADRUPLE_BYTES];
3545         char *rtn;
3546
3547         switch(sizeof(long double)) {
3548         case FLOAT_QUADRUPLE_BYTES:
3549                 return (decode_fp_to_long_double(p, len));
3550         case FLOAT_EXTENED_BYTES:
3551                 if (p == NULL || len == 0 || len % 2 != 0 ||
3552                     len / 2 > FLOAT_QUADRUPLE_BYTES)
3553                         return (NULL);
3554
3555                 memset(buf, 0, FLOAT_QUADRUPLE_BYTES);
3556
3557                 for (i = 0; i < len / 2; ++i) {
3558                         byte = hex_to_dec(p[len - i * 2 - 1]) +
3559                             hex_to_dec(p[len - i * 2 - 2]) * 16;
3560                         if (byte < 0 || byte > 255)
3561                                 return (NULL);
3562 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3563                         buf[i] = (unsigned char)(byte);
3564 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3565                         buf[FLOAT_QUADRUPLE_BYTES - i -1] =
3566                             (unsigned char)(byte);
3567 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3568                 }
3569                 memset(&f, 0, FLOAT_EXTENED_BYTES);
3570
3571 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3572                 memcpy(&f, buf, FLOAT_EXTENED_BYTES);
3573 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3574                 memcpy(&f, buf + 6, FLOAT_EXTENED_BYTES);
3575 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3576
3577                 rtn_len = 256;
3578                 limit = 0;
3579 again:
3580                 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3581                         return (NULL);
3582
3583                 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3584                         free(rtn);
3585                         if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3586                                 return (NULL);
3587                         rtn_len *= BUFFER_GROWFACTOR;
3588                         goto again;
3589                 }
3590
3591                 return (rtn);
3592         default:
3593                 return (NULL);
3594         }
3595 }
3596
3597 static char *
3598 decode_fp_to_float80(const char *p, size_t len)
3599 {
3600         long double f;
3601         size_t rtn_len, limit, i;
3602         int byte;
3603         unsigned char buf[FLOAT_EXTENED_BYTES];
3604         char *rtn;
3605
3606         switch(sizeof(long double)) {
3607         case FLOAT_QUADRUPLE_BYTES:
3608                 if (p == NULL || len == 0 || len % 2 != 0 ||
3609                     len / 2 > FLOAT_EXTENED_BYTES)
3610                         return (NULL);
3611
3612                 memset(buf, 0, FLOAT_EXTENED_BYTES);
3613
3614                 for (i = 0; i < len / 2; ++i) {
3615                         byte = hex_to_dec(p[len - i * 2 - 1]) +
3616                             hex_to_dec(p[len - i * 2 - 2]) * 16;
3617
3618                         if (byte < 0 || byte > 255)
3619                                 return (NULL);
3620
3621 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3622                         buf[i] = (unsigned char)(byte);
3623 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3624                         buf[FLOAT_EXTENED_BYTES - i -1] =
3625                             (unsigned char)(byte);
3626 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3627                 }
3628
3629                 memset(&f, 0, FLOAT_QUADRUPLE_BYTES);
3630
3631 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3632                 memcpy(&f, buf, FLOAT_EXTENED_BYTES);
3633 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3634                 memcpy((unsigned char *)(&f) + 6, buf, FLOAT_EXTENED_BYTES);
3635 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3636
3637                 rtn_len = 256;
3638                 limit = 0;
3639 again:
3640                 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3641                         return (NULL);
3642
3643                 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3644                         free(rtn);
3645                         if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3646                                 return (NULL);
3647                         rtn_len *= BUFFER_GROWFACTOR;
3648                         goto again;
3649                 }
3650
3651                 return (rtn);
3652         case FLOAT_EXTENED_BYTES:
3653                 return (decode_fp_to_long_double(p, len));
3654         default:
3655                 return (NULL);
3656         }
3657 }
3658
3659 static char *
3660 decode_fp_to_long_double(const char *p, size_t len)
3661 {
3662         long double f;
3663         size_t rtn_len, limit, i;
3664         int byte;
3665         char *rtn;
3666
3667         if (p == NULL || len == 0 || len % 2 != 0 ||
3668             len / 2 > sizeof(long double))
3669                 return (NULL);
3670
3671         memset(&f, 0, sizeof(long double));
3672
3673         for (i = 0; i < len / 2; ++i) {
3674                 byte = hex_to_dec(p[len - i * 2 - 1]) +
3675                     hex_to_dec(p[len - i * 2 - 2]) * 16;
3676
3677                 if (byte < 0 || byte > 255)
3678                         return (NULL);
3679
3680 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3681                 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3682 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3683                 ((unsigned char *)&f)[sizeof(long double) - i - 1] =
3684                     (unsigned char)(byte);
3685 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3686         }
3687
3688         rtn_len = 256;
3689         limit = 0;
3690 again:
3691         if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3692                 return (NULL);
3693
3694         if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3695                 free(rtn);
3696                 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3697                         return (NULL);
3698                 rtn_len *= BUFFER_GROWFACTOR;
3699                 goto again;
3700         }
3701
3702         return (rtn);
3703 }
3704
3705 /* Simple hex to integer function used by decode_to_* function. */
3706 static int
3707 hex_to_dec(char c)
3708 {
3709
3710         switch (c) {
3711         case '0':
3712                 return (0);
3713         case '1':
3714                 return (1);
3715         case '2':
3716                 return (2);
3717         case '3':
3718                 return (3);
3719         case '4':
3720                 return (4);
3721         case '5':
3722                 return (5);
3723         case '6':
3724                 return (6);
3725         case '7':
3726                 return (7);
3727         case '8':
3728                 return (8);
3729         case '9':
3730                 return (9);
3731         case 'a':
3732                 return (10);
3733         case 'b':
3734                 return (11);
3735         case 'c':
3736                 return (12);
3737         case 'd':
3738                 return (13);
3739         case 'e':
3740                 return (14);
3741         case 'f':
3742                 return (15);
3743         default:
3744                 return (-1);
3745         }
3746 }
3747
3748 static void
3749 vector_read_cmd_dest(struct vector_read_cmd *v)
3750 {
3751
3752         if (v == NULL)
3753                 return;
3754
3755         free(v->r_container);
3756 }
3757
3758 /* return -1 at failed, 0 at not found, 1 at found. */
3759 static int
3760 vector_read_cmd_find(struct vector_read_cmd *v, enum read_cmd dst)
3761 {
3762         size_t i;
3763
3764         if (v == NULL || dst == READ_FAIL)
3765                 return (-1);
3766
3767         for (i = 0; i < v->size; ++i)
3768                 if (v->r_container[i] == dst)
3769                         return (1);
3770
3771         return (0);
3772 }
3773
3774 static int
3775 vector_read_cmd_init(struct vector_read_cmd *v)
3776 {
3777
3778         if (v == NULL)
3779                 return (0);
3780
3781         v->size = 0;
3782         v->capacity = VECTOR_DEF_CAPACITY;
3783
3784         if ((v->r_container = malloc(sizeof(enum read_cmd) * v->capacity))
3785             == NULL)
3786                 return (0);
3787
3788         return (1);
3789 }
3790
3791 static int
3792 vector_read_cmd_pop(struct vector_read_cmd *v)
3793 {
3794
3795         if (v == NULL || v->size == 0)
3796                 return (0);
3797
3798         --v->size;
3799         v->r_container[v->size] = READ_FAIL;
3800
3801         return (1);
3802 }
3803
3804 static int
3805 vector_read_cmd_push(struct vector_read_cmd *v, enum read_cmd cmd)
3806 {
3807         enum read_cmd *tmp_r_ctn;
3808         size_t tmp_cap;
3809         size_t i;
3810
3811         if (v == NULL)
3812                 return (0);
3813
3814         if (v->size == v->capacity) {
3815                 tmp_cap = v->capacity * BUFFER_GROWFACTOR;
3816                 if ((tmp_r_ctn = malloc(sizeof(enum read_cmd) * tmp_cap))
3817                     == NULL)
3818                         return (0);
3819                 for (i = 0; i < v->size; ++i)
3820                         tmp_r_ctn[i] = v->r_container[i];
3821                 free(v->r_container);
3822                 v->r_container = tmp_r_ctn;
3823                 v->capacity = tmp_cap;
3824         }
3825
3826         v->r_container[v->size] = cmd;
3827         ++v->size;
3828
3829         return (1);
3830 }
3831
3832 static void
3833 vector_type_qualifier_dest(struct vector_type_qualifier *v)
3834 {
3835
3836         if (v == NULL)
3837                 return;
3838
3839         free(v->q_container);
3840         vector_str_dest(&v->ext_name);
3841 }
3842
3843 /* size, capacity, ext_name */
3844 static int
3845 vector_type_qualifier_init(struct vector_type_qualifier *v)
3846 {
3847
3848         if (v == NULL)
3849                 return (0);
3850
3851         v->size = 0;
3852         v->capacity = VECTOR_DEF_CAPACITY;
3853
3854         if ((v->q_container = malloc(sizeof(enum type_qualifier) * v->capacity))
3855             == NULL)
3856                 return (0);
3857
3858         assert(v->q_container != NULL);
3859
3860         if (vector_str_init(&v->ext_name) == false) {
3861                 free(v->q_container);
3862                 return (0);
3863         }
3864
3865         return (1);
3866 }
3867
3868 static int
3869 vector_type_qualifier_push(struct vector_type_qualifier *v,
3870     enum type_qualifier t)
3871 {
3872         enum type_qualifier *tmp_ctn;
3873         size_t tmp_cap;
3874         size_t i;
3875
3876         if (v == NULL)
3877                 return (0);
3878
3879         if (v->size == v->capacity) {
3880                 tmp_cap = v->capacity * BUFFER_GROWFACTOR;
3881                 if ((tmp_ctn = malloc(sizeof(enum type_qualifier) * tmp_cap))
3882                     == NULL)
3883                         return (0);
3884                 for (i = 0; i < v->size; ++i)
3885                         tmp_ctn[i] = v->q_container[i];
3886                 free(v->q_container);
3887                 v->q_container = tmp_ctn;
3888                 v->capacity = tmp_cap;
3889         }
3890
3891         v->q_container[v->size] = t;
3892         ++v->size;
3893
3894         return (1);
3895 }