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