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