libelftc_dem_gnu3.c revision 303619
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. */
47struct 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
60enum type_qualifier {
61	TYPE_PTR, TYPE_REF, TYPE_CMX, TYPE_IMG, TYPE_EXT, TYPE_RST, TYPE_VAT,
62	TYPE_CST, TYPE_VEC
63};
64
65struct vector_type_qualifier {
66	size_t size, capacity;
67	enum type_qualifier *q_container;
68	struct vector_str ext_name;
69};
70
71enum read_cmd {
72	READ_FAIL, READ_NEST, READ_TMPL, READ_EXPR, READ_EXPL, READ_LOCAL,
73	READ_TYPE, READ_FUNC, READ_PTRMEM
74};
75
76struct vector_read_cmd {
77	size_t size, capacity;
78	enum read_cmd *r_container;
79};
80
81struct 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
106static size_t	get_strlen_sum(const struct vector_str *v);
107static bool	vector_str_grow(struct vector_str *v);
108
109static size_t
110get_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 */
128static void
129vector_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 */
149static int
150vector_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 */
172static char *
173vector_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
205static bool
206vector_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 */
238static bool
239vector_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 */
262static bool
263vector_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 */
284static bool
285vector_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 */
308static bool
309vector_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 */
350static char *
351vector_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
381static void	cpp_demangle_data_dest(struct cpp_demangle_data *);
382static int	cpp_demangle_data_init(struct cpp_demangle_data *,
383		    const char *);
384static int	cpp_demangle_get_subst(struct cpp_demangle_data *, size_t);
385static int	cpp_demangle_get_tmpl_param(struct cpp_demangle_data *, size_t);
386static int	cpp_demangle_push_fp(struct cpp_demangle_data *,
387		    char *(*)(const char *, size_t));
388static int	cpp_demangle_push_str(struct cpp_demangle_data *, const char *,
389		    size_t);
390static int	cpp_demangle_push_subst(struct cpp_demangle_data *,
391		    const char *, size_t);
392static int	cpp_demangle_push_subst_v(struct cpp_demangle_data *,
393		    struct vector_str *);
394static int	cpp_demangle_push_type_qualifier(struct cpp_demangle_data *,
395		    struct vector_type_qualifier *, const char *);
396static int	cpp_demangle_read_array(struct cpp_demangle_data *);
397static int	cpp_demangle_read_encoding(struct cpp_demangle_data *);
398static int	cpp_demangle_read_expr_primary(struct cpp_demangle_data *);
399static int	cpp_demangle_read_expression(struct cpp_demangle_data *);
400static int	cpp_demangle_read_expression_flat(struct cpp_demangle_data *,
401		    char **);
402static int	cpp_demangle_read_expression_binary(struct cpp_demangle_data *,
403		    const char *, size_t);
404static int	cpp_demangle_read_expression_unary(struct cpp_demangle_data *,
405		    const char *, size_t);
406static int	cpp_demangle_read_expression_trinary(struct cpp_demangle_data *,
407		    const char *, size_t, const char *, size_t);
408static int	cpp_demangle_read_function(struct cpp_demangle_data *, int *,
409		    struct vector_type_qualifier *);
410static int	cpp_demangle_local_source_name(struct cpp_demangle_data *ddata);
411static int	cpp_demangle_read_local_name(struct cpp_demangle_data *);
412static int	cpp_demangle_read_name(struct cpp_demangle_data *);
413static int	cpp_demangle_read_name_flat(struct cpp_demangle_data *,
414		    char**);
415static int	cpp_demangle_read_nested_name(struct cpp_demangle_data *);
416static int	cpp_demangle_read_number(struct cpp_demangle_data *, long *);
417static int	cpp_demangle_read_number_as_string(struct cpp_demangle_data *,
418		    char **);
419static int	cpp_demangle_read_nv_offset(struct cpp_demangle_data *);
420static int	cpp_demangle_read_offset(struct cpp_demangle_data *);
421static int	cpp_demangle_read_offset_number(struct cpp_demangle_data *);
422static int	cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *);
423static int	cpp_demangle_read_sname(struct cpp_demangle_data *);
424static int	cpp_demangle_read_subst(struct cpp_demangle_data *);
425static int	cpp_demangle_read_subst_std(struct cpp_demangle_data *);
426static int	cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *,
427		    const char *, size_t);
428static int	cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *);
429static int	cpp_demangle_read_tmpl_args(struct cpp_demangle_data *);
430static int	cpp_demangle_read_tmpl_param(struct cpp_demangle_data *);
431static int	cpp_demangle_read_type(struct cpp_demangle_data *, int);
432static int	cpp_demangle_read_type_flat(struct cpp_demangle_data *,
433		    char **);
434static int	cpp_demangle_read_uqname(struct cpp_demangle_data *);
435static int	cpp_demangle_read_v_offset(struct cpp_demangle_data *);
436static char	*decode_fp_to_double(const char *, size_t);
437static char	*decode_fp_to_float(const char *, size_t);
438static char	*decode_fp_to_float128(const char *, size_t);
439static char	*decode_fp_to_float80(const char *, size_t);
440static char	*decode_fp_to_long_double(const char *, size_t);
441static int	hex_to_dec(char);
442static void	vector_read_cmd_dest(struct vector_read_cmd *);
443static int	vector_read_cmd_find(struct vector_read_cmd *, enum read_cmd);
444static int	vector_read_cmd_init(struct vector_read_cmd *);
445static int	vector_read_cmd_pop(struct vector_read_cmd *);
446static int	vector_read_cmd_push(struct vector_read_cmd *, enum read_cmd);
447static void	vector_type_qualifier_dest(struct vector_type_qualifier *);
448static int	vector_type_qualifier_init(struct vector_type_qualifier *);
449static 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 */
459char *
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
524clean:
525	cpp_demangle_data_dest(&ddata);
526
527	return (rtn);
528}
529
530static void
531cpp_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
545static int
546cpp_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
583clean5:
584	vector_str_dest(&d->class_type);
585clean4:
586	vector_str_dest(&d->tmpl);
587clean3:
588	vector_str_dest(&d->subst);
589clean2:
590	vector_str_dest(&d->output_tmp);
591clean1:
592	vector_str_dest(&d->output);
593
594	return (0);
595}
596
597static int
598cpp_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
627static int
628cpp_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
641static int
642cpp_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
655static int
656cpp_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
675static int
676cpp_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;
854clean:
855	if (type_str != NULL)
856		vector_str_dest(&subst_v);
857
858	return (rtn);
859}
860
861static int
862cpp_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
879static int
880cpp_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
896static int
897cpp_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
979static int
980cpp_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
1063static int
1064cpp_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
1347static int
1348cpp_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
1379static int
1380cpp_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
1394static int
1395cpp_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
1407static int
1408cpp_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
1428static int
1429cpp_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 */
1505static int
1506cpp_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		case 't':
1559		default:
1560			if (!cpp_demangle_push_str(ddata,
1561			    "transaction clone for ", 22))
1562				return (0);
1563		}
1564		++ddata->cur;
1565		return (cpp_demangle_read_encoding(ddata));
1566
1567	case SIMPLE_HASH('G', 'V'):
1568		/* sentry object for 1 time init */
1569		if (!cpp_demangle_push_str(ddata, "guard variable for ", 20))
1570			return (0);
1571		ddata->cur += 2;
1572		break;
1573
1574	case SIMPLE_HASH('T', 'c'):
1575		/* virtual function covariant override thunk */
1576		if (!cpp_demangle_push_str(ddata,
1577		    "virtual function covariant override ", 36))
1578			return (0);
1579		ddata->cur += 2;
1580		if (*ddata->cur == '\0')
1581			return (0);
1582		if (!cpp_demangle_read_offset(ddata))
1583			return (0);
1584		if (!cpp_demangle_read_offset(ddata))
1585			return (0);
1586		return (cpp_demangle_read_encoding(ddata));
1587
1588	case SIMPLE_HASH('T', 'C'):
1589		/* construction vtable */
1590		if (!cpp_demangle_push_str(ddata, "construction vtable for ",
1591		    24))
1592			return (0);
1593		ddata->cur += 2;
1594		if (*ddata->cur == '\0')
1595			return (0);
1596		if (!cpp_demangle_read_type_flat(ddata, &type))
1597			return (0);
1598		rtn = 0;
1599		if (!cpp_demangle_read_number(ddata, &offset))
1600			goto clean3;
1601		if (*ddata->cur++ != '_')
1602			goto clean3;
1603		if (!cpp_demangle_read_type(ddata, 0))
1604			goto clean3;
1605		if (!cpp_demangle_push_str(ddata, "-in-", 4))
1606			goto clean3;
1607		if (!cpp_demangle_push_str(ddata, type, strlen(type)))
1608			goto clean3;
1609		rtn = 1;
1610	clean3:
1611		free(type);
1612		return (rtn);
1613
1614	case SIMPLE_HASH('T', 'D'):
1615		/* typeinfo common proxy */
1616		break;
1617
1618	case SIMPLE_HASH('T', 'F'):
1619		/* typeinfo fn */
1620		if (!cpp_demangle_push_str(ddata, "typeinfo fn for ", 16))
1621			return (0);
1622		ddata->cur += 2;
1623		if (*ddata->cur == '\0')
1624			return (0);
1625		return (cpp_demangle_read_type(ddata, 0));
1626
1627	case SIMPLE_HASH('T', 'h'):
1628		/* virtual function non-virtual override thunk */
1629		if (!cpp_demangle_push_str(ddata,
1630		    "virtual function non-virtual override ", 38))
1631			return (0);
1632		ddata->cur += 2;
1633		if (*ddata->cur == '\0')
1634			return (0);
1635		if (!cpp_demangle_read_nv_offset(ddata))
1636			return (0);
1637		return (cpp_demangle_read_encoding(ddata));
1638
1639	case SIMPLE_HASH('T', 'H'):
1640		/* TLS init function */
1641		if (!cpp_demangle_push_str(ddata, "TLS init function for ",
1642		    22))
1643			return (0);
1644		ddata->cur += 2;
1645		if (*ddata->cur == '\0')
1646			return (0);
1647		break;
1648
1649	case SIMPLE_HASH('T', 'I'):
1650		/* typeinfo structure */
1651		if (!cpp_demangle_push_str(ddata, "typeinfo for ", 13))
1652			return (0);
1653		ddata->cur += 2;
1654		if (*ddata->cur == '\0')
1655			return (0);
1656		return (cpp_demangle_read_type(ddata, 0));
1657
1658	case SIMPLE_HASH('T', 'J'):
1659		/* java class */
1660		if (!cpp_demangle_push_str(ddata, "java Class for ", 15))
1661			return (0);
1662		ddata->cur += 2;
1663		if (*ddata->cur == '\0')
1664			return (0);
1665		return (cpp_demangle_read_type(ddata, 0));
1666
1667	case SIMPLE_HASH('T', 'S'):
1668		/* RTTI name (NTBS) */
1669		if (!cpp_demangle_push_str(ddata, "typeinfo name for ", 18))
1670			return (0);
1671		ddata->cur += 2;
1672		if (*ddata->cur == '\0')
1673			return (0);
1674		return (cpp_demangle_read_type(ddata, 0));
1675
1676	case SIMPLE_HASH('T', 'T'):
1677		/* VTT table */
1678		if (!cpp_demangle_push_str(ddata, "VTT for ", 8))
1679			return (0);
1680		ddata->cur += 2;
1681		if (*ddata->cur == '\0')
1682			return (0);
1683		return (cpp_demangle_read_type(ddata, 0));
1684
1685	case SIMPLE_HASH('T', 'v'):
1686		/* virtual function virtual override thunk */
1687		if (!cpp_demangle_push_str(ddata,
1688		    "virtual function virtual override ", 34))
1689			return (0);
1690		ddata->cur += 2;
1691		if (*ddata->cur == '\0')
1692			return (0);
1693		if (!cpp_demangle_read_v_offset(ddata))
1694			return (0);
1695		return (cpp_demangle_read_encoding(ddata));
1696
1697	case SIMPLE_HASH('T', 'V'):
1698		/* virtual table */
1699		if (!cpp_demangle_push_str(ddata, "vtable for ", 12))
1700			return (0);
1701		ddata->cur += 2;
1702		if (*ddata->cur == '\0')
1703			return (0);
1704		return (cpp_demangle_read_type(ddata, 0));
1705
1706	case SIMPLE_HASH('T', 'W'):
1707		/* TLS wrapper function */
1708		if (!cpp_demangle_push_str(ddata, "TLS wrapper function for ",
1709		    25))
1710			return (0);
1711		ddata->cur += 2;
1712		if (*ddata->cur == '\0')
1713			return (0);
1714		break;
1715	};
1716
1717	return (cpp_demangle_read_name(ddata));
1718}
1719
1720static int
1721cpp_demangle_read_local_name(struct cpp_demangle_data *ddata)
1722{
1723	size_t limit;
1724
1725	if (ddata == NULL)
1726		return (0);
1727	if (*(++ddata->cur) == '\0')
1728		return (0);
1729	if (!cpp_demangle_read_encoding(ddata))
1730		return (0);
1731
1732	limit = 0;
1733	for (;;) {
1734		if (!cpp_demangle_read_type(ddata, 1))
1735			return (0);
1736		if (*ddata->cur == 'E')
1737			break;
1738		if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1739			return (0);
1740	}
1741	if (*(++ddata->cur) == '\0')
1742		return (0);
1743	if (ddata->paren == true) {
1744		if (!cpp_demangle_push_str(ddata, ")", 1))
1745			return (0);
1746		ddata->paren = false;
1747	}
1748	if (*ddata->cur == 's')
1749		++ddata->cur;
1750	else {
1751		if (!cpp_demangle_push_str(ddata, "::", 2))
1752			return (0);
1753		if (!cpp_demangle_read_name(ddata))
1754			return (0);
1755	}
1756	if (*ddata->cur == '_') {
1757		++ddata->cur;
1758		while (ELFTC_ISDIGIT(*ddata->cur) != 0)
1759			++ddata->cur;
1760	}
1761
1762	return (1);
1763}
1764
1765static int
1766cpp_demangle_read_name(struct cpp_demangle_data *ddata)
1767{
1768	struct vector_str *output, v;
1769	size_t p_idx, subst_str_len;
1770	int rtn;
1771	char *subst_str;
1772
1773	if (ddata == NULL || *ddata->cur == '\0')
1774		return (0);
1775
1776	output = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
1777
1778	subst_str = NULL;
1779
1780	switch (*ddata->cur) {
1781	case 'S':
1782		return (cpp_demangle_read_subst(ddata));
1783	case 'N':
1784		return (cpp_demangle_read_nested_name(ddata));
1785	case 'Z':
1786		return (cpp_demangle_read_local_name(ddata));
1787	};
1788
1789	if (!vector_str_init(&v))
1790		return (0);
1791
1792	p_idx = output->size;
1793	rtn = 0;
1794	if (!cpp_demangle_read_uqname(ddata))
1795		goto clean;
1796	if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
1797	    &subst_str_len)) == NULL)
1798		goto clean;
1799	if (subst_str_len > 8 && strstr(subst_str, "operator") != NULL) {
1800		rtn = 1;
1801		goto clean;
1802	}
1803	if (!vector_str_push(&v, subst_str, subst_str_len))
1804		goto clean;
1805	if (!cpp_demangle_push_subst_v(ddata, &v))
1806		goto clean;
1807
1808	if (*ddata->cur == 'I') {
1809		p_idx = output->size;
1810		if (!cpp_demangle_read_tmpl_args(ddata))
1811			goto clean;
1812		free(subst_str);
1813		if ((subst_str = vector_str_substr(output, p_idx,
1814		    output->size - 1, &subst_str_len)) == NULL)
1815			goto clean;
1816		if (!vector_str_push(&v, subst_str, subst_str_len))
1817			goto clean;
1818		if (!cpp_demangle_push_subst_v(ddata, &v))
1819			goto clean;
1820	}
1821
1822	rtn = 1;
1823
1824clean:
1825	free(subst_str);
1826	vector_str_dest(&v);
1827
1828	return (rtn);
1829}
1830
1831static int
1832cpp_demangle_read_name_flat(struct cpp_demangle_data *ddata, char **str)
1833{
1834	struct vector_str *output;
1835	size_t i, p_idx, idx, name_len;
1836	char *name;
1837
1838	output = ddata->push_head > 0 ? &ddata->output_tmp :
1839	    &ddata->output;
1840
1841	p_idx = output->size;
1842
1843	if (!cpp_demangle_read_name(ddata))
1844		return (0);
1845
1846	if ((name = vector_str_substr(output, p_idx, output->size - 1,
1847	    &name_len)) == NULL)
1848		return (0);
1849
1850	idx = output->size;
1851	for (i = p_idx; i < idx; ++i) {
1852		if (!vector_str_pop(output)) {
1853			free(name);
1854			return (0);
1855		}
1856	}
1857
1858	*str = name;
1859
1860	return (1);
1861}
1862
1863static int
1864cpp_demangle_read_nested_name(struct cpp_demangle_data *ddata)
1865{
1866	struct vector_str *output, v;
1867	size_t limit, p_idx, subst_str_len;
1868	int rtn;
1869	char *subst_str;
1870
1871	if (ddata == NULL || *ddata->cur != 'N')
1872		return (0);
1873	if (*(++ddata->cur) == '\0')
1874		return (0);
1875
1876	while (*ddata->cur == 'r' || *ddata->cur == 'V' ||
1877	    *ddata->cur == 'K') {
1878		switch (*ddata->cur) {
1879		case 'r':
1880			ddata->mem_rst = true;
1881			break;
1882		case 'V':
1883			ddata->mem_vat = true;
1884			break;
1885		case 'K':
1886			ddata->mem_cst = true;
1887			break;
1888		};
1889		++ddata->cur;
1890	}
1891
1892	output = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
1893	if (!vector_str_init(&v))
1894		return (0);
1895
1896	rtn = 0;
1897	limit = 0;
1898	for (;;) {
1899		p_idx = output->size;
1900		switch (*ddata->cur) {
1901		case 'I':
1902			if (!cpp_demangle_read_tmpl_args(ddata))
1903				goto clean;
1904			break;
1905		case 'S':
1906			if (!cpp_demangle_read_subst(ddata))
1907				goto clean;
1908			break;
1909		case 'T':
1910			if (!cpp_demangle_read_tmpl_param(ddata))
1911				goto clean;
1912			break;
1913		default:
1914			if (!cpp_demangle_read_uqname(ddata))
1915				goto clean;
1916		};
1917
1918		if ((subst_str = vector_str_substr(output, p_idx,
1919		    output->size - 1, &subst_str_len)) == NULL)
1920			goto clean;
1921		if (!vector_str_push(&v, subst_str, subst_str_len)) {
1922			free(subst_str);
1923			goto clean;
1924		}
1925		free(subst_str);
1926
1927		if (!cpp_demangle_push_subst_v(ddata, &v))
1928			goto clean;
1929		if (*ddata->cur == 'E')
1930			break;
1931		else if (*ddata->cur != 'I' &&
1932		    *ddata->cur != 'C' && *ddata->cur != 'D') {
1933			if (!cpp_demangle_push_str(ddata, "::", 2))
1934				goto clean;
1935			if (!vector_str_push(&v, "::", 2))
1936				goto clean;
1937		}
1938		if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1939			goto clean;
1940	}
1941
1942	++ddata->cur;
1943	rtn = 1;
1944
1945clean:
1946	vector_str_dest(&v);
1947
1948	return (rtn);
1949}
1950
1951/*
1952 * read number
1953 * number ::= [n] <decimal>
1954 */
1955static int
1956cpp_demangle_read_number(struct cpp_demangle_data *ddata, long *rtn)
1957{
1958	long len, negative_factor;
1959
1960	if (ddata == NULL || rtn == NULL)
1961		return (0);
1962
1963	negative_factor = 1;
1964	if (*ddata->cur == 'n') {
1965		negative_factor = -1;
1966
1967		++ddata->cur;
1968	}
1969	if (ELFTC_ISDIGIT(*ddata->cur) == 0)
1970		return (0);
1971
1972	errno = 0;
1973	if ((len = strtol(ddata->cur, (char **) NULL, 10)) == 0 &&
1974	    errno != 0)
1975		return (0);
1976
1977	while (ELFTC_ISDIGIT(*ddata->cur) != 0)
1978		++ddata->cur;
1979
1980	assert(len >= 0);
1981	assert(negative_factor == 1 || negative_factor == -1);
1982
1983	*rtn = len * negative_factor;
1984
1985	return (1);
1986}
1987
1988static int
1989cpp_demangle_read_number_as_string(struct cpp_demangle_data *ddata, char **str)
1990{
1991	long n;
1992
1993	if (!cpp_demangle_read_number(ddata, &n)) {
1994		*str = NULL;
1995		return (0);
1996	}
1997
1998	if (asprintf(str, "%ld", n) < 0) {
1999		*str = NULL;
2000		return (0);
2001	}
2002
2003	return (1);
2004}
2005
2006static int
2007cpp_demangle_read_nv_offset(struct cpp_demangle_data *ddata)
2008{
2009
2010	if (ddata == NULL)
2011		return (0);
2012
2013	if (!cpp_demangle_push_str(ddata, "offset : ", 9))
2014		return (0);
2015
2016	return (cpp_demangle_read_offset_number(ddata));
2017}
2018
2019/* read offset, offset are nv-offset, v-offset */
2020static int
2021cpp_demangle_read_offset(struct cpp_demangle_data *ddata)
2022{
2023
2024	if (ddata == NULL)
2025		return (0);
2026
2027	if (*ddata->cur == 'h') {
2028		++ddata->cur;
2029		return (cpp_demangle_read_nv_offset(ddata));
2030	} else if (*ddata->cur == 'v') {
2031		++ddata->cur;
2032		return (cpp_demangle_read_v_offset(ddata));
2033	}
2034
2035	return (0);
2036}
2037
2038static int
2039cpp_demangle_read_offset_number(struct cpp_demangle_data *ddata)
2040{
2041	bool negative;
2042	const char *start;
2043
2044	if (ddata == NULL || *ddata->cur == '\0')
2045		return (0);
2046
2047	/* offset could be negative */
2048	if (*ddata->cur == 'n') {
2049		negative = true;
2050		start = ddata->cur + 1;
2051	} else {
2052		negative = false;
2053		start = ddata->cur;
2054	}
2055
2056	while (*ddata->cur != '_')
2057		++ddata->cur;
2058
2059	if (negative && !cpp_demangle_push_str(ddata, "-", 1))
2060		return (0);
2061
2062	assert(start != NULL);
2063
2064	if (!cpp_demangle_push_str(ddata, start, ddata->cur - start))
2065		return (0);
2066	if (!cpp_demangle_push_str(ddata, " ", 1))
2067		return (0);
2068
2069	++ddata->cur;
2070
2071	return (1);
2072}
2073
2074static int
2075cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *ddata)
2076{
2077	size_t class_type_len, i, idx, p_idx;
2078	int p_func_type, rtn;
2079	char *class_type;
2080
2081	if (ddata == NULL || *ddata->cur != 'M' || *(++ddata->cur) == '\0')
2082		return (0);
2083
2084	p_idx = ddata->output.size;
2085	if (!cpp_demangle_read_type(ddata, 0))
2086		return (0);
2087
2088	if ((class_type = vector_str_substr(&ddata->output, p_idx,
2089	    ddata->output.size - 1, &class_type_len)) == NULL)
2090		return (0);
2091
2092	rtn = 0;
2093	idx = ddata->output.size;
2094	for (i = p_idx; i < idx; ++i)
2095		if (!vector_str_pop(&ddata->output))
2096			goto clean1;
2097
2098	if (!vector_read_cmd_push(&ddata->cmd, READ_PTRMEM))
2099		goto clean1;
2100
2101	if (!vector_str_push(&ddata->class_type, class_type, class_type_len))
2102		goto clean2;
2103
2104	p_func_type = ddata->func_type;
2105	if (!cpp_demangle_read_type(ddata, 0))
2106		goto clean3;
2107
2108	if (p_func_type == ddata->func_type) {
2109		if (!cpp_demangle_push_str(ddata, " ", 1))
2110			goto clean3;
2111		if (!cpp_demangle_push_str(ddata, class_type, class_type_len))
2112			goto clean3;
2113		if (!cpp_demangle_push_str(ddata, "::*", 3))
2114			goto clean3;
2115	}
2116
2117	rtn = 1;
2118clean3:
2119	if (!vector_str_pop(&ddata->class_type))
2120		rtn = 0;
2121clean2:
2122	if (!vector_read_cmd_pop(&ddata->cmd))
2123		rtn = 0;
2124clean1:
2125	free(class_type);
2126
2127	return (rtn);
2128}
2129
2130/* read source-name, source-name is <len> <ID> */
2131static int
2132cpp_demangle_read_sname(struct cpp_demangle_data *ddata)
2133{
2134	long len;
2135	int err;
2136
2137	if (ddata == NULL || cpp_demangle_read_number(ddata, &len) == 0 ||
2138	    len <= 0)
2139		return (0);
2140
2141	if (len == 12 && (memcmp("_GLOBAL__N_1", ddata->cur, 12) == 0))
2142		err = cpp_demangle_push_str(ddata, "(anonymous namespace)", 21);
2143	else
2144		err = cpp_demangle_push_str(ddata, ddata->cur, len);
2145
2146	if (err == 0)
2147		return (0);
2148
2149	assert(ddata->output.size > 0);
2150	if (vector_read_cmd_find(&ddata->cmd, READ_TMPL) == 0)
2151		ddata->last_sname =
2152		    ddata->output.container[ddata->output.size - 1];
2153
2154	ddata->cur += len;
2155
2156	return (1);
2157}
2158
2159static int
2160cpp_demangle_read_subst(struct cpp_demangle_data *ddata)
2161{
2162	long nth;
2163
2164	if (ddata == NULL || *ddata->cur == '\0')
2165		return (0);
2166
2167	/* abbreviations of the form Sx */
2168	switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
2169	case SIMPLE_HASH('S', 'a'):
2170		/* std::allocator */
2171		if (cpp_demangle_push_str(ddata, "std::allocator", 14) == 0)
2172			return (0);
2173		ddata->cur += 2;
2174		if (*ddata->cur == 'I')
2175			return (cpp_demangle_read_subst_stdtmpl(ddata,
2176			    "std::allocator", 14));
2177		return (1);
2178
2179	case SIMPLE_HASH('S', 'b'):
2180		/* std::basic_string */
2181		if (!cpp_demangle_push_str(ddata, "std::basic_string", 17))
2182			return (0);
2183		ddata->cur += 2;
2184		if (*ddata->cur == 'I')
2185			return (cpp_demangle_read_subst_stdtmpl(ddata,
2186			    "std::basic_string", 17));
2187		return (1);
2188
2189	case SIMPLE_HASH('S', 'd'):
2190		/* std::basic_iostream<char, std::char_traits<char> > */
2191		if (!cpp_demangle_push_str(ddata, "std::iostream", 19))
2192			return (0);
2193		ddata->last_sname = "iostream";
2194		ddata->cur += 2;
2195		if (*ddata->cur == 'I')
2196			return (cpp_demangle_read_subst_stdtmpl(ddata,
2197			    "std::iostream", 19));
2198		return (1);
2199
2200	case SIMPLE_HASH('S', 'i'):
2201		/* std::basic_istream<char, std::char_traits<char> > */
2202		if (!cpp_demangle_push_str(ddata, "std::istream", 18))
2203			return (0);
2204		ddata->last_sname = "istream";
2205		ddata->cur += 2;
2206		if (*ddata->cur == 'I')
2207			return (cpp_demangle_read_subst_stdtmpl(ddata,
2208			    "std::istream", 18));
2209		return (1);
2210
2211	case SIMPLE_HASH('S', 'o'):
2212		/* std::basic_ostream<char, std::char_traits<char> > */
2213		if (!cpp_demangle_push_str(ddata, "std::ostream", 18))
2214			return (0);
2215		ddata->last_sname = "istream";
2216		ddata->cur += 2;
2217		if (*ddata->cur == 'I')
2218			return (cpp_demangle_read_subst_stdtmpl(ddata,
2219			    "std::ostream", 18));
2220		return (1);
2221
2222	case SIMPLE_HASH('S', 's'):
2223		/*
2224		 * std::basic_string<char, std::char_traits<char>,
2225		 * std::allocator<char> >
2226		 *
2227		 * a.k.a std::string
2228		 */
2229		if (!cpp_demangle_push_str(ddata, "std::string", 11))
2230			return (0);
2231		ddata->last_sname = "string";
2232		ddata->cur += 2;
2233		if (*ddata->cur == 'I')
2234			return (cpp_demangle_read_subst_stdtmpl(ddata,
2235			    "std::string", 11));
2236		return (1);
2237
2238	case SIMPLE_HASH('S', 't'):
2239		/* std:: */
2240		return (cpp_demangle_read_subst_std(ddata));
2241	};
2242
2243	if (*(++ddata->cur) == '\0')
2244		return (0);
2245
2246	/* substitution */
2247	if (*ddata->cur == '_')
2248		return (cpp_demangle_get_subst(ddata, 0));
2249	else {
2250		errno = 0;
2251		/* substitution number is base 36 */
2252		if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2253		    errno != 0)
2254			return (0);
2255
2256		/* first was '_', so increase one */
2257		++nth;
2258
2259		while (*ddata->cur != '_')
2260			++ddata->cur;
2261
2262		assert(nth > 0);
2263
2264		return (cpp_demangle_get_subst(ddata, nth));
2265	}
2266
2267	/* NOTREACHED */
2268	return (0);
2269}
2270
2271static int
2272cpp_demangle_read_subst_std(struct cpp_demangle_data *ddata)
2273{
2274	struct vector_str *output, v;
2275	size_t p_idx, subst_str_len;
2276	int rtn;
2277	char *subst_str;
2278
2279	if (ddata == NULL)
2280		return (0);
2281
2282	if (!vector_str_init(&v))
2283		return (0);
2284
2285	subst_str = NULL;
2286	rtn = 0;
2287	if (!cpp_demangle_push_str(ddata, "std::", 5))
2288		goto clean;
2289
2290	if (!vector_str_push(&v, "std::", 5))
2291		goto clean;
2292
2293	ddata->cur += 2;
2294
2295	output = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
2296
2297	p_idx = output->size;
2298	if (!cpp_demangle_read_uqname(ddata))
2299		goto clean;
2300
2301	if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
2302	    &subst_str_len)) == NULL)
2303		goto clean;
2304
2305	if (!vector_str_push(&v, subst_str, subst_str_len))
2306		goto clean;
2307
2308	if (!cpp_demangle_push_subst_v(ddata, &v))
2309		goto clean;
2310
2311	if (*ddata->cur == 'I') {
2312		p_idx = output->size;
2313		if (!cpp_demangle_read_tmpl_args(ddata))
2314			goto clean;
2315		free(subst_str);
2316		if ((subst_str = vector_str_substr(output, p_idx,
2317		    output->size - 1, &subst_str_len)) == NULL)
2318			goto clean;
2319		if (!vector_str_push(&v, subst_str, subst_str_len))
2320			goto clean;
2321		if (!cpp_demangle_push_subst_v(ddata, &v))
2322			goto clean;
2323	}
2324
2325	rtn = 1;
2326clean:
2327	free(subst_str);
2328	vector_str_dest(&v);
2329
2330	return (rtn);
2331}
2332
2333static int
2334cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *ddata,
2335    const char *str, size_t len)
2336{
2337	struct vector_str *output;
2338	size_t p_idx, substr_len;
2339	int rtn;
2340	char *subst_str, *substr;
2341
2342	if (ddata == NULL || str == NULL || len == 0)
2343		return (0);
2344
2345	output = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
2346
2347	p_idx = output->size;
2348	substr = NULL;
2349	subst_str = NULL;
2350
2351	if (!cpp_demangle_read_tmpl_args(ddata))
2352		return (0);
2353	if ((substr = vector_str_substr(output, p_idx, output->size - 1,
2354	    &substr_len)) == NULL)
2355		return (0);
2356
2357	rtn = 0;
2358	if ((subst_str = malloc(sizeof(char) * (substr_len + len + 1))) ==
2359	    NULL)
2360		goto clean;
2361
2362	memcpy(subst_str, str, len);
2363	memcpy(subst_str + len, substr, substr_len);
2364	subst_str[substr_len + len] = '\0';
2365
2366	if (!cpp_demangle_push_subst(ddata, subst_str, substr_len + len))
2367		goto clean;
2368
2369	rtn = 1;
2370clean:
2371	free(subst_str);
2372	free(substr);
2373
2374	return (rtn);
2375}
2376
2377static int
2378cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *ddata)
2379{
2380
2381	if (ddata == NULL || *ddata->cur == '\0')
2382		return (0);
2383
2384	switch (*ddata->cur) {
2385	case 'L':
2386		return (cpp_demangle_read_expr_primary(ddata));
2387	case 'X':
2388		return (cpp_demangle_read_expression(ddata));
2389	};
2390
2391	return (cpp_demangle_read_type(ddata, 0));
2392}
2393
2394static int
2395cpp_demangle_read_tmpl_args(struct cpp_demangle_data *ddata)
2396{
2397	struct vector_str *v;
2398	size_t arg_len, idx, limit, size;
2399	char *arg;
2400
2401	if (ddata == NULL || *ddata->cur == '\0')
2402		return (0);
2403
2404	++ddata->cur;
2405
2406	if (!vector_read_cmd_push(&ddata->cmd, READ_TMPL))
2407		return (0);
2408
2409	if (!cpp_demangle_push_str(ddata, "<", 1))
2410		return (0);
2411
2412	limit = 0;
2413	v = ddata->push_head > 0 ? &ddata->output_tmp : &ddata->output;
2414	for (;;) {
2415		idx = v->size;
2416		if (!cpp_demangle_read_tmpl_arg(ddata))
2417			return (0);
2418		if ((arg = vector_str_substr(v, idx, v->size - 1, &arg_len)) ==
2419		    NULL)
2420			return (0);
2421		if (!vector_str_find(&ddata->tmpl, arg, arg_len) &&
2422		    !vector_str_push(&ddata->tmpl, arg, arg_len)) {
2423			free(arg);
2424			return (0);
2425		}
2426
2427		free(arg);
2428
2429		if (*ddata->cur == 'E') {
2430			++ddata->cur;
2431			size = v->size;
2432			assert(size > 0);
2433			if (!strncmp(v->container[size - 1], ">", 1)) {
2434				if (!cpp_demangle_push_str(ddata, " >", 2))
2435					return (0);
2436			} else if (!cpp_demangle_push_str(ddata, ">", 1))
2437				return (0);
2438			break;
2439		} else if (*ddata->cur != 'I' &&
2440		    !cpp_demangle_push_str(ddata, ", ", 2))
2441			return (0);
2442
2443		if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
2444			return (0);
2445	}
2446
2447	return (vector_read_cmd_pop(&ddata->cmd));
2448}
2449
2450/*
2451 * Read template parameter that forms in 'T[number]_'.
2452 * This function much like to read_subst but only for types.
2453 */
2454static int
2455cpp_demangle_read_tmpl_param(struct cpp_demangle_data *ddata)
2456{
2457	long nth;
2458
2459	if (ddata == NULL || *ddata->cur != 'T')
2460		return (0);
2461
2462	++ddata->cur;
2463
2464	if (*ddata->cur == '_')
2465		return (cpp_demangle_get_tmpl_param(ddata, 0));
2466	else {
2467
2468		errno = 0;
2469		if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2470		    errno != 0)
2471			return (0);
2472
2473		/* T_ is first */
2474		++nth;
2475
2476		while (*ddata->cur != '_')
2477			++ddata->cur;
2478
2479		assert(nth > 0);
2480
2481		return (cpp_demangle_get_tmpl_param(ddata, nth));
2482	}
2483
2484	/* NOTREACHED */
2485	return (0);
2486}
2487
2488static int
2489cpp_demangle_read_type(struct cpp_demangle_data *ddata, int delimit)
2490{
2491	struct vector_type_qualifier v;
2492	struct vector_str *output;
2493	size_t p_idx, type_str_len;
2494	int extern_c, is_builtin;
2495	long len;
2496	char *type_str, *exp_str, *num_str;
2497
2498	if (ddata == NULL)
2499		return (0);
2500
2501	output = &ddata->output;
2502	if (ddata->output.size > 0 && !strncmp(ddata->output.container[ddata->output.size - 1], ">", 1)) {
2503		ddata->push_head++;
2504		output = &ddata->output_tmp;
2505	} else if (delimit == 1) {
2506		if (ddata->paren == false) {
2507			if (!cpp_demangle_push_str(ddata, "(", 1))
2508				return (0);
2509			if (ddata->output.size < 2)
2510				return (0);
2511			ddata->paren = true;
2512			ddata->pfirst = true;
2513			/* Need pop function name */
2514			if (ddata->subst.size == 1 &&
2515			    !vector_str_pop(&ddata->subst))
2516				return (0);
2517		}
2518
2519		if (ddata->pfirst)
2520			ddata->pfirst = false;
2521		else if (*ddata->cur != 'I' &&
2522		    !cpp_demangle_push_str(ddata, ", ", 2))
2523			return (0);
2524	}
2525
2526	assert(output != NULL);
2527	/*
2528	 * [r, V, K] [P, R, C, G, U] builtin, function, class-enum, array
2529	 * pointer-to-member, template-param, template-template-param, subst
2530	 */
2531
2532	if (!vector_type_qualifier_init(&v))
2533		return (0);
2534
2535	extern_c = 0;
2536	is_builtin = 1;
2537	p_idx = output->size;
2538	type_str = exp_str = num_str = NULL;
2539again:
2540	/* builtin type */
2541	switch (*ddata->cur) {
2542	case 'a':
2543		/* signed char */
2544		if (!cpp_demangle_push_str(ddata, "signed char", 11))
2545			goto clean;
2546		++ddata->cur;
2547		goto rtn;
2548
2549	case 'A':
2550		/* array type */
2551		if (!cpp_demangle_read_array(ddata))
2552			goto clean;
2553		is_builtin = 0;
2554		goto rtn;
2555
2556	case 'b':
2557		/* bool */
2558		if (!cpp_demangle_push_str(ddata, "bool", 4))
2559			goto clean;
2560		++ddata->cur;
2561		goto rtn;
2562
2563	case 'C':
2564		/* complex pair */
2565		if (!vector_type_qualifier_push(&v, TYPE_CMX))
2566			goto clean;
2567		++ddata->cur;
2568		goto again;
2569
2570	case 'c':
2571		/* char */
2572		if (!cpp_demangle_push_str(ddata, "char", 4))
2573			goto clean;
2574		++ddata->cur;
2575		goto rtn;
2576
2577	case 'd':
2578		/* double */
2579		if (!cpp_demangle_push_str(ddata, "double", 6))
2580			goto clean;
2581		++ddata->cur;
2582		goto rtn;
2583
2584	case 'D':
2585		++ddata->cur;
2586		switch (*ddata->cur) {
2587		case 'd':
2588			/* IEEE 754r decimal floating point (64 bits) */
2589			if (!cpp_demangle_push_str(ddata, "decimal64", 9))
2590				goto clean;
2591			++ddata->cur;
2592			break;
2593		case 'e':
2594			/* IEEE 754r decimal floating point (128 bits) */
2595			if (!cpp_demangle_push_str(ddata, "decimal128", 10))
2596				goto clean;
2597			++ddata->cur;
2598			break;
2599		case 'f':
2600			/* IEEE 754r decimal floating point (32 bits) */
2601			if (!cpp_demangle_push_str(ddata, "decimal32", 9))
2602				goto clean;
2603			++ddata->cur;
2604			break;
2605		case 'h':
2606			/* IEEE 754r half-precision floating point (16 bits) */
2607			if (!cpp_demangle_push_str(ddata, "half", 4))
2608				goto clean;
2609			++ddata->cur;
2610			break;
2611		case 'i':
2612			/* char32_t */
2613			if (!cpp_demangle_push_str(ddata, "char32_t", 8))
2614				goto clean;
2615			++ddata->cur;
2616			break;
2617		case 'n':
2618			/* std::nullptr_t (i.e., decltype(nullptr)) */
2619			if (!cpp_demangle_push_str(ddata, "decltype(nullptr)",
2620			    17))
2621				goto clean;
2622			++ddata->cur;
2623			break;
2624		case 's':
2625			/* char16_t */
2626			if (!cpp_demangle_push_str(ddata, "char16_t", 8))
2627				goto clean;
2628			++ddata->cur;
2629			break;
2630		case 'v':
2631			/* gcc vector_size extension. */
2632			++ddata->cur;
2633			if (*ddata->cur == '_') {
2634				++ddata->cur;
2635				if (!cpp_demangle_read_expression_flat(ddata,
2636				    &exp_str))
2637					goto clean;
2638				if (!vector_str_push(&v.ext_name, exp_str,
2639				    strlen(exp_str)))
2640					goto clean;
2641			} else {
2642				if (!cpp_demangle_read_number_as_string(ddata,
2643				    &num_str))
2644					goto clean;
2645				if (!vector_str_push(&v.ext_name, num_str,
2646				    strlen(num_str)))
2647					goto clean;
2648			}
2649			if (*ddata->cur != '_')
2650				goto clean;
2651			++ddata->cur;
2652			if (!vector_type_qualifier_push(&v, TYPE_VEC))
2653				goto clean;
2654			goto again;
2655		default:
2656			goto clean;
2657		}
2658		goto rtn;
2659
2660	case 'e':
2661		/* long double */
2662		if (!cpp_demangle_push_str(ddata, "long double", 11))
2663			goto clean;
2664		++ddata->cur;
2665		goto rtn;
2666
2667	case 'f':
2668		/* float */
2669		if (!cpp_demangle_push_str(ddata, "float", 5))
2670			goto clean;
2671		++ddata->cur;
2672		goto rtn;
2673
2674	case 'F':
2675		/* function */
2676		if (!cpp_demangle_read_function(ddata, &extern_c, &v))
2677			goto clean;
2678		is_builtin = 0;
2679		goto rtn;
2680
2681	case 'g':
2682		/* __float128 */
2683		if (!cpp_demangle_push_str(ddata, "__float128", 10))
2684			goto clean;
2685		++ddata->cur;
2686		goto rtn;
2687
2688	case 'G':
2689		/* imaginary */
2690		if (!vector_type_qualifier_push(&v, TYPE_IMG))
2691			goto clean;
2692		++ddata->cur;
2693		goto again;
2694
2695	case 'h':
2696		/* unsigned char */
2697		if (!cpp_demangle_push_str(ddata, "unsigned char", 13))
2698			goto clean;
2699		++ddata->cur;
2700		goto rtn;
2701
2702	case 'i':
2703		/* int */
2704		if (!cpp_demangle_push_str(ddata, "int", 3))
2705			goto clean;
2706		++ddata->cur;
2707		goto rtn;
2708
2709	case 'j':
2710		/* unsigned int */
2711		if (!cpp_demangle_push_str(ddata, "unsigned int", 12))
2712			goto clean;
2713		++ddata->cur;
2714		goto rtn;
2715
2716	case 'K':
2717		/* const */
2718		if (!vector_type_qualifier_push(&v, TYPE_CST))
2719			goto clean;
2720		++ddata->cur;
2721		goto again;
2722
2723	case 'l':
2724		/* long */
2725		if (!cpp_demangle_push_str(ddata, "long", 4))
2726			goto clean;
2727		++ddata->cur;
2728		goto rtn;
2729
2730	case 'm':
2731		/* unsigned long */
2732		if (!cpp_demangle_push_str(ddata, "unsigned long", 13))
2733			goto clean;
2734
2735		++ddata->cur;
2736
2737		goto rtn;
2738	case 'M':
2739		/* pointer to member */
2740		if (!cpp_demangle_read_pointer_to_member(ddata))
2741			goto clean;
2742		is_builtin = 0;
2743		goto rtn;
2744
2745	case 'n':
2746		/* __int128 */
2747		if (!cpp_demangle_push_str(ddata, "__int128", 8))
2748			goto clean;
2749		++ddata->cur;
2750		goto rtn;
2751
2752	case 'o':
2753		/* unsigned __int128 */
2754		if (!cpp_demangle_push_str(ddata, "unsigned __int128", 17))
2755			goto clean;
2756		++ddata->cur;
2757		goto rtn;
2758
2759	case 'P':
2760		/* pointer */
2761		if (!vector_type_qualifier_push(&v, TYPE_PTR))
2762			goto clean;
2763		++ddata->cur;
2764		goto again;
2765
2766	case 'r':
2767		/* restrict */
2768		if (!vector_type_qualifier_push(&v, TYPE_RST))
2769			goto clean;
2770		++ddata->cur;
2771		goto again;
2772
2773	case 'R':
2774		/* reference */
2775		if (!vector_type_qualifier_push(&v, TYPE_REF))
2776			goto clean;
2777		++ddata->cur;
2778		goto again;
2779
2780	case 's':
2781		/* short, local string */
2782		if (!cpp_demangle_push_str(ddata, "short", 5))
2783			goto clean;
2784		++ddata->cur;
2785		goto rtn;
2786
2787	case 'S':
2788		/* substitution */
2789		if (!cpp_demangle_read_subst(ddata))
2790			goto clean;
2791		is_builtin = 0;
2792		goto rtn;
2793
2794	case 't':
2795		/* unsigned short */
2796		if (!cpp_demangle_push_str(ddata, "unsigned short", 14))
2797			goto clean;
2798		++ddata->cur;
2799		goto rtn;
2800
2801	case 'T':
2802		/* template parameter */
2803		if (!cpp_demangle_read_tmpl_param(ddata))
2804			goto clean;
2805		is_builtin = 0;
2806		goto rtn;
2807
2808	case 'u':
2809		/* vendor extended builtin */
2810		++ddata->cur;
2811		if (!cpp_demangle_read_sname(ddata))
2812			goto clean;
2813		is_builtin = 0;
2814		goto rtn;
2815
2816	case 'U':
2817		/* vendor extended type qualifier */
2818		if (!cpp_demangle_read_number(ddata, &len))
2819			goto clean;
2820		if (len <= 0)
2821			goto clean;
2822		if (!vector_str_push(&v.ext_name, ddata->cur, len))
2823			return (0);
2824		ddata->cur += len;
2825		if (!vector_type_qualifier_push(&v, TYPE_EXT))
2826			goto clean;
2827		goto again;
2828
2829	case 'v':
2830		/* void */
2831		if (!cpp_demangle_push_str(ddata, "void", 4))
2832			goto clean;
2833		++ddata->cur;
2834		goto rtn;
2835
2836	case 'V':
2837		/* volatile */
2838		if (!vector_type_qualifier_push(&v, TYPE_VAT))
2839			goto clean;
2840		++ddata->cur;
2841		goto again;
2842
2843	case 'w':
2844		/* wchar_t */
2845		if (!cpp_demangle_push_str(ddata, "wchar_t", 7))
2846			goto clean;
2847		++ddata->cur;
2848		goto rtn;
2849
2850	case 'x':
2851		/* long long */
2852		if (!cpp_demangle_push_str(ddata, "long long", 9))
2853			goto clean;
2854		++ddata->cur;
2855		goto rtn;
2856
2857	case 'y':
2858		/* unsigned long long */
2859		if (!cpp_demangle_push_str(ddata, "unsigned long long", 18))
2860			goto clean;
2861		++ddata->cur;
2862		goto rtn;
2863
2864	case 'z':
2865		/* ellipsis */
2866		if (!cpp_demangle_push_str(ddata, "ellipsis", 8))
2867			goto clean;
2868		++ddata->cur;
2869		goto rtn;
2870	};
2871
2872	if (!cpp_demangle_read_name(ddata))
2873		goto clean;
2874
2875	is_builtin = 0;
2876rtn:
2877	if ((type_str = vector_str_substr(output, p_idx, output->size - 1,
2878	    &type_str_len)) == NULL)
2879		goto clean;
2880
2881	if (is_builtin == 0) {
2882		if (!vector_str_find(&ddata->subst, type_str, type_str_len) &&
2883		    !vector_str_push(&ddata->subst, type_str, type_str_len))
2884			goto clean;
2885	}
2886
2887	if (!cpp_demangle_push_type_qualifier(ddata, &v, type_str))
2888		goto clean;
2889
2890	free(type_str);
2891	free(exp_str);
2892	free(num_str);
2893	vector_type_qualifier_dest(&v);
2894
2895	if (ddata->push_head > 0) {
2896		if (*ddata->cur == 'I' && cpp_demangle_read_tmpl_args(ddata)
2897		    == 0)
2898			return (0);
2899
2900		if (--ddata->push_head > 0)
2901			return (1);
2902
2903		if (!vector_str_push(&ddata->output_tmp, " ", 1))
2904			return (0);
2905
2906		if (!vector_str_push_vector_head(&ddata->output,
2907		    &ddata->output_tmp))
2908			return (0);
2909
2910		vector_str_dest(&ddata->output_tmp);
2911		if (!vector_str_init(&ddata->output_tmp))
2912			return (0);
2913
2914		if (!cpp_demangle_push_str(ddata, "(", 1))
2915			return (0);
2916
2917		ddata->paren = true;
2918		ddata->pfirst = true;
2919	}
2920
2921	return (1);
2922clean:
2923	free(type_str);
2924	free(exp_str);
2925	free(num_str);
2926	vector_type_qualifier_dest(&v);
2927
2928	return (0);
2929}
2930
2931static int
2932cpp_demangle_read_type_flat(struct cpp_demangle_data *ddata, char **str)
2933{
2934	struct vector_str *output;
2935	size_t i, p_idx, idx, type_len;
2936	char *type;
2937
2938	output = ddata->push_head > 0 ? &ddata->output_tmp :
2939	    &ddata->output;
2940
2941	p_idx = output->size;
2942
2943	if (!cpp_demangle_read_type(ddata, 0))
2944		return (0);
2945
2946	if ((type = vector_str_substr(output, p_idx, output->size - 1,
2947	    &type_len)) == NULL)
2948		return (0);
2949
2950	idx = output->size;
2951	for (i = p_idx; i < idx; ++i) {
2952		if (!vector_str_pop(output)) {
2953			free(type);
2954			return (0);
2955		}
2956	}
2957
2958	*str = type;
2959
2960	return (1);
2961}
2962
2963/*
2964 * read unqualified-name, unqualified name are operator-name, ctor-dtor-name,
2965 * source-name
2966 */
2967static int
2968cpp_demangle_read_uqname(struct cpp_demangle_data *ddata)
2969{
2970	size_t len;
2971
2972	if (ddata == NULL || *ddata->cur == '\0')
2973		return (0);
2974
2975	/* operator name */
2976	switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
2977	case SIMPLE_HASH('a', 'a'):
2978		/* operator && */
2979		if (!cpp_demangle_push_str(ddata, "operator&&", 10))
2980			return (0);
2981		ddata->cur += 2;
2982		return (1);
2983
2984	case SIMPLE_HASH('a', 'd'):
2985		/* operator & (unary) */
2986		if (!cpp_demangle_push_str(ddata, "operator&", 9))
2987			return (0);
2988		ddata->cur += 2;
2989		return (1);
2990
2991	case SIMPLE_HASH('a', 'n'):
2992		/* operator & */
2993		if (!cpp_demangle_push_str(ddata, "operator&", 9))
2994			return (0);
2995		ddata->cur += 2;
2996		return (1);
2997
2998	case SIMPLE_HASH('a', 'N'):
2999		/* operator &= */
3000		if (!cpp_demangle_push_str(ddata, "operator&=", 10))
3001			return (0);
3002		ddata->cur += 2;
3003		return (1);
3004
3005	case SIMPLE_HASH('a', 'S'):
3006		/* operator = */
3007		if (!cpp_demangle_push_str(ddata, "operator=", 9))
3008			return (0);
3009		ddata->cur += 2;
3010		return (1);
3011
3012	case SIMPLE_HASH('c', 'l'):
3013		/* operator () */
3014		if (!cpp_demangle_push_str(ddata, "operator()", 10))
3015			return (0);
3016		ddata->cur += 2;
3017		return (1);
3018
3019	case SIMPLE_HASH('c', 'm'):
3020		/* operator , */
3021		if (!cpp_demangle_push_str(ddata, "operator,", 9))
3022			return (0);
3023		ddata->cur += 2;
3024		return (1);
3025
3026	case SIMPLE_HASH('c', 'o'):
3027		/* operator ~ */
3028		if (!cpp_demangle_push_str(ddata, "operator~", 9))
3029			return (0);
3030		ddata->cur += 2;
3031		return (1);
3032
3033	case SIMPLE_HASH('c', 'v'):
3034		/* operator (cast) */
3035		if (!cpp_demangle_push_str(ddata, "operator(cast)", 14))
3036			return (0);
3037		ddata->cur += 2;
3038		return (cpp_demangle_read_type(ddata, 1));
3039
3040	case SIMPLE_HASH('d', 'a'):
3041		/* operator delete [] */
3042		if (!cpp_demangle_push_str(ddata, "operator delete []", 18))
3043			return (0);
3044		ddata->cur += 2;
3045		return (1);
3046
3047	case SIMPLE_HASH('d', 'e'):
3048		/* operator * (unary) */
3049		if (!cpp_demangle_push_str(ddata, "operator*", 9))
3050			return (0);
3051		ddata->cur += 2;
3052		return (1);
3053
3054	case SIMPLE_HASH('d', 'l'):
3055		/* operator delete */
3056		if (!cpp_demangle_push_str(ddata, "operator delete", 15))
3057			return (0);
3058		ddata->cur += 2;
3059		return (1);
3060
3061	case SIMPLE_HASH('d', 'v'):
3062		/* operator / */
3063		if (!cpp_demangle_push_str(ddata, "operator/", 9))
3064			return (0);
3065		ddata->cur += 2;
3066		return (1);
3067
3068	case SIMPLE_HASH('d', 'V'):
3069		/* operator /= */
3070		if (!cpp_demangle_push_str(ddata, "operator/=", 10))
3071			return (0);
3072		ddata->cur += 2;
3073		return (1);
3074
3075	case SIMPLE_HASH('e', 'o'):
3076		/* operator ^ */
3077		if (!cpp_demangle_push_str(ddata, "operator^", 9))
3078			return (0);
3079		ddata->cur += 2;
3080		return (1);
3081
3082	case SIMPLE_HASH('e', 'O'):
3083		/* operator ^= */
3084		if (!cpp_demangle_push_str(ddata, "operator^=", 10))
3085			return (0);
3086		ddata->cur += 2;
3087		return (1);
3088
3089	case SIMPLE_HASH('e', 'q'):
3090		/* operator == */
3091		if (!cpp_demangle_push_str(ddata, "operator==", 10))
3092			return (0);
3093		ddata->cur += 2;
3094		return (1);
3095
3096	case SIMPLE_HASH('g', 'e'):
3097		/* operator >= */
3098		if (!cpp_demangle_push_str(ddata, "operator>=", 10))
3099			return (0);
3100		ddata->cur += 2;
3101		return (1);
3102
3103	case SIMPLE_HASH('g', 't'):
3104		/* operator > */
3105		if (!cpp_demangle_push_str(ddata, "operator>", 9))
3106			return (0);
3107		ddata->cur += 2;
3108		return (1);
3109
3110	case SIMPLE_HASH('i', 'x'):
3111		/* operator [] */
3112		if (!cpp_demangle_push_str(ddata, "operator[]", 10))
3113			return (0);
3114		ddata->cur += 2;
3115		return (1);
3116
3117	case SIMPLE_HASH('l', 'e'):
3118		/* operator <= */
3119		if (!cpp_demangle_push_str(ddata, "operator<=", 10))
3120			return (0);
3121		ddata->cur += 2;
3122		return (1);
3123
3124	case SIMPLE_HASH('l', 's'):
3125		/* operator << */
3126		if (!cpp_demangle_push_str(ddata, "operator<<", 10))
3127			return (0);
3128		ddata->cur += 2;
3129		return (1);
3130
3131	case SIMPLE_HASH('l', 'S'):
3132		/* operator <<= */
3133		if (!cpp_demangle_push_str(ddata, "operator<<=", 11))
3134			return (0);
3135		ddata->cur += 2;
3136		return (1);
3137
3138	case SIMPLE_HASH('l', 't'):
3139		/* operator < */
3140		if (!cpp_demangle_push_str(ddata, "operator<", 9))
3141			return (0);
3142		ddata->cur += 2;
3143		return (1);
3144
3145	case SIMPLE_HASH('m', 'i'):
3146		/* operator - */
3147		if (!cpp_demangle_push_str(ddata, "operator-", 9))
3148			return (0);
3149		ddata->cur += 2;
3150		return (1);
3151
3152	case SIMPLE_HASH('m', 'I'):
3153		/* operator -= */
3154		if (!cpp_demangle_push_str(ddata, "operator-=", 10))
3155			return (0);
3156		ddata->cur += 2;
3157		return (1);
3158
3159	case SIMPLE_HASH('m', 'l'):
3160		/* operator * */
3161		if (!cpp_demangle_push_str(ddata, "operator*", 9))
3162			return (0);
3163		ddata->cur += 2;
3164		return (1);
3165
3166	case SIMPLE_HASH('m', 'L'):
3167		/* operator *= */
3168		if (!cpp_demangle_push_str(ddata, "operator*=", 10))
3169			return (0);
3170		ddata->cur += 2;
3171		return (1);
3172
3173	case SIMPLE_HASH('m', 'm'):
3174		/* operator -- */
3175		if (!cpp_demangle_push_str(ddata, "operator--", 10))
3176			return (0);
3177		ddata->cur += 2;
3178		return (1);
3179
3180	case SIMPLE_HASH('n', 'a'):
3181		/* operator new[] */
3182		if (!cpp_demangle_push_str(ddata, "operator new []", 15))
3183			return (0);
3184		ddata->cur += 2;
3185		return (1);
3186
3187	case SIMPLE_HASH('n', 'e'):
3188		/* operator != */
3189		if (!cpp_demangle_push_str(ddata, "operator!=", 10))
3190			return (0);
3191		ddata->cur += 2;
3192		return (1);
3193
3194	case SIMPLE_HASH('n', 'g'):
3195		/* operator - (unary) */
3196		if (!cpp_demangle_push_str(ddata, "operator-", 9))
3197			return (0);
3198		ddata->cur += 2;
3199		return (1);
3200
3201	case SIMPLE_HASH('n', 't'):
3202		/* operator ! */
3203		if (!cpp_demangle_push_str(ddata, "operator!", 9))
3204			return (0);
3205		ddata->cur += 2;
3206		return (1);
3207
3208	case SIMPLE_HASH('n', 'w'):
3209		/* operator new */
3210		if (!cpp_demangle_push_str(ddata, "operator new", 12))
3211			return (0);
3212		ddata->cur += 2;
3213		return (1);
3214
3215	case SIMPLE_HASH('o', 'o'):
3216		/* operator || */
3217		if (!cpp_demangle_push_str(ddata, "operator||", 10))
3218			return (0);
3219		ddata->cur += 2;
3220		return (1);
3221
3222	case SIMPLE_HASH('o', 'r'):
3223		/* operator | */
3224		if (!cpp_demangle_push_str(ddata, "operator|", 9))
3225			return (0);
3226		ddata->cur += 2;
3227		return (1);
3228
3229	case SIMPLE_HASH('o', 'R'):
3230		/* operator |= */
3231		if (!cpp_demangle_push_str(ddata, "operator|=", 10))
3232			return (0);
3233		ddata->cur += 2;
3234		return (1);
3235
3236	case SIMPLE_HASH('p', 'l'):
3237		/* operator + */
3238		if (!cpp_demangle_push_str(ddata, "operator+", 9))
3239			return (0);
3240		ddata->cur += 2;
3241		return (1);
3242
3243	case SIMPLE_HASH('p', 'L'):
3244		/* operator += */
3245		if (!cpp_demangle_push_str(ddata, "operator+=", 10))
3246			return (0);
3247		ddata->cur += 2;
3248		return (1);
3249
3250	case SIMPLE_HASH('p', 'm'):
3251		/* operator ->* */
3252		if (!cpp_demangle_push_str(ddata, "operator->*", 11))
3253			return (0);
3254		ddata->cur += 2;
3255		return (1);
3256
3257	case SIMPLE_HASH('p', 'p'):
3258		/* operator ++ */
3259		if (!cpp_demangle_push_str(ddata, "operator++", 10))
3260			return (0);
3261		ddata->cur += 2;
3262		return (1);
3263
3264	case SIMPLE_HASH('p', 's'):
3265		/* operator + (unary) */
3266		if (!cpp_demangle_push_str(ddata, "operator+", 9))
3267			return (0);
3268		ddata->cur += 2;
3269		return (1);
3270
3271	case SIMPLE_HASH('p', 't'):
3272		/* operator -> */
3273		if (!cpp_demangle_push_str(ddata, "operator->", 10))
3274			return (0);
3275		ddata->cur += 2;
3276		return (1);
3277
3278	case SIMPLE_HASH('q', 'u'):
3279		/* operator ? */
3280		if (!cpp_demangle_push_str(ddata, "operator?", 9))
3281			return (0);
3282		ddata->cur += 2;
3283		return (1);
3284
3285	case SIMPLE_HASH('r', 'm'):
3286		/* operator % */
3287		if (!cpp_demangle_push_str(ddata, "operator%", 9))
3288			return (0);
3289		ddata->cur += 2;
3290		return (1);
3291
3292	case SIMPLE_HASH('r', 'M'):
3293		/* operator %= */
3294		if (!cpp_demangle_push_str(ddata, "operator%=", 10))
3295			return (0);
3296		ddata->cur += 2;
3297		return (1);
3298
3299	case SIMPLE_HASH('r', 's'):
3300		/* operator >> */
3301		if (!cpp_demangle_push_str(ddata, "operator>>", 10))
3302			return (0);
3303		ddata->cur += 2;
3304		return (1);
3305
3306	case SIMPLE_HASH('r', 'S'):
3307		/* operator >>= */
3308		if (!cpp_demangle_push_str(ddata, "operator>>=", 11))
3309			return (0);
3310		ddata->cur += 2;
3311		return (1);
3312
3313	case SIMPLE_HASH('r', 'z'):
3314		/* operator sizeof */
3315		if (!cpp_demangle_push_str(ddata, "operator sizeof ", 16))
3316			return (0);
3317		ddata->cur += 2;
3318		return (1);
3319
3320	case SIMPLE_HASH('s', 'r'):
3321		/* scope resolution operator */
3322		if (!cpp_demangle_push_str(ddata, "scope resolution operator ",
3323		    26))
3324			return (0);
3325		ddata->cur += 2;
3326		return (1);
3327
3328	case SIMPLE_HASH('s', 'v'):
3329		/* operator sizeof */
3330		if (!cpp_demangle_push_str(ddata, "operator sizeof ", 16))
3331			return (0);
3332		ddata->cur += 2;
3333		return (1);
3334	};
3335
3336	/* vendor extened operator */
3337	if (*ddata->cur == 'v' && ELFTC_ISDIGIT(*(ddata->cur + 1))) {
3338		if (!cpp_demangle_push_str(ddata, "vendor extened operator ",
3339		    24))
3340			return (0);
3341		if (!cpp_demangle_push_str(ddata, ddata->cur + 1, 1))
3342			return (0);
3343		ddata->cur += 2;
3344		return (cpp_demangle_read_sname(ddata));
3345	}
3346
3347	/* ctor-dtor-name */
3348	switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
3349	case SIMPLE_HASH('C', '1'):
3350		/* FALLTHROUGH */
3351	case SIMPLE_HASH('C', '2'):
3352		/* FALLTHROUGH */
3353	case SIMPLE_HASH('C', '3'):
3354		if (ddata->last_sname == NULL)
3355			return (0);
3356		if ((len = strlen(ddata->last_sname)) == 0)
3357			return (0);
3358		if (!cpp_demangle_push_str(ddata, "::", 2))
3359			return (0);
3360		if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
3361			return (0);
3362		ddata->cur +=2;
3363		return (1);
3364
3365	case SIMPLE_HASH('D', '0'):
3366		/* FALLTHROUGH */
3367	case SIMPLE_HASH('D', '1'):
3368		/* FALLTHROUGH */
3369	case SIMPLE_HASH('D', '2'):
3370		if (ddata->last_sname == NULL)
3371			return (0);
3372		if ((len = strlen(ddata->last_sname)) == 0)
3373			return (0);
3374		if (!cpp_demangle_push_str(ddata, "::~", 3))
3375			return (0);
3376		if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
3377			return (0);
3378		ddata->cur +=2;
3379		return (1);
3380	};
3381
3382	/* source name */
3383	if (ELFTC_ISDIGIT(*ddata->cur) != 0)
3384		return (cpp_demangle_read_sname(ddata));
3385
3386	/* local source name */
3387	if (*ddata->cur == 'L')
3388		return (cpp_demangle_local_source_name(ddata));
3389
3390	return (1);
3391}
3392
3393/*
3394 * Read local source name.
3395 *
3396 * References:
3397 *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31775
3398 *   http://gcc.gnu.org/viewcvs?view=rev&revision=124467
3399 */
3400static int
3401cpp_demangle_local_source_name(struct cpp_demangle_data *ddata)
3402{
3403	/* L */
3404	if (ddata == NULL || *ddata->cur != 'L')
3405		return (0);
3406	++ddata->cur;
3407
3408	/* source name */
3409	if (!cpp_demangle_read_sname(ddata))
3410		return (0);
3411
3412	/* discriminator */
3413	if (*ddata->cur == '_') {
3414		++ddata->cur;
3415		while (ELFTC_ISDIGIT(*ddata->cur) != 0)
3416			++ddata->cur;
3417	}
3418
3419	return (1);
3420}
3421
3422static int
3423cpp_demangle_read_v_offset(struct cpp_demangle_data *ddata)
3424{
3425
3426	if (ddata == NULL)
3427		return (0);
3428
3429	if (!cpp_demangle_push_str(ddata, "offset : ", 9))
3430		return (0);
3431
3432	if (!cpp_demangle_read_offset_number(ddata))
3433		return (0);
3434
3435	if (!cpp_demangle_push_str(ddata, "virtual offset : ", 17))
3436		return (0);
3437
3438	return (!cpp_demangle_read_offset_number(ddata));
3439}
3440
3441/*
3442 * Decode floating point representation to string
3443 * Return new allocated string or NULL
3444 *
3445 * Todo
3446 * Replace these functions to macro.
3447 */
3448static char *
3449decode_fp_to_double(const char *p, size_t len)
3450{
3451	double f;
3452	size_t rtn_len, limit, i;
3453	int byte;
3454	char *rtn;
3455
3456	if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(double))
3457		return (NULL);
3458
3459	memset(&f, 0, sizeof(double));
3460
3461	for (i = 0; i < len / 2; ++i) {
3462		byte = hex_to_dec(p[len - i * 2 - 1]) +
3463		    hex_to_dec(p[len - i * 2 - 2]) * 16;
3464
3465		if (byte < 0 || byte > 255)
3466			return (NULL);
3467
3468#if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3469		((unsigned char *)&f)[i] = (unsigned char)(byte);
3470#else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3471		((unsigned char *)&f)[sizeof(double) - i - 1] =
3472		    (unsigned char)(byte);
3473#endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3474	}
3475
3476	rtn_len = 64;
3477	limit = 0;
3478again:
3479	if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3480		return (NULL);
3481
3482	if (snprintf(rtn, rtn_len, "%fld", f) >= (int)rtn_len) {
3483		free(rtn);
3484		if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3485			return (NULL);
3486		rtn_len *= BUFFER_GROWFACTOR;
3487		goto again;
3488	}
3489
3490	return rtn;
3491}
3492
3493static char *
3494decode_fp_to_float(const char *p, size_t len)
3495{
3496	size_t i, rtn_len, limit;
3497	float f;
3498	int byte;
3499	char *rtn;
3500
3501	if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(float))
3502		return (NULL);
3503
3504	memset(&f, 0, sizeof(float));
3505
3506	for (i = 0; i < len / 2; ++i) {
3507		byte = hex_to_dec(p[len - i * 2 - 1]) +
3508		    hex_to_dec(p[len - i * 2 - 2]) * 16;
3509		if (byte < 0 || byte > 255)
3510			return (NULL);
3511#if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3512		((unsigned char *)&f)[i] = (unsigned char)(byte);
3513#else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3514		((unsigned char *)&f)[sizeof(float) - i - 1] =
3515		    (unsigned char)(byte);
3516#endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3517	}
3518
3519	rtn_len = 64;
3520	limit = 0;
3521again:
3522	if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3523		return (NULL);
3524
3525	if (snprintf(rtn, rtn_len, "%ff", f) >= (int)rtn_len) {
3526		free(rtn);
3527		if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3528			return (NULL);
3529		rtn_len *= BUFFER_GROWFACTOR;
3530		goto again;
3531	}
3532
3533	return rtn;
3534}
3535
3536static char *
3537decode_fp_to_float128(const char *p, size_t len)
3538{
3539	long double f;
3540	size_t rtn_len, limit, i;
3541	int byte;
3542	unsigned char buf[FLOAT_QUADRUPLE_BYTES];
3543	char *rtn;
3544
3545	switch(sizeof(long double)) {
3546	case FLOAT_QUADRUPLE_BYTES:
3547		return (decode_fp_to_long_double(p, len));
3548	case FLOAT_EXTENED_BYTES:
3549		if (p == NULL || len == 0 || len % 2 != 0 ||
3550		    len / 2 > FLOAT_QUADRUPLE_BYTES)
3551			return (NULL);
3552
3553		memset(buf, 0, FLOAT_QUADRUPLE_BYTES);
3554
3555		for (i = 0; i < len / 2; ++i) {
3556			byte = hex_to_dec(p[len - i * 2 - 1]) +
3557			    hex_to_dec(p[len - i * 2 - 2]) * 16;
3558			if (byte < 0 || byte > 255)
3559				return (NULL);
3560#if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3561			buf[i] = (unsigned char)(byte);
3562#else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3563			buf[FLOAT_QUADRUPLE_BYTES - i -1] =
3564			    (unsigned char)(byte);
3565#endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3566		}
3567		memset(&f, 0, FLOAT_EXTENED_BYTES);
3568
3569#if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3570		memcpy(&f, buf, FLOAT_EXTENED_BYTES);
3571#else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3572		memcpy(&f, buf + 6, FLOAT_EXTENED_BYTES);
3573#endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3574
3575		rtn_len = 256;
3576		limit = 0;
3577again:
3578		if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3579			return (NULL);
3580
3581		if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3582			free(rtn);
3583			if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3584				return (NULL);
3585			rtn_len *= BUFFER_GROWFACTOR;
3586			goto again;
3587		}
3588
3589		return (rtn);
3590	default:
3591		return (NULL);
3592	}
3593}
3594
3595static char *
3596decode_fp_to_float80(const char *p, size_t len)
3597{
3598	long double f;
3599	size_t rtn_len, limit, i;
3600	int byte;
3601	unsigned char buf[FLOAT_EXTENED_BYTES];
3602	char *rtn;
3603
3604	switch(sizeof(long double)) {
3605	case FLOAT_QUADRUPLE_BYTES:
3606		if (p == NULL || len == 0 || len % 2 != 0 ||
3607		    len / 2 > FLOAT_EXTENED_BYTES)
3608			return (NULL);
3609
3610		memset(buf, 0, FLOAT_EXTENED_BYTES);
3611
3612		for (i = 0; i < len / 2; ++i) {
3613			byte = hex_to_dec(p[len - i * 2 - 1]) +
3614			    hex_to_dec(p[len - i * 2 - 2]) * 16;
3615
3616			if (byte < 0 || byte > 255)
3617				return (NULL);
3618
3619#if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3620			buf[i] = (unsigned char)(byte);
3621#else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3622			buf[FLOAT_EXTENED_BYTES - i -1] =
3623			    (unsigned char)(byte);
3624#endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3625		}
3626
3627		memset(&f, 0, FLOAT_QUADRUPLE_BYTES);
3628
3629#if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3630		memcpy(&f, buf, FLOAT_EXTENED_BYTES);
3631#else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3632		memcpy((unsigned char *)(&f) + 6, buf, FLOAT_EXTENED_BYTES);
3633#endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3634
3635		rtn_len = 256;
3636		limit = 0;
3637again:
3638		if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3639			return (NULL);
3640
3641		if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3642			free(rtn);
3643			if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3644				return (NULL);
3645			rtn_len *= BUFFER_GROWFACTOR;
3646			goto again;
3647		}
3648
3649		return (rtn);
3650	case FLOAT_EXTENED_BYTES:
3651		return (decode_fp_to_long_double(p, len));
3652	default:
3653		return (NULL);
3654	}
3655}
3656
3657static char *
3658decode_fp_to_long_double(const char *p, size_t len)
3659{
3660	long double f;
3661	size_t rtn_len, limit, i;
3662	int byte;
3663	char *rtn;
3664
3665	if (p == NULL || len == 0 || len % 2 != 0 ||
3666	    len / 2 > sizeof(long double))
3667		return (NULL);
3668
3669	memset(&f, 0, sizeof(long double));
3670
3671	for (i = 0; i < len / 2; ++i) {
3672		byte = hex_to_dec(p[len - i * 2 - 1]) +
3673		    hex_to_dec(p[len - i * 2 - 2]) * 16;
3674
3675		if (byte < 0 || byte > 255)
3676			return (NULL);
3677
3678#if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3679		((unsigned char *)&f)[i] = (unsigned char)(byte);
3680#else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3681		((unsigned char *)&f)[sizeof(long double) - i - 1] =
3682		    (unsigned char)(byte);
3683#endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3684	}
3685
3686	rtn_len = 256;
3687	limit = 0;
3688again:
3689	if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3690		return (NULL);
3691
3692	if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3693		free(rtn);
3694		if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3695			return (NULL);
3696		rtn_len *= BUFFER_GROWFACTOR;
3697		goto again;
3698	}
3699
3700	return (rtn);
3701}
3702
3703/* Simple hex to integer function used by decode_to_* function. */
3704static int
3705hex_to_dec(char c)
3706{
3707
3708	switch (c) {
3709	case '0':
3710		return (0);
3711	case '1':
3712		return (1);
3713	case '2':
3714		return (2);
3715	case '3':
3716		return (3);
3717	case '4':
3718		return (4);
3719	case '5':
3720		return (5);
3721	case '6':
3722		return (6);
3723	case '7':
3724		return (7);
3725	case '8':
3726		return (8);
3727	case '9':
3728		return (9);
3729	case 'a':
3730		return (10);
3731	case 'b':
3732		return (11);
3733	case 'c':
3734		return (12);
3735	case 'd':
3736		return (13);
3737	case 'e':
3738		return (14);
3739	case 'f':
3740		return (15);
3741	default:
3742		return (-1);
3743	};
3744}
3745
3746static void
3747vector_read_cmd_dest(struct vector_read_cmd *v)
3748{
3749
3750	if (v == NULL)
3751		return;
3752
3753	free(v->r_container);
3754}
3755
3756/* return -1 at failed, 0 at not found, 1 at found. */
3757static int
3758vector_read_cmd_find(struct vector_read_cmd *v, enum read_cmd dst)
3759{
3760	size_t i;
3761
3762	if (v == NULL || dst == READ_FAIL)
3763		return (-1);
3764
3765	for (i = 0; i < v->size; ++i)
3766		if (v->r_container[i] == dst)
3767			return (1);
3768
3769	return (0);
3770}
3771
3772static int
3773vector_read_cmd_init(struct vector_read_cmd *v)
3774{
3775
3776	if (v == NULL)
3777		return (0);
3778
3779	v->size = 0;
3780	v->capacity = VECTOR_DEF_CAPACITY;
3781
3782	if ((v->r_container = malloc(sizeof(enum read_cmd) * v->capacity))
3783	    == NULL)
3784		return (0);
3785
3786	return (1);
3787}
3788
3789static int
3790vector_read_cmd_pop(struct vector_read_cmd *v)
3791{
3792
3793	if (v == NULL || v->size == 0)
3794		return (0);
3795
3796	--v->size;
3797	v->r_container[v->size] = READ_FAIL;
3798
3799	return (1);
3800}
3801
3802static int
3803vector_read_cmd_push(struct vector_read_cmd *v, enum read_cmd cmd)
3804{
3805	enum read_cmd *tmp_r_ctn;
3806	size_t tmp_cap;
3807	size_t i;
3808
3809	if (v == NULL)
3810		return (0);
3811
3812	if (v->size == v->capacity) {
3813		tmp_cap = v->capacity * BUFFER_GROWFACTOR;
3814		if ((tmp_r_ctn = malloc(sizeof(enum read_cmd) * tmp_cap))
3815		    == NULL)
3816			return (0);
3817		for (i = 0; i < v->size; ++i)
3818			tmp_r_ctn[i] = v->r_container[i];
3819		free(v->r_container);
3820		v->r_container = tmp_r_ctn;
3821		v->capacity = tmp_cap;
3822	}
3823
3824	v->r_container[v->size] = cmd;
3825	++v->size;
3826
3827	return (1);
3828}
3829
3830static void
3831vector_type_qualifier_dest(struct vector_type_qualifier *v)
3832{
3833
3834	if (v == NULL)
3835		return;
3836
3837	free(v->q_container);
3838	vector_str_dest(&v->ext_name);
3839}
3840
3841/* size, capacity, ext_name */
3842static int
3843vector_type_qualifier_init(struct vector_type_qualifier *v)
3844{
3845
3846	if (v == NULL)
3847		return (0);
3848
3849	v->size = 0;
3850	v->capacity = VECTOR_DEF_CAPACITY;
3851
3852	if ((v->q_container = malloc(sizeof(enum type_qualifier) * v->capacity))
3853	    == NULL)
3854		return (0);
3855
3856	assert(v->q_container != NULL);
3857
3858	if (vector_str_init(&v->ext_name) == false) {
3859		free(v->q_container);
3860		return (0);
3861	}
3862
3863	return (1);
3864}
3865
3866static int
3867vector_type_qualifier_push(struct vector_type_qualifier *v,
3868    enum type_qualifier t)
3869{
3870	enum type_qualifier *tmp_ctn;
3871	size_t tmp_cap;
3872	size_t i;
3873
3874	if (v == NULL)
3875		return (0);
3876
3877	if (v->size == v->capacity) {
3878		tmp_cap = v->capacity * BUFFER_GROWFACTOR;
3879		if ((tmp_ctn = malloc(sizeof(enum type_qualifier) * tmp_cap))
3880		    == NULL)
3881			return (0);
3882		for (i = 0; i < v->size; ++i)
3883			tmp_ctn[i] = v->q_container[i];
3884		free(v->q_container);
3885		v->q_container = tmp_ctn;
3886		v->capacity = tmp_cap;
3887	}
3888
3889	v->q_container[v->size] = t;
3890	++v->size;
3891
3892	return (1);
3893}
3894