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