struct demangle_component * cplus_demangle_v3_components (const char *mangled, int options, void **mem) { size_t len; int type; struct d_info di; struct demangle_component *dc; len = strlen (mangled); if (mangled[0] == '_' && mangled[1] == 'Z') type = 0; else { if ((options & DMGL_TYPES) == 0) return NULL; type = 1; } cplus_demangle_init_info(mangled, options, len, &di); di.comps = ((struct demangle_component *) malloc((size_t)di.num_comps * sizeof(struct demangle_component))); di.subs = ((struct demangle_component **) malloc((size_t)di.num_subs * sizeof(struct demangle_component *))); if (di.comps == NULL || di.subs == NULL) { if (di.comps != NULL) free(di.comps); if (di.subs != NULL) free(di.subs); return NULL; } if (! type) dc = cplus_demangle_mangled_name(&di, 1); else dc = cplus_demangle_type(&di); /* If DMGL_PARAMS is set, then if we didn't consume the entire mangled string, then we didn't successfully demangle it. */ if (((options & DMGL_PARAMS) != 0) && (d_peek_char(&di) != '\0')) dc = NULL; free(di.subs); if (dc != NULL) *mem = di.comps; else free(di.comps); return dc; }
static int is_ctor_or_dtor (const char *mangled, enum gnu_v3_ctor_kinds *ctor_kind, enum gnu_v3_dtor_kinds *dtor_kind) { struct d_info di; struct demangle_component *dc; int ret; *ctor_kind = (enum gnu_v3_ctor_kinds) 0; *dtor_kind = (enum gnu_v3_dtor_kinds) 0; cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di); { #ifdef CP_DYNAMIC_ARRAYS __extension__ struct demangle_component comps[di.num_comps]; __extension__ struct demangle_component *subs[di.num_subs]; di.comps = comps; di.subs = subs; #else di.comps = alloca (di.num_comps * sizeof (*di.comps)); di.subs = alloca (di.num_subs * sizeof (*di.subs)); #endif dc = cplus_demangle_mangled_name (&di, 1); /* Note that because we did not pass DMGL_PARAMS, we don't expect to demangle the entire string. */ ret = 0; while (dc != NULL) { switch (dc->type) { default: dc = NULL; break; case DEMANGLE_COMPONENT_TYPED_NAME: case DEMANGLE_COMPONENT_TEMPLATE: case DEMANGLE_COMPONENT_RESTRICT_THIS: case DEMANGLE_COMPONENT_VOLATILE_THIS: case DEMANGLE_COMPONENT_CONST_THIS: dc = d_left (dc); break; case DEMANGLE_COMPONENT_QUAL_NAME: case DEMANGLE_COMPONENT_LOCAL_NAME: dc = d_right (dc); break; case DEMANGLE_COMPONENT_CTOR: *ctor_kind = dc->u.s_ctor.kind; ret = 1; dc = NULL; break; case DEMANGLE_COMPONENT_DTOR: *dtor_kind = dc->u.s_dtor.kind; ret = 1; dc = NULL; break; } } } return ret; }