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