- unsigned long qualmap = 0, typemap;
- const char *tag = NULL;
- size_t ret = 0;
-
- typemap = cdecl__build_typemap(s);
- if (typemap == -1)
- return 0;
-
- for (struct cdecl_declspec *c = s; c; c = c->next) {
- switch (cdecl_spec_kind(c)) {
- case CDECL_SPEC_QUAL:
- qualmap |= 1ul << (c->type & 0xff);
- break;
- case CDECL_SPEC_TYPE:
- /* Valid C types have at most one identifier. */
- if (c->ident)
- tag = c->ident;
- break;
- }
- }
-
- if (qualmap & (1ul << (CDECL_QUAL_RESTRICT & 0xff)))
- ret += output(buf, n, ret, "restrict ");
- if (qualmap & (1ul << (CDECL_QUAL_VOLATILE & 0xff)))
- ret += output(buf, n, ret, "volatile ");
- if (qualmap & (1ul << (CDECL_QUAL_CONST & 0xff)))
- ret += output(buf, n, ret, "const ");
-
- ret += output(buf, n, ret, "%s", cdecl__explain_typemap(typemap));
- if (tag)
- ret += output(buf, n, ret, " %s", tag);
- return ret;
+ explain_specs(dst, p->qualifiers, -1);
+ cdecl__emit(dst, "pointer to ");