]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/libcxxrt/libelftc_dem_gnu3.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.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
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_binary(struct cpp_demangle_data *,
401                     const char *, size_t);
402 static int      cpp_demangle_read_expression_unary(struct cpp_demangle_data *,
403                     const char *, size_t);
404 static int      cpp_demangle_read_expression_trinary(struct cpp_demangle_data *,
405                     const char *, size_t, const char *, size_t);
406 static int      cpp_demangle_read_function(struct cpp_demangle_data *, int *,
407                     struct vector_type_qualifier *);
408 static int      cpp_demangle_read_local_name(struct cpp_demangle_data *);
409 static int      cpp_demangle_read_name(struct cpp_demangle_data *);
410 static int      cpp_demangle_read_nested_name(struct cpp_demangle_data *);
411 static int      cpp_demangle_read_number(struct cpp_demangle_data *, long *);
412 static int      cpp_demangle_read_nv_offset(struct cpp_demangle_data *);
413 static int      cpp_demangle_read_offset(struct cpp_demangle_data *);
414 static int      cpp_demangle_read_offset_number(struct cpp_demangle_data *);
415 static int      cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *);
416 static int      cpp_demangle_read_sname(struct cpp_demangle_data *);
417 static int      cpp_demangle_read_subst(struct cpp_demangle_data *);
418 static int      cpp_demangle_read_subst_std(struct cpp_demangle_data *);
419 static int      cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *,
420                     const char *, size_t);
421 static int      cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *);
422 static int      cpp_demangle_read_tmpl_args(struct cpp_demangle_data *);
423 static int      cpp_demangle_read_tmpl_param(struct cpp_demangle_data *);
424 static int      cpp_demangle_read_type(struct cpp_demangle_data *, int);
425 static int      cpp_demangle_read_uqname(struct cpp_demangle_data *);
426 static int      cpp_demangle_read_v_offset(struct cpp_demangle_data *);
427 static char     *decode_fp_to_double(const char *, size_t);
428 static char     *decode_fp_to_float(const char *, size_t);
429 static char     *decode_fp_to_float128(const char *, size_t);
430 static char     *decode_fp_to_float80(const char *, size_t);
431 static char     *decode_fp_to_long_double(const char *, size_t);
432 static int      hex_to_dec(char);
433 static void     vector_read_cmd_dest(struct vector_read_cmd *);
434 static int      vector_read_cmd_find(struct vector_read_cmd *, enum read_cmd);
435 static int      vector_read_cmd_init(struct vector_read_cmd *);
436 static int      vector_read_cmd_pop(struct vector_read_cmd *);
437 static int      vector_read_cmd_push(struct vector_read_cmd *, enum read_cmd);
438 static void     vector_type_qualifier_dest(struct vector_type_qualifier *);
439 static int      vector_type_qualifier_init(struct vector_type_qualifier *);
440 static int      vector_type_qualifier_push(struct vector_type_qualifier *,
441                     enum type_qualifier);
442
443 /**
444  * @brief Decode the input string by IA-64 C++ ABI style.
445  *
446  * GNU GCC v3 use IA-64 standard ABI.
447  * @return New allocated demangled string or NULL if failed.
448  * @todo 1. Testing and more test case. 2. Code cleaning.
449  */
450 char *
451 __cxa_demangle_gnu3(const char *org)
452 {
453         struct cpp_demangle_data ddata;
454         ssize_t org_len;
455         unsigned int limit;
456         char *rtn;
457
458         if (org == NULL)
459                 return (NULL);
460
461         // Try demangling as a type for short encodings
462         if (((org_len = strlen(org)) < 2) || (org[0] != '_' || org[1] != 'Z' )) {
463                 if (!cpp_demangle_data_init(&ddata, org))
464                         return (NULL);
465                 if (!cpp_demangle_read_type(&ddata, 0))
466                         goto clean;
467                 rtn = vector_str_get_flat(&ddata.output, (size_t *) NULL);
468                 goto clean;
469         }
470         if (org_len > 11 && !strncmp(org, "_GLOBAL__I_", 11)) {
471                 if ((rtn = malloc(org_len + 19)) == NULL)
472                         return (NULL);
473                 snprintf(rtn, org_len + 19,
474                     "global constructors keyed to %s", org + 11);
475                 return (rtn);
476         }
477
478
479         if (!cpp_demangle_data_init(&ddata, org + 2))
480                 return (NULL);
481
482         rtn = NULL;
483
484         if (!cpp_demangle_read_encoding(&ddata))
485                 goto clean;
486
487         limit = 0;
488         while (*ddata.cur != '\0') {
489                 /*
490                  * Breaking at some gcc info at tail. e.g) @@GLIBCXX_3.4
491                  */
492                 if (*ddata.cur == '@' && *(ddata.cur + 1) == '@')
493                         break;
494                 if (!cpp_demangle_read_type(&ddata, 1))
495                         goto clean;
496                 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
497                         goto clean;
498         }
499
500         if (ddata.output.size == 0)
501                 goto clean;
502         if (ddata.paren && !vector_str_push(&ddata.output, ")", 1))
503                 goto clean;
504         if (ddata.mem_vat && !vector_str_push(&ddata.output, " volatile", 9))
505                 goto clean;
506         if (ddata.mem_cst && !vector_str_push(&ddata.output, " const", 6))
507                 goto clean;
508         if (ddata.mem_rst && !vector_str_push(&ddata.output, " restrict", 9))
509                 goto clean;
510
511         rtn = vector_str_get_flat(&ddata.output, (size_t *) NULL);
512
513 clean:
514         cpp_demangle_data_dest(&ddata);
515
516         return (rtn);
517 }
518
519 static void
520 cpp_demangle_data_dest(struct cpp_demangle_data *d)
521 {
522
523         if (d == NULL)
524                 return;
525
526         vector_read_cmd_dest(&d->cmd);
527         vector_str_dest(&d->class_type);
528         vector_str_dest(&d->tmpl);
529         vector_str_dest(&d->subst);
530         vector_str_dest(&d->output_tmp);
531         vector_str_dest(&d->output);
532 }
533
534 static int
535 cpp_demangle_data_init(struct cpp_demangle_data *d, const char *cur)
536 {
537
538         if (d == NULL || cur == NULL)
539                 return (0);
540
541         if (!vector_str_init(&d->output))
542                 return (0);
543         if (!vector_str_init(&d->output_tmp))
544                 goto clean1;
545         if (!vector_str_init(&d->subst))
546                 goto clean2;
547         if (!vector_str_init(&d->tmpl))
548                 goto clean3;
549         if (!vector_str_init(&d->class_type))
550                 goto clean4;
551         if (!vector_read_cmd_init(&d->cmd))
552                 goto clean5;
553
554         assert(d->output.container != NULL);
555         assert(d->output_tmp.container != NULL);
556         assert(d->subst.container != NULL);
557         assert(d->tmpl.container != NULL);
558         assert(d->class_type.container != NULL);
559
560         d->paren = false;
561         d->pfirst = false;
562         d->mem_rst = false;
563         d->mem_vat = false;
564         d->mem_cst = false;
565         d->func_type = 0;
566         d->cur = cur;
567         d->last_sname = NULL;
568         d->push_head = 0;
569
570         return (1);
571
572 clean5:
573         vector_str_dest(&d->class_type);
574 clean4:
575         vector_str_dest(&d->tmpl);
576 clean3:
577         vector_str_dest(&d->subst);
578 clean2:
579         vector_str_dest(&d->output_tmp);
580 clean1:
581         vector_str_dest(&d->output);
582
583         return (0);
584 }
585
586 static int
587 cpp_demangle_push_fp(struct cpp_demangle_data *ddata,
588     char *(*decoder)(const char *, size_t))
589 {
590         size_t len;
591         int rtn;
592         const char *fp;
593         char *f;
594
595         if (ddata == NULL || decoder == NULL)
596                 return (0);
597
598         fp = ddata->cur;
599         while (*ddata->cur != 'E')
600                 ++ddata->cur;
601         ++ddata->cur;
602
603         if ((f = decoder(fp, ddata->cur - fp)) == NULL)
604                 return (0);
605
606         rtn = 0;
607         if ((len = strlen(f)) > 0 &&
608             cpp_demangle_push_str(ddata, f, len))
609                 rtn = 1;
610
611         free(f);
612
613         return (0);
614 }
615
616 static int
617 cpp_demangle_push_str(struct cpp_demangle_data *ddata, const char *str,
618     size_t len)
619 {
620
621         if (ddata == NULL || str == NULL || len == 0)
622                 return (0);
623
624         if (ddata->push_head > 0)
625                 return (vector_str_push(&ddata->output_tmp, str, len));
626
627         return (vector_str_push(&ddata->output, str, len));
628 }
629
630 static int
631 cpp_demangle_push_subst(struct cpp_demangle_data *ddata, const char *str,
632     size_t len)
633 {
634
635         if (ddata == NULL || str == NULL || len == 0)
636                 return (0);
637
638         if (!vector_str_find(&ddata->subst, str, len))
639                 return (vector_str_push(&ddata->subst, str, len));
640
641         return (1);
642 }
643
644 static int
645 cpp_demangle_push_subst_v(struct cpp_demangle_data *ddata, struct vector_str *v)
646 {
647         size_t str_len;
648         int rtn;
649         char *str;
650
651         if (ddata == NULL || v == NULL)
652                 return (0);
653
654         if ((str = vector_str_get_flat(v, &str_len)) == NULL)
655                 return (0);
656
657         rtn = cpp_demangle_push_subst(ddata, str, str_len);
658         free(str);
659
660         return (rtn);
661 }
662
663 static int
664 cpp_demangle_push_type_qualifier(struct cpp_demangle_data *ddata,
665     struct vector_type_qualifier *v, const char *type_str)
666 {
667         struct vector_str subst_v;
668         size_t idx, e_idx, e_len;
669         int rtn;
670         char *buf;
671
672         if (ddata == NULL || v == NULL)
673                 return (0);
674
675         if ((idx = v->size) == 0)
676                 return (1);
677
678         rtn = 0;
679         if (type_str != NULL) {
680                 if (!vector_str_init(&subst_v))
681                         return (0);
682                 if (!vector_str_push(&subst_v, type_str, strlen(type_str)))
683                         goto clean;
684         }
685
686         e_idx = 0;
687         while (idx > 0) {
688                 switch (v->q_container[idx - 1]) {
689                 case TYPE_PTR:
690                         if (!cpp_demangle_push_str(ddata, "*", 1))
691                                 goto clean;
692                         if (type_str != NULL) {
693                                 if (!vector_str_push(&subst_v, "*", 1))
694                                         goto clean;
695                                 if (!cpp_demangle_push_subst_v(ddata, &subst_v))
696                                         goto clean;
697                         }
698                         break;
699
700                 case TYPE_REF:
701                         if (!cpp_demangle_push_str(ddata, "&", 1))
702                                 goto clean;
703                         if (type_str != NULL) {
704                                 if (!vector_str_push(&subst_v, "&", 1))
705                                         goto clean;
706                                 if (!cpp_demangle_push_subst_v(ddata, &subst_v))
707                                         goto clean;
708                         }
709                         break;
710
711                 case TYPE_CMX:
712                         if (!cpp_demangle_push_str(ddata, " complex", 8))
713                                 goto clean;
714                         if (type_str != NULL) {
715                                 if (!vector_str_push(&subst_v, " complex", 8))
716                                         goto clean;
717                                 if (!cpp_demangle_push_subst_v(ddata, &subst_v))
718                                         goto clean;
719                         }
720                         break;
721
722                 case TYPE_IMG:
723                         if (!cpp_demangle_push_str(ddata, " imaginary", 10))
724                                 goto clean;
725                         if (type_str != NULL) {
726                                 if (!vector_str_push(&subst_v, " imaginary", 10))
727                                         goto clean;
728                                 if (!cpp_demangle_push_subst_v(ddata, &subst_v))
729                                         goto clean;
730                         }
731                         break;
732
733                 case TYPE_EXT:
734                         if (e_idx > v->ext_name.size - 1)
735                                 goto clean;
736                         if ((e_len = strlen(v->ext_name.container[e_idx])) == 0)
737                                 goto clean;
738                         if ((buf = malloc(sizeof(char) * (e_len + 1))) == NULL)
739                                 goto clean;
740
741                         memcpy(buf, " ", 1);
742                         memcpy(buf + 1, v->ext_name.container[e_idx], e_len);
743
744                         if (!cpp_demangle_push_str(ddata, buf, e_len + 1)) {
745                                 free(buf);
746                                 goto clean;
747                         }
748
749                         if (type_str != NULL) {
750                                 if (!vector_str_push(&subst_v, buf,
751                                     e_len + 1)) {
752                                         free(buf);
753                                         goto clean;
754                                 }
755                                 if (!cpp_demangle_push_subst_v(ddata, &subst_v)) {
756                                         free(buf);
757                                         goto clean;
758                                 }
759                         }
760                         free(buf);
761                         ++e_idx;
762                         break;
763
764                 case TYPE_RST:
765                         if (!cpp_demangle_push_str(ddata, " restrict", 9))
766                                 goto clean;
767                         if (type_str != NULL) {
768                                 if (!vector_str_push(&subst_v, " restrict", 9))
769                                         goto clean;
770                                 if (!cpp_demangle_push_subst_v(ddata, &subst_v))
771                                         goto clean;
772                         }
773                         break;
774
775                 case TYPE_VAT:
776                         if (!cpp_demangle_push_str(ddata, " volatile", 9))
777                                 goto clean;
778                         if (type_str != NULL) {
779                                 if (!vector_str_push(&subst_v, " volatile", 9))
780                                         goto clean;
781                                 if (!cpp_demangle_push_subst_v(ddata, &subst_v))
782                                         goto clean;
783                         }
784                         break;
785
786                 case TYPE_CST:
787                         if (!cpp_demangle_push_str(ddata, " const", 6))
788                                 goto clean;
789                         if (type_str != NULL) {
790                                 if (!vector_str_push(&subst_v, " const", 6))
791                                         goto clean;
792                                 if (!cpp_demangle_push_subst_v(ddata, &subst_v))
793                                         goto clean;
794                         }
795                         break;
796
797                 };
798                 --idx;
799         }
800
801         rtn = 1;
802 clean:
803         if (type_str != NULL)
804                 vector_str_dest(&subst_v);
805
806         return (rtn);
807 }
808
809 static int
810 cpp_demangle_get_subst(struct cpp_demangle_data *ddata, size_t idx)
811 {
812         size_t len;
813
814         if (ddata == NULL || ddata->subst.size <= idx)
815                 return (0);
816         if ((len = strlen(ddata->subst.container[idx])) == 0)
817                 return (0);
818         if (!cpp_demangle_push_str(ddata, ddata->subst.container[idx], len))
819                 return (0);
820
821         /* skip '_' */
822         ++ddata->cur;
823
824         return (1);
825 }
826
827 static int
828 cpp_demangle_get_tmpl_param(struct cpp_demangle_data *ddata, size_t idx)
829 {
830         size_t len;
831
832         if (ddata == NULL || ddata->tmpl.size <= idx)
833                 return (0);
834         if ((len = strlen(ddata->tmpl.container[idx])) == 0)
835                 return (0);
836         if (!cpp_demangle_push_str(ddata, ddata->tmpl.container[idx], len))
837                 return (0);
838
839         ++ddata->cur;
840
841         return (1);
842 }
843
844 static int
845 cpp_demangle_read_array(struct cpp_demangle_data *ddata)
846 {
847         size_t i, num_len, exp_len, p_idx, idx;
848         const char *num;
849         char *exp;
850
851         if (ddata == NULL || *(++ddata->cur) == '\0')
852                 return (0);
853
854         if (*ddata->cur == '_') {
855                 if (*(++ddata->cur) == '\0')
856                         return (0);
857
858                 if (!cpp_demangle_read_type(ddata, 0))
859                         return (0);
860
861                 if (!cpp_demangle_push_str(ddata, "[]", 2))
862                         return (0);
863         } else {
864                 if (ELFTC_ISDIGIT(*ddata->cur) != 0) {
865                         num = ddata->cur;
866                         while (ELFTC_ISDIGIT(*ddata->cur) != 0)
867                                 ++ddata->cur;
868                         if (*ddata->cur != '_')
869                                 return (0);
870                         num_len = ddata->cur - num;
871                         assert(num_len > 0);
872                         if (*(++ddata->cur) == '\0')
873                                 return (0);
874                         if (!cpp_demangle_read_type(ddata, 0))
875                                 return (0);
876                         if (!cpp_demangle_push_str(ddata, "[", 1))
877                                 return (0);
878                         if (!cpp_demangle_push_str(ddata, num, num_len))
879                                 return (0);
880                         if (!cpp_demangle_push_str(ddata, "]", 1))
881                                 return (0);
882                 } else {
883                         p_idx = ddata->output.size;
884                         if (!cpp_demangle_read_expression(ddata))
885                                 return (0);
886                         if ((exp = vector_str_substr(&ddata->output, p_idx,
887                                  ddata->output.size - 1, &exp_len)) == NULL)
888                                 return (0);
889                         idx = ddata->output.size;
890                         for (i = p_idx; i < idx; ++i)
891                                 if (!vector_str_pop(&ddata->output)) {
892                                         free(exp);
893                                         return (0);
894                                 }
895                         if (*ddata->cur != '_') {
896                                 free(exp);
897                                 return (0);
898                         }
899                         ++ddata->cur;
900                         if (*ddata->cur == '\0') {
901                                 free(exp);
902                                 return (0);
903                         }
904                         if (!cpp_demangle_read_type(ddata, 0)) {
905                                 free(exp);
906                                 return (0);
907                         }
908                         if (!cpp_demangle_push_str(ddata, "[", 1)) {
909                                 free(exp);
910                                 return (0);
911                         }
912                         if (!cpp_demangle_push_str(ddata, exp, exp_len)) {
913                                 free(exp);
914                                 return (0);
915                         }
916                         if (!cpp_demangle_push_str(ddata, "]", 1)) {
917                                 free(exp);
918                                 return (0);
919                         }
920                         free(exp);
921                 }
922         }
923
924         return (1);
925 }
926
927 static int
928 cpp_demangle_read_expr_primary(struct cpp_demangle_data *ddata)
929 {
930         const char *num;
931
932         if (ddata == NULL || *(++ddata->cur) == '\0')
933                 return (0);
934
935         if (*ddata->cur == '_' && *(ddata->cur + 1) == 'Z') {
936                 ddata->cur += 2;
937                 if (*ddata->cur == '\0')
938                         return (0);
939                 if (!cpp_demangle_read_encoding(ddata))
940                         return (0);
941                 ++ddata->cur;
942                 return (1);
943         }
944
945         switch (*ddata->cur) {
946         case 'b':
947                 switch (*(++ddata->cur)) {
948                 case '0':
949                         return (cpp_demangle_push_str(ddata, "false", 5));
950                 case '1':
951                         return (cpp_demangle_push_str(ddata, "true", 4));
952                 default:
953                         return (0);
954                 };
955
956         case 'd':
957                 ++ddata->cur;
958                 return (cpp_demangle_push_fp(ddata, decode_fp_to_double));
959
960         case 'e':
961                 ++ddata->cur;
962                 if (sizeof(long double) == 10)
963                         return (cpp_demangle_push_fp(ddata,
964                             decode_fp_to_double));
965                 return (cpp_demangle_push_fp(ddata, decode_fp_to_float80));
966
967         case 'f':
968                 ++ddata->cur;
969                 return (cpp_demangle_push_fp(ddata, decode_fp_to_float));
970
971         case 'g':
972                 ++ddata->cur;
973                 if (sizeof(long double) == 16)
974                         return (cpp_demangle_push_fp(ddata,
975                             decode_fp_to_double));
976                 return (cpp_demangle_push_fp(ddata, decode_fp_to_float128));
977
978         case 'i':
979         case 'j':
980         case 'l':
981         case 'm':
982         case 'n':
983         case 's':
984         case 't':
985         case 'x':
986         case 'y':
987                 if (*(++ddata->cur) == 'n') {
988                         if (!cpp_demangle_push_str(ddata, "-", 1))
989                                 return (0);
990                         ++ddata->cur;
991                 }
992                 num = ddata->cur;
993                 while (*ddata->cur != 'E') {
994                         if (!ELFTC_ISDIGIT(*ddata->cur))
995                                 return (0);
996                         ++ddata->cur;
997                 }
998                 ++ddata->cur;
999                 return (cpp_demangle_push_str(ddata, num, ddata->cur - num));
1000
1001         default:
1002                 return (0);
1003         };
1004 }
1005
1006 static int
1007 cpp_demangle_read_expression(struct cpp_demangle_data *ddata)
1008 {
1009
1010         if (ddata == NULL || *ddata->cur == '\0')
1011                 return (0);
1012
1013         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
1014         case SIMPLE_HASH('s', 't'):
1015                 ddata->cur += 2;
1016                 return (cpp_demangle_read_type(ddata, 0));
1017
1018         case SIMPLE_HASH('s', 'r'):
1019                 ddata->cur += 2;
1020                 if (!cpp_demangle_read_type(ddata, 0))
1021                         return (0);
1022                 if (!cpp_demangle_read_uqname(ddata))
1023                         return (0);
1024                 if (*ddata->cur == 'I')
1025                         return (cpp_demangle_read_tmpl_args(ddata));
1026                 return (1);
1027
1028         case SIMPLE_HASH('a', 'a'):
1029                 /* operator && */
1030                 ddata->cur += 2;
1031                 return (cpp_demangle_read_expression_binary(ddata, "&&", 2));
1032
1033         case SIMPLE_HASH('a', 'd'):
1034                 /* operator & (unary) */
1035                 ddata->cur += 2;
1036                 return (cpp_demangle_read_expression_unary(ddata, "&", 1));
1037
1038         case SIMPLE_HASH('a', 'n'):
1039                 /* operator & */
1040                 ddata->cur += 2;
1041                 return (cpp_demangle_read_expression_binary(ddata, "&", 1));
1042
1043         case SIMPLE_HASH('a', 'N'):
1044                 /* operator &= */
1045                 ddata->cur += 2;
1046                 return (cpp_demangle_read_expression_binary(ddata, "&=", 2));
1047
1048         case SIMPLE_HASH('a', 'S'):
1049                 /* operator = */
1050                 ddata->cur += 2;
1051                 return (cpp_demangle_read_expression_binary(ddata, "=", 1));
1052
1053         case SIMPLE_HASH('c', 'l'):
1054                 /* operator () */
1055                 ddata->cur += 2;
1056                 return (cpp_demangle_read_expression_binary(ddata, "()", 2));
1057
1058         case SIMPLE_HASH('c', 'm'):
1059                 /* operator , */
1060                 ddata->cur += 2;
1061                 return (cpp_demangle_read_expression_binary(ddata, ",", 1));
1062
1063         case SIMPLE_HASH('c', 'o'):
1064                 /* operator ~ */
1065                 ddata->cur += 2;
1066                 return (cpp_demangle_read_expression_binary(ddata, "~", 1));
1067
1068         case SIMPLE_HASH('c', 'v'):
1069                 /* operator (cast) */
1070                 ddata->cur += 2;
1071                 return (cpp_demangle_read_expression_binary(ddata, "(cast)", 6));
1072
1073         case SIMPLE_HASH('d', 'a'):
1074                 /* operator delete [] */
1075                 ddata->cur += 2;
1076                 return (cpp_demangle_read_expression_unary(ddata, "delete []", 9));
1077
1078         case SIMPLE_HASH('d', 'e'):
1079                 /* operator * (unary) */
1080                 ddata->cur += 2;
1081                 return (cpp_demangle_read_expression_unary(ddata, "*", 1));
1082
1083         case SIMPLE_HASH('d', 'l'):
1084                 /* operator delete */
1085                 ddata->cur += 2;
1086                 return (cpp_demangle_read_expression_unary(ddata, "delete", 6));
1087
1088         case SIMPLE_HASH('d', 'v'):
1089                 /* operator / */
1090                 ddata->cur += 2;
1091                 return (cpp_demangle_read_expression_binary(ddata, "/", 1));
1092
1093         case SIMPLE_HASH('d', 'V'):
1094                 /* operator /= */
1095                 ddata->cur += 2;
1096                 return (cpp_demangle_read_expression_binary(ddata, "/=", 2));
1097
1098         case SIMPLE_HASH('e', 'o'):
1099                 /* operator ^ */
1100                 ddata->cur += 2;
1101                 return (cpp_demangle_read_expression_binary(ddata, "^", 1));
1102
1103         case SIMPLE_HASH('e', 'O'):
1104                 /* operator ^= */
1105                 ddata->cur += 2;
1106                 return (cpp_demangle_read_expression_binary(ddata, "^=", 2));
1107
1108         case SIMPLE_HASH('e', 'q'):
1109                 /* operator == */
1110                 ddata->cur += 2;
1111                 return (cpp_demangle_read_expression_binary(ddata, "==", 2));
1112
1113         case SIMPLE_HASH('g', 'e'):
1114                 /* operator >= */
1115                 ddata->cur += 2;
1116                 return (cpp_demangle_read_expression_binary(ddata, ">=", 2));
1117
1118         case SIMPLE_HASH('g', 't'):
1119                 /* operator > */
1120                 ddata->cur += 2;
1121                 return (cpp_demangle_read_expression_binary(ddata, ">", 1));
1122
1123         case SIMPLE_HASH('i', 'x'):
1124                 /* operator [] */
1125                 ddata->cur += 2;
1126                 return (cpp_demangle_read_expression_binary(ddata, "[]", 2));
1127
1128         case SIMPLE_HASH('l', 'e'):
1129                 /* operator <= */
1130                 ddata->cur += 2;
1131                 return (cpp_demangle_read_expression_binary(ddata, "<=", 2));
1132
1133         case SIMPLE_HASH('l', 's'):
1134                 /* operator << */
1135                 ddata->cur += 2;
1136                 return (cpp_demangle_read_expression_binary(ddata, "<<", 2));
1137
1138         case SIMPLE_HASH('l', 'S'):
1139                 /* operator <<= */
1140                 ddata->cur += 2;
1141                 return (cpp_demangle_read_expression_binary(ddata, "<<=", 3));
1142
1143         case SIMPLE_HASH('l', 't'):
1144                 /* operator < */
1145                 ddata->cur += 2;
1146                 return (cpp_demangle_read_expression_binary(ddata, "<", 1));
1147
1148         case SIMPLE_HASH('m', 'i'):
1149                 /* operator - */
1150                 ddata->cur += 2;
1151                 return (cpp_demangle_read_expression_binary(ddata, "-", 1));
1152
1153         case SIMPLE_HASH('m', 'I'):
1154                 /* operator -= */
1155                 ddata->cur += 2;
1156                 return (cpp_demangle_read_expression_binary(ddata, "-=", 2));
1157
1158         case SIMPLE_HASH('m', 'l'):
1159                 /* operator * */
1160                 ddata->cur += 2;
1161                 return (cpp_demangle_read_expression_binary(ddata, "*", 1));
1162
1163         case SIMPLE_HASH('m', 'L'):
1164                 /* operator *= */
1165                 ddata->cur += 2;
1166                 return (cpp_demangle_read_expression_binary(ddata, "*=", 2));
1167
1168         case SIMPLE_HASH('m', 'm'):
1169                 /* operator -- */
1170                 ddata->cur += 2;
1171                 return (cpp_demangle_read_expression_binary(ddata, "--", 2));
1172
1173         case SIMPLE_HASH('n', 'a'):
1174                 /* operator new[] */
1175                 ddata->cur += 2;
1176                 return (cpp_demangle_read_expression_unary(ddata, "new []", 6));
1177
1178         case SIMPLE_HASH('n', 'e'):
1179                 /* operator != */
1180                 ddata->cur += 2;
1181                 return (cpp_demangle_read_expression_binary(ddata, "!=", 2));
1182
1183         case SIMPLE_HASH('n', 'g'):
1184                 /* operator - (unary) */
1185                 ddata->cur += 2;
1186                 return (cpp_demangle_read_expression_unary(ddata, "-", 1));
1187
1188         case SIMPLE_HASH('n', 't'):
1189                 /* operator ! */
1190                 ddata->cur += 2;
1191                 return (cpp_demangle_read_expression_binary(ddata, "!", 1));
1192
1193         case SIMPLE_HASH('n', 'w'):
1194                 /* operator new */
1195                 ddata->cur += 2;
1196                 return (cpp_demangle_read_expression_unary(ddata, "new", 3));
1197
1198         case SIMPLE_HASH('o', 'o'):
1199                 /* operator || */
1200                 ddata->cur += 2;
1201                 return (cpp_demangle_read_expression_binary(ddata, "||", 2));
1202
1203         case SIMPLE_HASH('o', 'r'):
1204                 /* operator | */
1205                 ddata->cur += 2;
1206                 return (cpp_demangle_read_expression_binary(ddata, "|", 1));
1207
1208         case SIMPLE_HASH('o', 'R'):
1209                 /* operator |= */
1210                 ddata->cur += 2;
1211                 return (cpp_demangle_read_expression_binary(ddata, "|=", 2));
1212
1213         case SIMPLE_HASH('p', 'l'):
1214                 /* operator + */
1215                 ddata->cur += 2;
1216                 return (cpp_demangle_read_expression_binary(ddata, "+", 1));
1217
1218         case SIMPLE_HASH('p', 'L'):
1219                 /* operator += */
1220                 ddata->cur += 2;
1221                 return (cpp_demangle_read_expression_binary(ddata, "+=", 2));
1222
1223         case SIMPLE_HASH('p', 'm'):
1224                 /* operator ->* */
1225                 ddata->cur += 2;
1226                 return (cpp_demangle_read_expression_binary(ddata, "->*", 3));
1227
1228         case SIMPLE_HASH('p', 'p'):
1229                 /* operator ++ */
1230                 ddata->cur += 2;
1231                 return (cpp_demangle_read_expression_binary(ddata, "++", 2));
1232
1233         case SIMPLE_HASH('p', 's'):
1234                 /* operator + (unary) */
1235                 ddata->cur += 2;
1236                 return (cpp_demangle_read_expression_unary(ddata, "+", 1));
1237
1238         case SIMPLE_HASH('p', 't'):
1239                 /* operator -> */
1240                 ddata->cur += 2;
1241                 return (cpp_demangle_read_expression_binary(ddata, "->", 2));
1242
1243         case SIMPLE_HASH('q', 'u'):
1244                 /* operator ? */
1245                 ddata->cur += 2;
1246                 return (cpp_demangle_read_expression_trinary(ddata, "?", 1,
1247                     ":", 1));
1248
1249         case SIMPLE_HASH('r', 'm'):
1250                 /* operator % */
1251                 ddata->cur += 2;
1252                 return (cpp_demangle_read_expression_binary(ddata, "%", 1));
1253
1254         case SIMPLE_HASH('r', 'M'):
1255                 /* operator %= */
1256                 ddata->cur += 2;
1257                 return (cpp_demangle_read_expression_binary(ddata, "%=", 2));
1258
1259         case SIMPLE_HASH('r', 's'):
1260                 /* operator >> */
1261                 ddata->cur += 2;
1262                 return (cpp_demangle_read_expression_binary(ddata, ">>", 2));
1263
1264         case SIMPLE_HASH('r', 'S'):
1265                 /* operator >>= */
1266                 ddata->cur += 2;
1267                 return (cpp_demangle_read_expression_binary(ddata, ">>=", 3));
1268
1269         case SIMPLE_HASH('r', 'z'):
1270                 /* operator sizeof */
1271                 ddata->cur += 2;
1272                 return (cpp_demangle_read_expression_unary(ddata, "sizeof", 6));
1273
1274         case SIMPLE_HASH('s', 'v'):
1275                 /* operator sizeof */
1276                 ddata->cur += 2;
1277                 return (cpp_demangle_read_expression_unary(ddata, "sizeof", 6));
1278         };
1279
1280         switch (*ddata->cur) {
1281         case 'L':
1282                 return (cpp_demangle_read_expr_primary(ddata));
1283         case 'T':
1284                 return (cpp_demangle_read_tmpl_param(ddata));
1285         };
1286
1287         return (0);
1288 }
1289
1290 static int
1291 cpp_demangle_read_expression_binary(struct cpp_demangle_data *ddata,
1292     const char *name, size_t len)
1293 {
1294
1295         if (ddata == NULL || name == NULL || len == 0)
1296                 return (0);
1297         if (!cpp_demangle_read_expression(ddata))
1298                 return (0);
1299         if (!cpp_demangle_push_str(ddata, name, len))
1300                 return (0);
1301
1302         return (cpp_demangle_read_expression(ddata));
1303 }
1304
1305 static int
1306 cpp_demangle_read_expression_unary(struct cpp_demangle_data *ddata,
1307     const char *name, size_t len)
1308 {
1309
1310         if (ddata == NULL || name == NULL || len == 0)
1311                 return (0);
1312         if (!cpp_demangle_read_expression(ddata))
1313                 return (0);
1314
1315         return (cpp_demangle_push_str(ddata, name, len));
1316 }
1317
1318 static int
1319 cpp_demangle_read_expression_trinary(struct cpp_demangle_data *ddata,
1320     const char *name1, size_t len1, const char *name2, size_t len2)
1321 {
1322
1323         if (ddata == NULL || name1 == NULL || len1 == 0 || name2 == NULL ||
1324             len2 == 0)
1325                 return (0);
1326
1327         if (!cpp_demangle_read_expression(ddata))
1328                 return (0);
1329         if (!cpp_demangle_push_str(ddata, name1, len1))
1330                 return (0);
1331         if (!cpp_demangle_read_expression(ddata))
1332                 return (0);
1333         if (!cpp_demangle_push_str(ddata, name2, len2))
1334                 return (0);
1335
1336         return (cpp_demangle_read_expression(ddata));
1337 }
1338
1339 static int
1340 cpp_demangle_read_function(struct cpp_demangle_data *ddata, int *ext_c,
1341     struct vector_type_qualifier *v)
1342 {
1343         size_t class_type_size, class_type_len, limit;
1344         const char *class_type;
1345
1346         if (ddata == NULL || *ddata->cur != 'F' || v == NULL)
1347                 return (0);
1348
1349         ++ddata->cur;
1350         if (*ddata->cur == 'Y') {
1351                 if (ext_c != NULL)
1352                         *ext_c = 1;
1353                 ++ddata->cur;
1354         }
1355         if (!cpp_demangle_read_type(ddata, 0))
1356                 return (0);
1357         if (*ddata->cur != 'E') {
1358                 if (!cpp_demangle_push_str(ddata, "(", 1))
1359                         return (0);
1360                 if (vector_read_cmd_find(&ddata->cmd, READ_PTRMEM)) {
1361                         if ((class_type_size = ddata->class_type.size) == 0)
1362                                 return (0);
1363                         class_type =
1364                             ddata->class_type.container[class_type_size - 1];
1365                         if (class_type == NULL)
1366                                 return (0);
1367                         if ((class_type_len = strlen(class_type)) == 0)
1368                                 return (0);
1369                         if (!cpp_demangle_push_str(ddata, class_type,
1370                             class_type_len))
1371                                 return (0);
1372                         if (!cpp_demangle_push_str(ddata, "::*", 3))
1373                                 return (0);
1374                         ++ddata->func_type;
1375                 } else {
1376                         if (!cpp_demangle_push_type_qualifier(ddata, v,
1377                             (const char *) NULL))
1378                                 return (0);
1379                         vector_type_qualifier_dest(v);
1380                         if (!vector_type_qualifier_init(v))
1381                                 return (0);
1382                 }
1383
1384                 if (!cpp_demangle_push_str(ddata, ")(", 2))
1385                         return (0);
1386
1387                 limit = 0;
1388                 for (;;) {
1389                         if (!cpp_demangle_read_type(ddata, 0))
1390                                 return (0);
1391                         if (*ddata->cur == 'E')
1392                                 break;
1393                         if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1394                                 return (0);
1395                 }
1396
1397                 if (vector_read_cmd_find(&ddata->cmd, READ_PTRMEM) == 1) {
1398                         if (!cpp_demangle_push_type_qualifier(ddata, v,
1399                             (const char *) NULL))
1400                                 return (0);
1401                         vector_type_qualifier_dest(v);
1402                         if (!vector_type_qualifier_init(v))
1403                                 return (0);
1404                 }
1405
1406                 if (!cpp_demangle_push_str(ddata, ")", 1))
1407                         return (0);
1408         }
1409
1410         ++ddata->cur;
1411
1412         return (1);
1413 }
1414
1415 /* read encoding, encoding are function name, data name, special-name */
1416 static int
1417 cpp_demangle_read_encoding(struct cpp_demangle_data *ddata)
1418 {
1419
1420         if (ddata == NULL || *ddata->cur == '\0')
1421                 return (0);
1422
1423         /* special name */
1424         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
1425         case SIMPLE_HASH('G', 'V'):
1426                 /* sentry object for 1 time init */
1427                 if (!cpp_demangle_push_str(ddata, "guard variable for ", 20))
1428                         return (0);
1429                 ddata->cur += 2;
1430                 break;
1431
1432         case SIMPLE_HASH('T', 'c'):
1433                 /* virtual function covariant override thunk */
1434                 if (!cpp_demangle_push_str(ddata,
1435                     "virtual function covariant override ", 36))
1436                         return (0);
1437                 ddata->cur += 2;
1438                 if (*ddata->cur == '\0')
1439                         return (0);
1440                 if (!cpp_demangle_read_offset(ddata))
1441                         return (0);
1442                 if (!cpp_demangle_read_offset(ddata))
1443                         return (0);
1444                 return (cpp_demangle_read_encoding(ddata));
1445
1446         case SIMPLE_HASH('T', 'D'):
1447                 /* typeinfo common proxy */
1448                 break;
1449
1450         case SIMPLE_HASH('T', 'h'):
1451                 /* virtual function non-virtual override thunk */
1452                 if (cpp_demangle_push_str(ddata,
1453                     "virtual function non-virtual override ", 38) == 0)
1454                         return (0);
1455                 ddata->cur += 2;
1456                 if (*ddata->cur == '\0')
1457                         return (0);
1458                 if (!cpp_demangle_read_nv_offset(ddata))
1459                         return (0);
1460                 return (cpp_demangle_read_encoding(ddata));
1461
1462         case SIMPLE_HASH('T', 'I'):
1463                 /* typeinfo structure */
1464                 /* FALLTHROUGH */
1465         case SIMPLE_HASH('T', 'S'):
1466                 /* RTTI name (NTBS) */
1467                 if (!cpp_demangle_push_str(ddata, "typeinfo for ", 14))
1468                         return (0);
1469                 ddata->cur += 2;
1470                 if (*ddata->cur == '\0')
1471                         return (0);
1472                 return (cpp_demangle_read_type(ddata, 1));
1473
1474         case SIMPLE_HASH('T', 'T'):
1475                 /* VTT table */
1476                 if (!cpp_demangle_push_str(ddata, "VTT for ", 8))
1477                         return (0);
1478                 ddata->cur += 2;
1479                 return (cpp_demangle_read_type(ddata, 1));
1480
1481         case SIMPLE_HASH('T', 'v'):
1482                 /* virtual function virtual override thunk */
1483                 if (!cpp_demangle_push_str(ddata,
1484                     "virtual function virtual override ", 34))
1485                         return (0);
1486                 ddata->cur += 2;
1487                 if (*ddata->cur == '\0')
1488                         return (0);
1489                 if (!cpp_demangle_read_v_offset(ddata))
1490                         return (0);
1491                 return (cpp_demangle_read_encoding(ddata));
1492
1493         case SIMPLE_HASH('T', 'V'):
1494                 /* virtual table */
1495                 if (!cpp_demangle_push_str(ddata, "vtable for ", 12))
1496                         return (0);
1497                 ddata->cur += 2;
1498                 if (*ddata->cur == '\0')
1499                         return (0);
1500                 return (cpp_demangle_read_type(ddata, 1));
1501         };
1502
1503         return (cpp_demangle_read_name(ddata));
1504 }
1505
1506 static int
1507 cpp_demangle_read_local_name(struct cpp_demangle_data *ddata)
1508 {
1509         size_t limit;
1510
1511         if (ddata == NULL)
1512                 return (0);
1513         if (*(++ddata->cur) == '\0')
1514                 return (0);
1515         if (!cpp_demangle_read_encoding(ddata))
1516                 return (0);
1517
1518         limit = 0;
1519         for (;;) {
1520                 if (!cpp_demangle_read_type(ddata, 1))
1521                         return (0);
1522                 if (*ddata->cur == 'E')
1523                         break;
1524                 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1525                         return (0);
1526         }
1527         if (*(++ddata->cur) == '\0')
1528                 return (0);
1529         if (ddata->paren == true) {
1530                 if (!cpp_demangle_push_str(ddata, ")", 1))
1531                         return (0);
1532                 ddata->paren = false;
1533         }
1534         if (*ddata->cur == 's')
1535                 ++ddata->cur;
1536         else {
1537                 if (!cpp_demangle_push_str(ddata, "::", 2))
1538                         return (0);
1539                 if (!cpp_demangle_read_name(ddata))
1540                         return (0);
1541         }
1542         if (*ddata->cur == '_') {
1543                 ++ddata->cur;
1544                 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
1545                         ++ddata->cur;
1546         }
1547
1548         return (1);
1549 }
1550
1551 static int
1552 cpp_demangle_read_name(struct cpp_demangle_data *ddata)
1553 {
1554         struct vector_str *output, v;
1555         size_t p_idx, subst_str_len;
1556         int rtn;
1557         char *subst_str;
1558
1559         if (ddata == NULL || *ddata->cur == '\0')
1560                 return (0);
1561
1562         output = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
1563
1564         subst_str = NULL;
1565
1566         switch (*ddata->cur) {
1567         case 'S':
1568                 return (cpp_demangle_read_subst(ddata));
1569         case 'N':
1570                 return (cpp_demangle_read_nested_name(ddata));
1571         case 'Z':
1572                 return (cpp_demangle_read_local_name(ddata));
1573         };
1574
1575         if (!vector_str_init(&v))
1576                 return (0);
1577
1578         p_idx = output->size;
1579         rtn = 0;
1580         if (!cpp_demangle_read_uqname(ddata))
1581                 goto clean;
1582         if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
1583             &subst_str_len)) == NULL)
1584                 goto clean;
1585         if (subst_str_len > 8 && strstr(subst_str, "operator") != NULL) {
1586                 rtn = 1;
1587                 goto clean;
1588         }
1589         if (!vector_str_push(&v, subst_str, subst_str_len))
1590                 goto clean;
1591         if (!cpp_demangle_push_subst_v(ddata, &v))
1592                 goto clean;
1593
1594         if (*ddata->cur == 'I') {
1595                 p_idx = output->size;
1596                 if (!cpp_demangle_read_tmpl_args(ddata))
1597                         goto clean;
1598                 free(subst_str);
1599                 if ((subst_str = vector_str_substr(output, p_idx,
1600                     output->size - 1, &subst_str_len)) == NULL)
1601                         goto clean;
1602                 if (!vector_str_push(&v, subst_str, subst_str_len))
1603                         goto clean;
1604                 if (!cpp_demangle_push_subst_v(ddata, &v))
1605                         goto clean;
1606         }
1607
1608         rtn = 1;
1609
1610 clean:
1611         free(subst_str);
1612         vector_str_dest(&v);
1613
1614         return (rtn);
1615 }
1616
1617 static int
1618 cpp_demangle_read_nested_name(struct cpp_demangle_data *ddata)
1619 {
1620         struct vector_str *output, v;
1621         size_t limit, p_idx, subst_str_len;
1622         int rtn;
1623         char *subst_str;
1624
1625         if (ddata == NULL || *ddata->cur != 'N')
1626                 return (0);
1627         if (*(++ddata->cur) == '\0')
1628                 return (0);
1629
1630         while (*ddata->cur == 'r' || *ddata->cur == 'V' ||
1631             *ddata->cur == 'K') {
1632                 switch (*ddata->cur) {
1633                 case 'r':
1634                         ddata->mem_rst = true;
1635                         break;
1636                 case 'V':
1637                         ddata->mem_vat = true;
1638                         break;
1639                 case 'K':
1640                         ddata->mem_cst = true;
1641                         break;
1642                 };
1643                 ++ddata->cur;
1644         }
1645
1646         output = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
1647         if (!vector_str_init(&v))
1648                 return (0);
1649
1650         rtn = 0;
1651         limit = 0;
1652         for (;;) {
1653                 p_idx = output->size;
1654                 switch (*ddata->cur) {
1655                 case 'I':
1656                         if (!cpp_demangle_read_tmpl_args(ddata))
1657                                 goto clean;
1658                         break;
1659                 case 'S':
1660                         if (!cpp_demangle_read_subst(ddata))
1661                                 goto clean;
1662                         break;
1663                 case 'T':
1664                         if (!cpp_demangle_read_tmpl_param(ddata))
1665                                 goto clean;
1666                         break;
1667                 default:
1668                         if (!cpp_demangle_read_uqname(ddata))
1669                                 goto clean;
1670                 };
1671
1672                 if ((subst_str = vector_str_substr(output, p_idx,
1673                     output->size - 1, &subst_str_len)) == NULL)
1674                         goto clean;
1675                 if (!vector_str_push(&v, subst_str, subst_str_len)) {
1676                         free(subst_str);
1677                         goto clean;
1678                 }
1679                 free(subst_str);
1680
1681                 if (!cpp_demangle_push_subst_v(ddata, &v))
1682                         goto clean;
1683                 if (*ddata->cur == 'E')
1684                         break;
1685                 else if (*ddata->cur != 'I' &&
1686                     *ddata->cur != 'C' && *ddata->cur != 'D') {
1687                         if (!cpp_demangle_push_str(ddata, "::", 2))
1688                                 goto clean;
1689                         if (!vector_str_push(&v, "::", 2))
1690                                 goto clean;
1691                 }
1692                 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1693                         goto clean;
1694         }
1695
1696         ++ddata->cur;
1697         rtn = 1;
1698
1699 clean:
1700         vector_str_dest(&v);
1701
1702         return (rtn);
1703 }
1704
1705 /*
1706  * read number
1707  * number ::= [n] <decimal>
1708  */
1709 static int
1710 cpp_demangle_read_number(struct cpp_demangle_data *ddata, long *rtn)
1711 {
1712         long len, negative_factor;
1713
1714         if (ddata == NULL || rtn == NULL)
1715                 return (0);
1716
1717         negative_factor = 1;
1718         if (*ddata->cur == 'n') {
1719                 negative_factor = -1;
1720
1721                 ++ddata->cur;
1722         }
1723         if (ELFTC_ISDIGIT(*ddata->cur) == 0)
1724                 return (0);
1725
1726         errno = 0;
1727         if ((len = strtol(ddata->cur, (char **) NULL, 10)) == 0 &&
1728             errno != 0)
1729                 return (0);
1730
1731         while (ELFTC_ISDIGIT(*ddata->cur) != 0)
1732                 ++ddata->cur;
1733
1734         assert(len >= 0);
1735         assert(negative_factor == 1 || negative_factor == -1);
1736
1737         *rtn = len * negative_factor;
1738
1739         return (1);
1740 }
1741
1742 static int
1743 cpp_demangle_read_nv_offset(struct cpp_demangle_data *ddata)
1744 {
1745
1746         if (ddata == NULL)
1747                 return (0);
1748
1749         if (!cpp_demangle_push_str(ddata, "offset : ", 9))
1750                 return (0);
1751
1752         return (cpp_demangle_read_offset_number(ddata));
1753 }
1754
1755 /* read offset, offset are nv-offset, v-offset */
1756 static int
1757 cpp_demangle_read_offset(struct cpp_demangle_data *ddata)
1758 {
1759
1760         if (ddata == NULL)
1761                 return (0);
1762
1763         if (*ddata->cur == 'h') {
1764                 ++ddata->cur;
1765                 return (cpp_demangle_read_nv_offset(ddata));
1766         } else if (*ddata->cur == 'v') {
1767                 ++ddata->cur;
1768                 return (cpp_demangle_read_v_offset(ddata));
1769         }
1770
1771         return (0);
1772 }
1773
1774 static int
1775 cpp_demangle_read_offset_number(struct cpp_demangle_data *ddata)
1776 {
1777         bool negative;
1778         const char *start;
1779
1780         if (ddata == NULL || *ddata->cur == '\0')
1781                 return (0);
1782
1783         /* offset could be negative */
1784         if (*ddata->cur == 'n') {
1785                 negative = true;
1786                 start = ddata->cur + 1;
1787         } else {
1788                 negative = false;
1789                 start = ddata->cur;
1790         }
1791
1792         while (*ddata->cur != '_')
1793                 ++ddata->cur;
1794
1795         if (negative && !cpp_demangle_push_str(ddata, "-", 1))
1796                 return (0);
1797
1798         assert(start != NULL);
1799
1800         if (!cpp_demangle_push_str(ddata, start, ddata->cur - start))
1801                 return (0);
1802         if (!cpp_demangle_push_str(ddata, " ", 1))
1803                 return (0);
1804
1805         ++ddata->cur;
1806
1807         return (1);
1808 }
1809
1810 static int
1811 cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *ddata)
1812 {
1813         size_t class_type_len, i, idx, p_idx;
1814         int p_func_type, rtn;
1815         char *class_type;
1816
1817         if (ddata == NULL || *ddata->cur != 'M' || *(++ddata->cur) == '\0')
1818                 return (0);
1819
1820         p_idx = ddata->output.size;
1821         if (!cpp_demangle_read_type(ddata, 0))
1822                 return (0);
1823
1824         if ((class_type = vector_str_substr(&ddata->output, p_idx,
1825             ddata->output.size - 1, &class_type_len)) == NULL)
1826                 return (0);
1827
1828         rtn = 0;
1829         idx = ddata->output.size;
1830         for (i = p_idx; i < idx; ++i)
1831                 if (!vector_str_pop(&ddata->output))
1832                         goto clean1;
1833
1834         if (!vector_read_cmd_push(&ddata->cmd, READ_PTRMEM))
1835                 goto clean1;
1836
1837         if (!vector_str_push(&ddata->class_type, class_type, class_type_len))
1838                 goto clean2;
1839
1840         p_func_type = ddata->func_type;
1841         if (!cpp_demangle_read_type(ddata, 0))
1842                 goto clean3;
1843
1844         if (p_func_type == ddata->func_type) {
1845                 if (!cpp_demangle_push_str(ddata, " ", 1))
1846                         goto clean3;
1847                 if (!cpp_demangle_push_str(ddata, class_type, class_type_len))
1848                         goto clean3;
1849                 if (!cpp_demangle_push_str(ddata, "::*", 3))
1850                         goto clean3;
1851         }
1852
1853         rtn = 1;
1854 clean3:
1855         if (!vector_str_pop(&ddata->class_type))
1856                 rtn = 0;
1857 clean2:
1858         if (!vector_read_cmd_pop(&ddata->cmd))
1859                 rtn = 0;
1860 clean1:
1861         free(class_type);
1862
1863         return (rtn);
1864 }
1865
1866 /* read source-name, source-name is <len> <ID> */
1867 static int
1868 cpp_demangle_read_sname(struct cpp_demangle_data *ddata)
1869 {
1870         long len;
1871
1872         if (ddata == NULL || cpp_demangle_read_number(ddata, &len) == 0 ||
1873             len <= 0 || cpp_demangle_push_str(ddata, ddata->cur, len) == 0)
1874                 return (0);
1875
1876         assert(ddata->output.size > 0);
1877         if (vector_read_cmd_find(&ddata->cmd, READ_TMPL) == 0)
1878                 ddata->last_sname =
1879                     ddata->output.container[ddata->output.size - 1];
1880
1881         ddata->cur += len;
1882
1883         return (1);
1884 }
1885
1886 static int
1887 cpp_demangle_read_subst(struct cpp_demangle_data *ddata)
1888 {
1889         long nth;
1890
1891         if (ddata == NULL || *ddata->cur == '\0')
1892                 return (0);
1893
1894         /* abbreviations of the form Sx */
1895         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
1896         case SIMPLE_HASH('S', 'a'):
1897                 /* std::allocator */
1898                 if (cpp_demangle_push_str(ddata, "std::allocator", 14) == 0)
1899                         return (0);
1900                 ddata->cur += 2;
1901                 if (*ddata->cur == 'I')
1902                         return (cpp_demangle_read_subst_stdtmpl(ddata,
1903                             "std::allocator", 14));
1904                 return (1);
1905
1906         case SIMPLE_HASH('S', 'b'):
1907                 /* std::basic_string */
1908                 if (!cpp_demangle_push_str(ddata, "std::basic_string", 17))
1909                         return (0);
1910                 ddata->cur += 2;
1911                 if (*ddata->cur == 'I')
1912                         return (cpp_demangle_read_subst_stdtmpl(ddata,
1913                             "std::basic_string", 17));
1914                 return (1);
1915
1916         case SIMPLE_HASH('S', 'd'):
1917                 /* std::basic_iostream<char, std::char_traits<char> > */
1918                 if (!cpp_demangle_push_str(ddata, "std::iostream", 19))
1919                         return (0);
1920                 ddata->last_sname = "iostream";
1921                 ddata->cur += 2;
1922                 if (*ddata->cur == 'I')
1923                         return (cpp_demangle_read_subst_stdtmpl(ddata,
1924                             "std::iostream", 19));
1925                 return (1);
1926
1927         case SIMPLE_HASH('S', 'i'):
1928                 /* std::basic_istream<char, std::char_traits<char> > */
1929                 if (!cpp_demangle_push_str(ddata, "std::istream", 18))
1930                         return (0);
1931                 ddata->last_sname = "istream";
1932                 ddata->cur += 2;
1933                 if (*ddata->cur == 'I')
1934                         return (cpp_demangle_read_subst_stdtmpl(ddata,
1935                             "std::istream", 18));
1936                 return (1);
1937
1938         case SIMPLE_HASH('S', 'o'):
1939                 /* std::basic_ostream<char, std::char_traits<char> > */
1940                 if (!cpp_demangle_push_str(ddata, "std::ostream", 18))
1941                         return (0);
1942                 ddata->last_sname = "istream";
1943                 ddata->cur += 2;
1944                 if (*ddata->cur == 'I')
1945                         return (cpp_demangle_read_subst_stdtmpl(ddata,
1946                             "std::ostream", 18));
1947                 return (1);
1948
1949         case SIMPLE_HASH('S', 's'):
1950                 /*
1951                  * std::basic_string<char, std::char_traits<char>,
1952                  * std::allocator<char> >
1953                  *
1954                  * a.k.a std::string
1955                  */
1956                 if (!cpp_demangle_push_str(ddata, "std::string", 11))
1957                         return (0);
1958                 ddata->last_sname = "string";
1959                 ddata->cur += 2;
1960                 if (*ddata->cur == 'I')
1961                         return (cpp_demangle_read_subst_stdtmpl(ddata,
1962                             "std::string", 11));
1963                 return (1);
1964
1965         case SIMPLE_HASH('S', 't'):
1966                 /* std:: */
1967                 return (cpp_demangle_read_subst_std(ddata));
1968         };
1969
1970         if (*(++ddata->cur) == '\0')
1971                 return (0);
1972
1973         /* substitution */
1974         if (*ddata->cur == '_')
1975                 return (cpp_demangle_get_subst(ddata, 0));
1976         else {
1977                 errno = 0;
1978                 /* substitution number is base 36 */
1979                 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
1980                     errno != 0)
1981                         return (0);
1982
1983                 /* first was '_', so increase one */
1984                 ++nth;
1985
1986                 while (*ddata->cur != '_')
1987                         ++ddata->cur;
1988
1989                 assert(nth > 0);
1990
1991                 return (cpp_demangle_get_subst(ddata, nth));
1992         }
1993
1994         /* NOTREACHED */
1995         return (0);
1996 }
1997
1998 static int
1999 cpp_demangle_read_subst_std(struct cpp_demangle_data *ddata)
2000 {
2001         struct vector_str *output, v;
2002         size_t p_idx, subst_str_len;
2003         int rtn;
2004         char *subst_str;
2005
2006         if (ddata == NULL)
2007                 return (0);
2008
2009         if (!vector_str_init(&v))
2010                 return (0);
2011
2012         subst_str = NULL;
2013         rtn = 0;
2014         if (!cpp_demangle_push_str(ddata, "std::", 5))
2015                 goto clean;
2016
2017         if (!vector_str_push(&v, "std::", 5))
2018                 goto clean;
2019
2020         ddata->cur += 2;
2021
2022         output = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
2023
2024         p_idx = output->size;
2025         if (!cpp_demangle_read_uqname(ddata))
2026                 goto clean;
2027
2028         if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
2029             &subst_str_len)) == NULL)
2030                 goto clean;
2031
2032         if (!vector_str_push(&v, subst_str, subst_str_len))
2033                 goto clean;
2034
2035         if (!cpp_demangle_push_subst_v(ddata, &v))
2036                 goto clean;
2037
2038         if (*ddata->cur == 'I') {
2039                 p_idx = output->size;
2040                 if (!cpp_demangle_read_tmpl_args(ddata))
2041                         goto clean;
2042                 free(subst_str);
2043                 if ((subst_str = vector_str_substr(output, p_idx,
2044                     output->size - 1, &subst_str_len)) == NULL)
2045                         goto clean;
2046                 if (!vector_str_push(&v, subst_str, subst_str_len))
2047                         goto clean;
2048                 if (!cpp_demangle_push_subst_v(ddata, &v))
2049                         goto clean;
2050         }
2051
2052         rtn = 1;
2053 clean:
2054         free(subst_str);
2055         vector_str_dest(&v);
2056
2057         return (1);
2058 }
2059
2060 static int
2061 cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *ddata,
2062     const char *str, size_t len)
2063 {
2064         struct vector_str *output;
2065         size_t p_idx, substr_len;
2066         int rtn;
2067         char *subst_str, *substr;
2068
2069         if (ddata == NULL || str == NULL || len == 0)
2070                 return (0);
2071
2072         output = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
2073
2074         p_idx = output->size;
2075         substr = NULL;
2076         subst_str = NULL;
2077
2078         if (!cpp_demangle_read_tmpl_args(ddata))
2079                 return (0);
2080         if ((substr = vector_str_substr(output, p_idx, output->size - 1,
2081             &substr_len)) == NULL)
2082                 return (0);
2083
2084         rtn = 0;
2085         if ((subst_str = malloc(sizeof(char) * (substr_len + len + 1))) ==
2086             NULL)
2087                 goto clean;
2088
2089         memcpy(subst_str, str, len);
2090         memcpy(subst_str + len, substr, substr_len);
2091         subst_str[substr_len + len] = '\0';
2092
2093         if (!cpp_demangle_push_subst(ddata, subst_str, substr_len + len))
2094                 goto clean;
2095
2096         rtn = 1;
2097 clean:
2098         free(subst_str);
2099         free(substr);
2100
2101         return (rtn);
2102 }
2103
2104 static int
2105 cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *ddata)
2106 {
2107
2108         if (ddata == NULL || *ddata->cur == '\0')
2109                 return (0);
2110
2111         switch (*ddata->cur) {
2112         case 'L':
2113                 return (cpp_demangle_read_expr_primary(ddata));
2114         case 'X':
2115                 return (cpp_demangle_read_expression(ddata));
2116         };
2117
2118         return (cpp_demangle_read_type(ddata, 0));
2119 }
2120
2121 static int
2122 cpp_demangle_read_tmpl_args(struct cpp_demangle_data *ddata)
2123 {
2124         struct vector_str *v;
2125         size_t arg_len, idx, limit, size;
2126         char *arg;
2127
2128         if (ddata == NULL || *ddata->cur == '\0')
2129                 return (0);
2130
2131         ++ddata->cur;
2132
2133         if (!vector_read_cmd_push(&ddata->cmd, READ_TMPL))
2134                 return (0);
2135
2136         if (!cpp_demangle_push_str(ddata, "<", 1))
2137                 return (0);
2138
2139         limit = 0;
2140         v = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
2141         for (;;) {
2142                 idx = v->size;
2143                 if (!cpp_demangle_read_tmpl_arg(ddata))
2144                         return (0);
2145                 if ((arg = vector_str_substr(v, idx, v->size - 1, &arg_len)) ==
2146                     NULL)
2147                         return (0);
2148                 if (!vector_str_find(&ddata->tmpl, arg, arg_len) &&
2149                     !vector_str_push(&ddata->tmpl, arg, arg_len)) {
2150                         free(arg);
2151                         return (0);
2152                 }
2153
2154                 free(arg);
2155
2156                 if (*ddata->cur == 'E') {
2157                         ++ddata->cur;
2158                         size = v->size;
2159                         assert(size > 0);
2160                         if (!strncmp(v->container[size - 1], ">", 1)) {
2161                                 if (!cpp_demangle_push_str(ddata, " >", 2))
2162                                         return (0);
2163                         } else if (!cpp_demangle_push_str(ddata, ">", 1))
2164                                 return (0);
2165                         break;
2166                 } else if (*ddata->cur != 'I' &&
2167                     !cpp_demangle_push_str(ddata, ", ", 2))
2168                         return (0);
2169
2170                 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
2171                         return (0);
2172         }
2173
2174         return (vector_read_cmd_pop(&ddata->cmd));
2175 }
2176
2177 /*
2178  * Read template parameter that forms in 'T[number]_'.
2179  * This function much like to read_subst but only for types.
2180  */
2181 static int
2182 cpp_demangle_read_tmpl_param(struct cpp_demangle_data *ddata)
2183 {
2184         long nth;
2185
2186         if (ddata == NULL || *ddata->cur != 'T')
2187                 return (0);
2188
2189         ++ddata->cur;
2190
2191         if (*ddata->cur == '_')
2192                 return (cpp_demangle_get_tmpl_param(ddata, 0));
2193         else {
2194
2195                 errno = 0;
2196                 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2197                     errno != 0)
2198                         return (0);
2199
2200                 /* T_ is first */
2201                 ++nth;
2202
2203                 while (*ddata->cur != '_')
2204                         ++ddata->cur;
2205
2206                 assert(nth > 0);
2207
2208                 return (cpp_demangle_get_tmpl_param(ddata, nth));
2209         }
2210
2211         /* NOTREACHED */
2212         return (0);
2213 }
2214
2215 static int
2216 cpp_demangle_read_type(struct cpp_demangle_data *ddata, int delimit)
2217 {
2218         struct vector_type_qualifier v;
2219         struct vector_str *output;
2220         size_t p_idx, type_str_len;
2221         int extern_c, is_builtin;
2222         long len;
2223         char *type_str;
2224
2225         if (ddata == NULL)
2226                 return (0);
2227
2228         output = &ddata->output;
2229         if (ddata->output.size > 0 && !strncmp(ddata->output.container[ddata->output.size - 1], ">", 1)) {
2230                 ddata->push_head++;
2231                 output = &ddata->output_tmp;
2232         } else if (delimit == 1) {
2233                 if (ddata->paren == false) {
2234                         if (!cpp_demangle_push_str(ddata, "(", 1))
2235                                 return (0);
2236                         if (ddata->output.size < 2)
2237                                 return (0);
2238                         ddata->paren = true;
2239                         ddata->pfirst = true;
2240                         /* Need pop function name */
2241                         if (ddata->subst.size == 1 &&
2242                             !vector_str_pop(&ddata->subst))
2243                                 return (0);
2244                 }
2245
2246                 if (ddata->pfirst)
2247                         ddata->pfirst = false;
2248                 else if (*ddata->cur != 'I' &&
2249                     !cpp_demangle_push_str(ddata, ", ", 2))
2250                         return (0);
2251         }
2252
2253         assert(output != NULL);
2254         /*
2255          * [r, V, K] [P, R, C, G, U] builtin, function, class-enum, array
2256          * pointer-to-member, template-param, template-template-param, subst
2257          */
2258
2259         if (!vector_type_qualifier_init(&v))
2260                 return (0);
2261
2262         extern_c = 0;
2263         is_builtin = 1;
2264         p_idx = output->size;
2265         type_str = NULL;
2266 again:
2267         /* builtin type */
2268         switch (*ddata->cur) {
2269         case 'a':
2270                 /* signed char */
2271                 if (!cpp_demangle_push_str(ddata, "signed char", 11))
2272                         goto clean;
2273                 ++ddata->cur;
2274                 goto rtn;
2275
2276         case 'A':
2277                 /* array type */
2278                 if (!cpp_demangle_read_array(ddata))
2279                         goto clean;
2280                 is_builtin = 0;
2281                 goto rtn;
2282
2283         case 'b':
2284                 /* bool */
2285                 if (!cpp_demangle_push_str(ddata, "bool", 4))
2286                         goto clean;
2287                 ++ddata->cur;
2288                 goto rtn;
2289
2290         case 'C':
2291                 /* complex pair */
2292                 if (!vector_type_qualifier_push(&v, TYPE_CMX))
2293                         goto clean;
2294                 ++ddata->cur;
2295                 goto again;
2296
2297         case 'c':
2298                 /* char */
2299                 if (!cpp_demangle_push_str(ddata, "char", 4))
2300                         goto clean;
2301                 ++ddata->cur;
2302                 goto rtn;
2303
2304         case 'd':
2305                 /* double */
2306                 if (!cpp_demangle_push_str(ddata, "double", 6))
2307                         goto clean;
2308                 ++ddata->cur;
2309                 goto rtn;
2310
2311         case 'e':
2312                 /* long double */
2313                 if (!cpp_demangle_push_str(ddata, "long double", 11))
2314                         goto clean;
2315                 ++ddata->cur;
2316                 goto rtn;
2317
2318         case 'f':
2319                 /* float */
2320                 if (!cpp_demangle_push_str(ddata, "float", 5))
2321                         goto clean;
2322                 ++ddata->cur;
2323                 goto rtn;
2324
2325         case 'F':
2326                 /* function */
2327                 if (!cpp_demangle_read_function(ddata, &extern_c, &v))
2328                         goto clean;
2329                 is_builtin = 0;
2330                 goto rtn;
2331
2332         case 'g':
2333                 /* __float128 */
2334                 if (!cpp_demangle_push_str(ddata, "__float128", 10))
2335                         goto clean;
2336                 ++ddata->cur;
2337                 goto rtn;
2338
2339         case 'G':
2340                 /* imaginary */
2341                 if (!vector_type_qualifier_push(&v, TYPE_IMG))
2342                         goto clean;
2343                 ++ddata->cur;
2344                 goto again;
2345
2346         case 'h':
2347                 /* unsigned char */
2348                 if (!cpp_demangle_push_str(ddata, "unsigned char", 13))
2349                         goto clean;
2350                 ++ddata->cur;
2351                 goto rtn;
2352
2353         case 'i':
2354                 /* int */
2355                 if (!cpp_demangle_push_str(ddata, "int", 3))
2356                         goto clean;
2357                 ++ddata->cur;
2358                 goto rtn;
2359
2360         case 'j':
2361                 /* unsigned int */
2362                 if (!cpp_demangle_push_str(ddata, "unsigned int", 12))
2363                         goto clean;
2364                 ++ddata->cur;
2365                 goto rtn;
2366
2367         case 'K':
2368                 /* const */
2369                 if (!vector_type_qualifier_push(&v, TYPE_CST))
2370                         goto clean;
2371                 ++ddata->cur;
2372                 goto again;
2373
2374         case 'l':
2375                 /* long */
2376                 if (!cpp_demangle_push_str(ddata, "long", 4))
2377                         goto clean;
2378                 ++ddata->cur;
2379                 goto rtn;
2380
2381         case 'm':
2382                 /* unsigned long */
2383                 if (!cpp_demangle_push_str(ddata, "unsigned long", 13))
2384                         goto clean;
2385
2386                 ++ddata->cur;
2387
2388                 goto rtn;
2389         case 'M':
2390                 /* pointer to member */
2391                 if (!cpp_demangle_read_pointer_to_member(ddata))
2392                         goto clean;
2393                 is_builtin = 0;
2394                 goto rtn;
2395
2396         case 'n':
2397                 /* __int128 */
2398                 if (!cpp_demangle_push_str(ddata, "__int128", 8))
2399                         goto clean;
2400                 ++ddata->cur;
2401                 goto rtn;
2402
2403         case 'o':
2404                 /* unsigned __int128 */
2405                 if (!cpp_demangle_push_str(ddata, "unsigned _;int128", 17))
2406                         goto clean;
2407                 ++ddata->cur;
2408                 goto rtn;
2409
2410         case 'P':
2411                 /* pointer */
2412                 if (!vector_type_qualifier_push(&v, TYPE_PTR))
2413                         goto clean;
2414                 ++ddata->cur;
2415                 goto again;
2416
2417         case 'r':
2418                 /* restrict */
2419                 if (!vector_type_qualifier_push(&v, TYPE_RST))
2420                         goto clean;
2421                 ++ddata->cur;
2422                 goto again;
2423
2424         case 'R':
2425                 /* reference */
2426                 if (!vector_type_qualifier_push(&v, TYPE_REF))
2427                         goto clean;
2428                 ++ddata->cur;
2429                 goto again;
2430
2431         case 's':
2432                 /* short, local string */
2433                 if (!cpp_demangle_push_str(ddata, "short", 5))
2434                         goto clean;
2435                 ++ddata->cur;
2436                 goto rtn;
2437
2438         case 'S':
2439                 /* substitution */
2440                 if (!cpp_demangle_read_subst(ddata))
2441                         goto clean;
2442                 is_builtin = 0;
2443                 goto rtn;
2444
2445         case 't':
2446                 /* unsigned short */
2447                 if (!cpp_demangle_push_str(ddata, "unsigned short", 14))
2448                         goto clean;
2449                 ++ddata->cur;
2450                 goto rtn;
2451
2452         case 'T':
2453                 /* template parameter */
2454                 if (!cpp_demangle_read_tmpl_param(ddata))
2455                         goto clean;
2456                 is_builtin = 0;
2457                 goto rtn;
2458
2459         case 'u':
2460                 /* vendor extended builtin */
2461                 ++ddata->cur;
2462                 if (!cpp_demangle_read_sname(ddata))
2463                         goto clean;
2464                 is_builtin = 0;
2465                 goto rtn;
2466
2467         case 'U':
2468                 /* vendor extended type qualifier */
2469                 if (!cpp_demangle_read_number(ddata, &len))
2470                         goto clean;
2471                 if (len <= 0)
2472                         goto clean;
2473                 if (!vector_str_push(&v.ext_name, ddata->cur, len))
2474                         return (0);
2475                 ddata->cur += len;
2476                 goto again;
2477
2478         case 'v':
2479                 /* void */
2480                 if (!cpp_demangle_push_str(ddata, "void", 4))
2481                         goto clean;
2482                 ++ddata->cur;
2483                 goto rtn;
2484
2485         case 'V':
2486                 /* volatile */
2487                 if (!vector_type_qualifier_push(&v, TYPE_VAT))
2488                         goto clean;
2489                 ++ddata->cur;
2490                 goto again;
2491
2492         case 'w':
2493                 /* wchar_t */
2494                 if (!cpp_demangle_push_str(ddata, "wchar_t", 6))
2495                         goto clean;
2496                 ++ddata->cur;
2497                 goto rtn;
2498
2499         case 'x':
2500                 /* long long */
2501                 if (!cpp_demangle_push_str(ddata, "long long", 9))
2502                         goto clean;
2503                 ++ddata->cur;
2504                 goto rtn;
2505
2506         case 'y':
2507                 /* unsigned long long */
2508                 if (!cpp_demangle_push_str(ddata, "unsigned long long", 18))
2509                         goto clean;
2510                 ++ddata->cur;
2511                 goto rtn;
2512
2513         case 'z':
2514                 /* ellipsis */
2515                 if (!cpp_demangle_push_str(ddata, "ellipsis", 8))
2516                         goto clean;
2517                 ++ddata->cur;
2518                 goto rtn;
2519         };
2520
2521         if (!cpp_demangle_read_name(ddata))
2522                 goto clean;
2523
2524         is_builtin = 0;
2525 rtn:
2526         if ((type_str = vector_str_substr(output, p_idx, output->size - 1,
2527             &type_str_len)) == NULL)
2528                 goto clean;
2529
2530         if (is_builtin == 0) {
2531                 if (!vector_str_find(&ddata->subst, type_str, type_str_len) &&
2532                     !vector_str_push(&ddata->subst, type_str, type_str_len))
2533                         goto clean;
2534         }
2535
2536         if (!cpp_demangle_push_type_qualifier(ddata, &v, type_str))
2537                 goto clean;
2538
2539         free(type_str);
2540         vector_type_qualifier_dest(&v);
2541
2542         if (ddata->push_head > 0) {
2543                 if (*ddata->cur == 'I' && cpp_demangle_read_tmpl_args(ddata)
2544                     == 0)
2545                         return (0);
2546
2547                 if (--ddata->push_head > 0)
2548                         return (1);
2549
2550                 if (!vector_str_push(&ddata->output_tmp, " ", 1))
2551                         return (0);
2552
2553                 if (!vector_str_push_vector_head(&ddata->output,
2554                     &ddata->output_tmp))
2555                         return (0);
2556
2557                 vector_str_dest(&ddata->output_tmp);
2558                 if (!vector_str_init(&ddata->output_tmp))
2559                         return (0);
2560
2561                 if (!cpp_demangle_push_str(ddata, "(", 1))
2562                         return (0);
2563
2564                 ddata->paren = true;
2565                 ddata->pfirst = true;
2566         }
2567
2568         return (1);
2569 clean:
2570         free(type_str);
2571         vector_type_qualifier_dest(&v);
2572
2573         return (0);
2574 }
2575
2576 /*
2577  * read unqualified-name, unqualified name are operator-name, ctor-dtor-name,
2578  * source-name
2579  */
2580 static int
2581 cpp_demangle_read_uqname(struct cpp_demangle_data *ddata)
2582 {
2583         size_t len;
2584
2585         if (ddata == NULL || *ddata->cur == '\0')
2586                 return (0);
2587
2588         /* operator name */
2589         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
2590         case SIMPLE_HASH('a', 'a'):
2591                 /* operator && */
2592                 if (!cpp_demangle_push_str(ddata, "operator&&", 10))
2593                         return (0);
2594                 ddata->cur += 2;
2595                 return (1);
2596
2597         case SIMPLE_HASH('a', 'd'):
2598                 /* operator & (unary) */
2599                 if (!cpp_demangle_push_str(ddata, "operator&", 9))
2600                         return (0);
2601                 ddata->cur += 2;
2602                 return (1);
2603
2604         case SIMPLE_HASH('a', 'n'):
2605                 /* operator & */
2606                 if (!cpp_demangle_push_str(ddata, "operator&", 9))
2607                         return (0);
2608                 ddata->cur += 2;
2609                 return (1);
2610
2611         case SIMPLE_HASH('a', 'N'):
2612                 /* operator &= */
2613                 if (!cpp_demangle_push_str(ddata, "operator&=", 10))
2614                         return (0);
2615                 ddata->cur += 2;
2616                 return (1);
2617
2618         case SIMPLE_HASH('a', 'S'):
2619                 /* operator = */
2620                 if (!cpp_demangle_push_str(ddata, "operator=", 9))
2621                         return (0);
2622                 ddata->cur += 2;
2623                 return (1);
2624
2625         case SIMPLE_HASH('c', 'l'):
2626                 /* operator () */
2627                 if (!cpp_demangle_push_str(ddata, "operator()", 10))
2628                         return (0);
2629                 ddata->cur += 2;
2630                 return (1);
2631
2632         case SIMPLE_HASH('c', 'm'):
2633                 /* operator , */
2634                 if (!cpp_demangle_push_str(ddata, "operator,", 9))
2635                         return (0);
2636                 ddata->cur += 2;
2637                 return (1);
2638
2639         case SIMPLE_HASH('c', 'o'):
2640                 /* operator ~ */
2641                 if (!cpp_demangle_push_str(ddata, "operator~", 9))
2642                         return (0);
2643                 ddata->cur += 2;
2644                 return (1);
2645
2646         case SIMPLE_HASH('c', 'v'):
2647                 /* operator (cast) */
2648                 if (!cpp_demangle_push_str(ddata, "operator(cast)", 14))
2649                         return (0);
2650                 ddata->cur += 2;
2651                 return (cpp_demangle_read_type(ddata, 1));
2652
2653         case SIMPLE_HASH('d', 'a'):
2654                 /* operator delete [] */
2655                 if (!cpp_demangle_push_str(ddata, "operator delete []", 18))
2656                         return (0);
2657                 ddata->cur += 2;
2658                 return (1);
2659
2660         case SIMPLE_HASH('d', 'e'):
2661                 /* operator * (unary) */
2662                 if (!cpp_demangle_push_str(ddata, "operator*", 9))
2663                         return (0);
2664                 ddata->cur += 2;
2665                 return (1);
2666
2667         case SIMPLE_HASH('d', 'l'):
2668                 /* operator delete */
2669                 if (!cpp_demangle_push_str(ddata, "operator delete", 15))
2670                         return (0);
2671                 ddata->cur += 2;
2672                 return (1);
2673
2674         case SIMPLE_HASH('d', 'v'):
2675                 /* operator / */
2676                 if (!cpp_demangle_push_str(ddata, "operator/", 9))
2677                         return (0);
2678                 ddata->cur += 2;
2679                 return (1);
2680
2681         case SIMPLE_HASH('d', 'V'):
2682                 /* operator /= */
2683                 if (!cpp_demangle_push_str(ddata, "operator/=", 10))
2684                         return (0);
2685                 ddata->cur += 2;
2686                 return (1);
2687
2688         case SIMPLE_HASH('e', 'o'):
2689                 /* operator ^ */
2690                 if (!cpp_demangle_push_str(ddata, "operator^", 9))
2691                         return (0);
2692                 ddata->cur += 2;
2693                 return (1);
2694
2695         case SIMPLE_HASH('e', 'O'):
2696                 /* operator ^= */
2697                 if (!cpp_demangle_push_str(ddata, "operator^=", 10))
2698                         return (0);
2699                 ddata->cur += 2;
2700                 return (1);
2701
2702         case SIMPLE_HASH('e', 'q'):
2703                 /* operator == */
2704                 if (!cpp_demangle_push_str(ddata, "operator==", 10))
2705                         return (0);
2706                 ddata->cur += 2;
2707                 return (1);
2708
2709         case SIMPLE_HASH('g', 'e'):
2710                 /* operator >= */
2711                 if (!cpp_demangle_push_str(ddata, "operator>=", 10))
2712                         return (0);
2713                 ddata->cur += 2;
2714                 return (1);
2715
2716         case SIMPLE_HASH('g', 't'):
2717                 /* operator > */
2718                 if (!cpp_demangle_push_str(ddata, "operator>", 9))
2719                         return (0);
2720                 ddata->cur += 2;
2721                 return (1);
2722
2723         case SIMPLE_HASH('i', 'x'):
2724                 /* operator [] */
2725                 if (!cpp_demangle_push_str(ddata, "operator[]", 10))
2726                         return (0);
2727                 ddata->cur += 2;
2728                 return (1);
2729
2730         case SIMPLE_HASH('l', 'e'):
2731                 /* operator <= */
2732                 if (!cpp_demangle_push_str(ddata, "operator<=", 10))
2733                         return (0);
2734                 ddata->cur += 2;
2735                 return (1);
2736
2737         case SIMPLE_HASH('l', 's'):
2738                 /* operator << */
2739                 if (!cpp_demangle_push_str(ddata, "operator<<", 10))
2740                         return (0);
2741                 ddata->cur += 2;
2742                 return (1);
2743
2744         case SIMPLE_HASH('l', 'S'):
2745                 /* operator <<= */
2746                 if (!cpp_demangle_push_str(ddata, "operator<<=", 11))
2747                         return (0);
2748                 ddata->cur += 2;
2749                 return (1);
2750
2751         case SIMPLE_HASH('l', 't'):
2752                 /* operator < */
2753                 if (!cpp_demangle_push_str(ddata, "operator<", 9))
2754                         return (0);
2755                 ddata->cur += 2;
2756                 return (1);
2757
2758         case SIMPLE_HASH('m', 'i'):
2759                 /* operator - */
2760                 if (!cpp_demangle_push_str(ddata, "operator-", 9))
2761                         return (0);
2762                 ddata->cur += 2;
2763                 return (1);
2764
2765         case SIMPLE_HASH('m', 'I'):
2766                 /* operator -= */
2767                 if (!cpp_demangle_push_str(ddata, "operator-=", 10))
2768                         return (0);
2769                 ddata->cur += 2;
2770                 return (1);
2771
2772         case SIMPLE_HASH('m', 'l'):
2773                 /* operator * */
2774                 if (!cpp_demangle_push_str(ddata, "operator*", 9))
2775                         return (0);
2776                 ddata->cur += 2;
2777                 return (1);
2778
2779         case SIMPLE_HASH('m', 'L'):
2780                 /* operator *= */
2781                 if (!cpp_demangle_push_str(ddata, "operator*=", 10))
2782                         return (0);
2783                 ddata->cur += 2;
2784                 return (1);
2785
2786         case SIMPLE_HASH('m', 'm'):
2787                 /* operator -- */
2788                 if (!cpp_demangle_push_str(ddata, "operator--", 10))
2789                         return (0);
2790                 ddata->cur += 2;
2791                 return (1);
2792
2793         case SIMPLE_HASH('n', 'a'):
2794                 /* operator new[] */
2795                 if (!cpp_demangle_push_str(ddata, "operator new []", 15))
2796                         return (0);
2797                 ddata->cur += 2;
2798                 return (1);
2799
2800         case SIMPLE_HASH('n', 'e'):
2801                 /* operator != */
2802                 if (!cpp_demangle_push_str(ddata, "operator!=", 10))
2803                         return (0);
2804                 ddata->cur += 2;
2805                 return (1);
2806
2807         case SIMPLE_HASH('n', 'g'):
2808                 /* operator - (unary) */
2809                 if (!cpp_demangle_push_str(ddata, "operator-", 9))
2810                         return (0);
2811                 ddata->cur += 2;
2812                 return (1);
2813
2814         case SIMPLE_HASH('n', 't'):
2815                 /* operator ! */
2816                 if (!cpp_demangle_push_str(ddata, "operator!", 9))
2817                         return (0);
2818                 ddata->cur += 2;
2819                 return (1);
2820
2821         case SIMPLE_HASH('n', 'w'):
2822                 /* operator new */
2823                 if (!cpp_demangle_push_str(ddata, "operator new", 12))
2824                         return (0);
2825                 ddata->cur += 2;
2826                 return (1);
2827
2828         case SIMPLE_HASH('o', 'o'):
2829                 /* operator || */
2830                 if (!cpp_demangle_push_str(ddata, "operator||", 10))
2831                         return (0);
2832                 ddata->cur += 2;
2833                 return (1);
2834
2835         case SIMPLE_HASH('o', 'r'):
2836                 /* operator | */
2837                 if (!cpp_demangle_push_str(ddata, "operator|", 9))
2838                         return (0);
2839                 ddata->cur += 2;
2840                 return (1);
2841
2842         case SIMPLE_HASH('o', 'R'):
2843                 /* operator |= */
2844                 if (!cpp_demangle_push_str(ddata, "operator|=", 10))
2845                         return (0);
2846                 ddata->cur += 2;
2847                 return (1);
2848
2849         case SIMPLE_HASH('p', 'l'):
2850                 /* operator + */
2851                 if (!cpp_demangle_push_str(ddata, "operator+", 9))
2852                         return (0);
2853                 ddata->cur += 2;
2854                 return (1);
2855
2856         case SIMPLE_HASH('p', 'L'):
2857                 /* operator += */
2858                 if (!cpp_demangle_push_str(ddata, "operator+=", 10))
2859                         return (0);
2860                 ddata->cur += 2;
2861                 return (1);
2862
2863         case SIMPLE_HASH('p', 'm'):
2864                 /* operator ->* */
2865                 if (!cpp_demangle_push_str(ddata, "operator->*", 11))
2866                         return (0);
2867                 ddata->cur += 2;
2868                 return (1);
2869
2870         case SIMPLE_HASH('p', 'p'):
2871                 /* operator ++ */
2872                 if (!cpp_demangle_push_str(ddata, "operator++", 10))
2873                         return (0);
2874                 ddata->cur += 2;
2875                 return (1);
2876
2877         case SIMPLE_HASH('p', 's'):
2878                 /* operator + (unary) */
2879                 if (!cpp_demangle_push_str(ddata, "operator+", 9))
2880                         return (0);
2881                 ddata->cur += 2;
2882                 return (1);
2883
2884         case SIMPLE_HASH('p', 't'):
2885                 /* operator -> */
2886                 if (!cpp_demangle_push_str(ddata, "operator->", 10))
2887                         return (0);
2888                 ddata->cur += 2;
2889                 return (1);
2890
2891         case SIMPLE_HASH('q', 'u'):
2892                 /* operator ? */
2893                 if (!cpp_demangle_push_str(ddata, "operator?", 9))
2894                         return (0);
2895                 ddata->cur += 2;
2896                 return (1);
2897
2898         case SIMPLE_HASH('r', 'm'):
2899                 /* operator % */
2900                 if (!cpp_demangle_push_str(ddata, "operator%", 9))
2901                         return (0);
2902                 ddata->cur += 2;
2903                 return (1);
2904
2905         case SIMPLE_HASH('r', 'M'):
2906                 /* operator %= */
2907                 if (!cpp_demangle_push_str(ddata, "operator%=", 10))
2908                         return (0);
2909                 ddata->cur += 2;
2910                 return (1);
2911
2912         case SIMPLE_HASH('r', 's'):
2913                 /* operator >> */
2914                 if (!cpp_demangle_push_str(ddata, "operator>>", 10))
2915                         return (0);
2916                 ddata->cur += 2;
2917                 return (1);
2918
2919         case SIMPLE_HASH('r', 'S'):
2920                 /* operator >>= */
2921                 if (!cpp_demangle_push_str(ddata, "operator>>=", 11))
2922                         return (0);
2923                 ddata->cur += 2;
2924                 return (1);
2925
2926         case SIMPLE_HASH('r', 'z'):
2927                 /* operator sizeof */
2928                 if (!cpp_demangle_push_str(ddata, "operator sizeof ", 16))
2929                         return (0);
2930                 ddata->cur += 2;
2931                 return (1);
2932
2933         case SIMPLE_HASH('s', 'r'):
2934                 /* scope resolution operator */
2935                 if (!cpp_demangle_push_str(ddata, "scope resolution operator ",
2936                     26))
2937                         return (0);
2938                 ddata->cur += 2;
2939                 return (1);
2940
2941         case SIMPLE_HASH('s', 'v'):
2942                 /* operator sizeof */
2943                 if (!cpp_demangle_push_str(ddata, "operator sizeof ", 16))
2944                         return (0);
2945                 ddata->cur += 2;
2946                 return (1);
2947         };
2948
2949         /* vendor extened operator */
2950         if (*ddata->cur == 'v' && ELFTC_ISDIGIT(*(ddata->cur + 1))) {
2951                 if (!cpp_demangle_push_str(ddata, "vendor extened operator ",
2952                     24))
2953                         return (0);
2954                 if (!cpp_demangle_push_str(ddata, ddata->cur + 1, 1))
2955                         return (0);
2956                 ddata->cur += 2;
2957                 return (cpp_demangle_read_sname(ddata));
2958         }
2959
2960         /* ctor-dtor-name */
2961         switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
2962         case SIMPLE_HASH('C', '1'):
2963                 /* FALLTHROUGH */
2964         case SIMPLE_HASH('C', '2'):
2965                 /* FALLTHROUGH */
2966         case SIMPLE_HASH('C', '3'):
2967                 if (ddata->last_sname == NULL)
2968                         return (0);
2969                 if ((len = strlen(ddata->last_sname)) == 0)
2970                         return (0);
2971                 if (!cpp_demangle_push_str(ddata, "::", 2))
2972                         return (0);
2973                 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
2974                         return (0);
2975                 ddata->cur +=2;
2976                 return (1);
2977
2978         case SIMPLE_HASH('D', '0'):
2979                 /* FALLTHROUGH */
2980         case SIMPLE_HASH('D', '1'):
2981                 /* FALLTHROUGH */
2982         case SIMPLE_HASH('D', '2'):
2983                 if (ddata->last_sname == NULL)
2984                         return (0);
2985                 if ((len = strlen(ddata->last_sname)) == 0)
2986                         return (0);
2987                 if (!cpp_demangle_push_str(ddata, "::~", 3))
2988                         return (0);
2989                 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
2990                         return (0);
2991                 ddata->cur +=2;
2992                 return (1);
2993         };
2994
2995         /* source name */
2996         if (ELFTC_ISDIGIT(*ddata->cur) != 0)
2997                 return (cpp_demangle_read_sname(ddata));
2998
2999         return (1);
3000 }
3001
3002 static int
3003 cpp_demangle_read_v_offset(struct cpp_demangle_data *ddata)
3004 {
3005
3006         if (ddata == NULL)
3007                 return (0);
3008
3009         if (!cpp_demangle_push_str(ddata, "offset : ", 9))
3010                 return (0);
3011
3012         if (!cpp_demangle_read_offset_number(ddata))
3013                 return (0);
3014
3015         if (!cpp_demangle_push_str(ddata, "virtual offset : ", 17))
3016                 return (0);
3017
3018         return (!cpp_demangle_read_offset_number(ddata));
3019 }
3020
3021 /*
3022  * Decode floating point representation to string
3023  * Return new allocated string or NULL
3024  *
3025  * Todo
3026  * Replace these functions to macro.
3027  */
3028 static char *
3029 decode_fp_to_double(const char *p, size_t len)
3030 {
3031         double f;
3032         size_t rtn_len, limit, i;
3033         int byte;
3034         char *rtn;
3035
3036         if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(double))
3037                 return (NULL);
3038
3039         memset(&f, 0, sizeof(double));
3040
3041         for (i = 0; i < len / 2; ++i) {
3042                 byte = hex_to_dec(p[len - i * 2 - 1]) +
3043                     hex_to_dec(p[len - i * 2 - 2]) * 16;
3044
3045                 if (byte < 0 || byte > 255)
3046                         return (NULL);
3047
3048 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3049                 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3050 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3051                 ((unsigned char *)&f)[sizeof(double) - i - 1] =
3052                     (unsigned char)(byte);
3053 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3054         }
3055
3056         rtn_len = 64;
3057         limit = 0;
3058 again:
3059         if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3060                 return (NULL);
3061
3062         if (snprintf(rtn, rtn_len, "%fld", f) >= (int)rtn_len) {
3063                 free(rtn);
3064                 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3065                         return (NULL);
3066                 rtn_len *= BUFFER_GROWFACTOR;
3067                 goto again;
3068         }
3069
3070         return rtn;
3071 }
3072
3073 static char *
3074 decode_fp_to_float(const char *p, size_t len)
3075 {
3076         size_t i, rtn_len, limit;
3077         float f;
3078         int byte;
3079         char *rtn;
3080
3081         if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(float))
3082                 return (NULL);
3083
3084         memset(&f, 0, sizeof(float));
3085
3086         for (i = 0; i < len / 2; ++i) {
3087                 byte = hex_to_dec(p[len - i * 2 - 1]) +
3088                     hex_to_dec(p[len - i * 2 - 2]) * 16;
3089                 if (byte < 0 || byte > 255)
3090                         return (NULL);
3091 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3092                 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3093 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3094                 ((unsigned char *)&f)[sizeof(float) - i - 1] =
3095                     (unsigned char)(byte);
3096 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3097         }
3098
3099         rtn_len = 64;
3100         limit = 0;
3101 again:
3102         if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3103                 return (NULL);
3104
3105         if (snprintf(rtn, rtn_len, "%ff", f) >= (int)rtn_len) {
3106                 free(rtn);
3107                 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3108                         return (NULL);
3109                 rtn_len *= BUFFER_GROWFACTOR;
3110                 goto again;
3111         }
3112
3113         return rtn;
3114 }
3115
3116 static char *
3117 decode_fp_to_float128(const char *p, size_t len)
3118 {
3119         long double f;
3120         size_t rtn_len, limit, i;
3121         int byte;
3122         unsigned char buf[FLOAT_QUADRUPLE_BYTES];
3123         char *rtn;
3124
3125         switch(sizeof(long double)) {
3126         case FLOAT_QUADRUPLE_BYTES:
3127                 return (decode_fp_to_long_double(p, len));
3128         case FLOAT_EXTENED_BYTES:
3129                 if (p == NULL || len == 0 || len % 2 != 0 ||
3130                     len / 2 > FLOAT_QUADRUPLE_BYTES)
3131                         return (NULL);
3132
3133                 memset(buf, 0, FLOAT_QUADRUPLE_BYTES);
3134
3135                 for (i = 0; i < len / 2; ++i) {
3136                         byte = hex_to_dec(p[len - i * 2 - 1]) +
3137                             hex_to_dec(p[len - i * 2 - 2]) * 16;
3138                         if (byte < 0 || byte > 255)
3139                                 return (NULL);
3140 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3141                         buf[i] = (unsigned char)(byte);
3142 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3143                         buf[FLOAT_QUADRUPLE_BYTES - i -1] =
3144                             (unsigned char)(byte);
3145 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3146                 }
3147                 memset(&f, 0, FLOAT_EXTENED_BYTES);
3148
3149 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3150                 memcpy(&f, buf, FLOAT_EXTENED_BYTES);
3151 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3152                 memcpy(&f, buf + 6, FLOAT_EXTENED_BYTES);
3153 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3154
3155                 rtn_len = 256;
3156                 limit = 0;
3157 again:
3158                 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3159                         return (NULL);
3160
3161                 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3162                         free(rtn);
3163                         if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3164                                 return (NULL);
3165                         rtn_len *= BUFFER_GROWFACTOR;
3166                         goto again;
3167                 }
3168
3169                 return (rtn);
3170         default:
3171                 return (NULL);
3172         }
3173 }
3174
3175 static char *
3176 decode_fp_to_float80(const char *p, size_t len)
3177 {
3178         long double f;
3179         size_t rtn_len, limit, i;
3180         int byte;
3181         unsigned char buf[FLOAT_EXTENED_BYTES];
3182         char *rtn;
3183
3184         switch(sizeof(long double)) {
3185         case FLOAT_QUADRUPLE_BYTES:
3186                 if (p == NULL || len == 0 || len % 2 != 0 ||
3187                     len / 2 > FLOAT_EXTENED_BYTES)
3188                         return (NULL);
3189
3190                 memset(buf, 0, FLOAT_EXTENED_BYTES);
3191
3192                 for (i = 0; i < len / 2; ++i) {
3193                         byte = hex_to_dec(p[len - i * 2 - 1]) +
3194                             hex_to_dec(p[len - i * 2 - 2]) * 16;
3195
3196                         if (byte < 0 || byte > 255)
3197                                 return (NULL);
3198
3199 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3200                         buf[i] = (unsigned char)(byte);
3201 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3202                         buf[FLOAT_EXTENED_BYTES - i -1] =
3203                             (unsigned char)(byte);
3204 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3205                 }
3206
3207                 memset(&f, 0, FLOAT_QUADRUPLE_BYTES);
3208
3209 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3210                 memcpy(&f, buf, FLOAT_EXTENED_BYTES);
3211 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3212                 memcpy((unsigned char *)(&f) + 6, buf, FLOAT_EXTENED_BYTES);
3213 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3214
3215                 rtn_len = 256;
3216                 limit = 0;
3217 again:
3218                 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3219                         return (NULL);
3220
3221                 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3222                         free(rtn);
3223                         if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3224                                 return (NULL);
3225                         rtn_len *= BUFFER_GROWFACTOR;
3226                         goto again;
3227                 }
3228
3229                 return (rtn);
3230         case FLOAT_EXTENED_BYTES:
3231                 return (decode_fp_to_long_double(p, len));
3232         default:
3233                 return (NULL);
3234         }
3235 }
3236
3237 static char *
3238 decode_fp_to_long_double(const char *p, size_t len)
3239 {
3240         long double f;
3241         size_t rtn_len, limit, i;
3242         int byte;
3243         char *rtn;
3244
3245         if (p == NULL || len == 0 || len % 2 != 0 ||
3246             len / 2 > sizeof(long double))
3247                 return (NULL);
3248
3249         memset(&f, 0, sizeof(long double));
3250
3251         for (i = 0; i < len / 2; ++i) {
3252                 byte = hex_to_dec(p[len - i * 2 - 1]) +
3253                     hex_to_dec(p[len - i * 2 - 2]) * 16;
3254
3255                 if (byte < 0 || byte > 255)
3256                         return (NULL);
3257
3258 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3259                 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3260 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3261                 ((unsigned char *)&f)[sizeof(long double) - i - 1] =
3262                     (unsigned char)(byte);
3263 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3264         }
3265
3266         rtn_len = 256;
3267         limit = 0;
3268 again:
3269         if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3270                 return (NULL);
3271
3272         if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3273                 free(rtn);
3274                 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3275                         return (NULL);
3276                 rtn_len *= BUFFER_GROWFACTOR;
3277                 goto again;
3278         }
3279
3280         return (rtn);
3281 }
3282
3283 /* Simple hex to integer function used by decode_to_* function. */
3284 static int
3285 hex_to_dec(char c)
3286 {
3287
3288         switch (c) {
3289         case '0':
3290                 return (0);
3291         case '1':
3292                 return (1);
3293         case '2':
3294                 return (2);
3295         case '3':
3296                 return (3);
3297         case '4':
3298                 return (4);
3299         case '5':
3300                 return (5);
3301         case '6':
3302                 return (6);
3303         case '7':
3304                 return (7);
3305         case '8':
3306                 return (8);
3307         case '9':
3308                 return (9);
3309         case 'a':
3310                 return (10);
3311         case 'b':
3312                 return (11);
3313         case 'c':
3314                 return (12);
3315         case 'd':
3316                 return (13);
3317         case 'e':
3318                 return (14);
3319         case 'f':
3320                 return (15);
3321         default:
3322                 return (-1);
3323         };
3324 }
3325
3326 static void
3327 vector_read_cmd_dest(struct vector_read_cmd *v)
3328 {
3329
3330         if (v == NULL)
3331                 return;
3332
3333         free(v->r_container);
3334 }
3335
3336 /* return -1 at failed, 0 at not found, 1 at found. */
3337 static int
3338 vector_read_cmd_find(struct vector_read_cmd *v, enum read_cmd dst)
3339 {
3340         size_t i;
3341
3342         if (v == NULL || dst == READ_FAIL)
3343                 return (-1);
3344
3345         for (i = 0; i < v->size; ++i)
3346                 if (v->r_container[i] == dst)
3347                         return (1);
3348
3349         return (0);
3350 }
3351
3352 static int
3353 vector_read_cmd_init(struct vector_read_cmd *v)
3354 {
3355
3356         if (v == NULL)
3357                 return (0);
3358
3359         v->size = 0;
3360         v->capacity = VECTOR_DEF_CAPACITY;
3361
3362         if ((v->r_container = malloc(sizeof(enum read_cmd) * v->capacity))
3363             == NULL)
3364                 return (0);
3365
3366         return (1);
3367 }
3368
3369 static int
3370 vector_read_cmd_pop(struct vector_read_cmd *v)
3371 {
3372
3373         if (v == NULL || v->size == 0)
3374                 return (0);
3375
3376         --v->size;
3377         v->r_container[v->size] = READ_FAIL;
3378
3379         return (1);
3380 }
3381
3382 static int
3383 vector_read_cmd_push(struct vector_read_cmd *v, enum read_cmd cmd)
3384 {
3385         enum read_cmd *tmp_r_ctn;
3386         size_t tmp_cap;
3387         size_t i;
3388
3389         if (v == NULL)
3390                 return (0);
3391
3392         if (v->size == v->capacity) {
3393                 tmp_cap = v->capacity * BUFFER_GROWFACTOR;
3394                 if ((tmp_r_ctn = malloc(sizeof(enum read_cmd) * tmp_cap))
3395                     == NULL)
3396                         return (0);
3397                 for (i = 0; i < v->size; ++i)
3398                         tmp_r_ctn[i] = v->r_container[i];
3399                 free(v->r_container);
3400                 v->r_container = tmp_r_ctn;
3401                 v->capacity = tmp_cap;
3402         }
3403
3404         v->r_container[v->size] = cmd;
3405         ++v->size;
3406
3407         return (1);
3408 }
3409
3410 static void
3411 vector_type_qualifier_dest(struct vector_type_qualifier *v)
3412 {
3413
3414         if (v == NULL)
3415                 return;
3416
3417         free(v->q_container);
3418         vector_str_dest(&v->ext_name);
3419 }
3420
3421 /* size, capacity, ext_name */
3422 static int
3423 vector_type_qualifier_init(struct vector_type_qualifier *v)
3424 {
3425
3426         if (v == NULL)
3427                 return (0);
3428
3429         v->size = 0;
3430         v->capacity = VECTOR_DEF_CAPACITY;
3431
3432         if ((v->q_container = malloc(sizeof(enum type_qualifier) * v->capacity))
3433             == NULL)
3434                 return (0);
3435
3436         assert(v->q_container != NULL);
3437
3438         if (vector_str_init(&v->ext_name) == false) {
3439                 free(v->q_container);
3440                 return (0);
3441         }
3442
3443         return (1);
3444 }
3445
3446 static int
3447 vector_type_qualifier_push(struct vector_type_qualifier *v,
3448     enum type_qualifier t)
3449 {
3450         enum type_qualifier *tmp_ctn;
3451         size_t tmp_cap;
3452         size_t i;
3453
3454         if (v == NULL)
3455                 return (0);
3456
3457         if (v->size == v->capacity) {
3458                 tmp_cap = v->capacity * BUFFER_GROWFACTOR;
3459                 if ((tmp_ctn = malloc(sizeof(enum type_qualifier) * tmp_cap))
3460                     == NULL)
3461                         return (0);
3462                 for (i = 0; i < v->size; ++i)
3463                         tmp_ctn[i] = v->q_container[i];
3464                 free(v->q_container);
3465                 v->q_container = tmp_ctn;
3466                 v->capacity = tmp_cap;
3467         }
3468
3469         v->q_container[v->size] = t;
3470         ++v->size;
3471
3472         return (1);
3473 }