- const char *tag = NULL;
- unsigned long typemap;
- size_t ret = 0, rc;
-
- typemap = cdecl__build_typemap(s);
- if (typemap == -1)
- return 0;
-
- for (struct cdecl_declspec *c = s; c; c = c->next) {
- if (cdecl_spec_kind(c) != CDECL_SPEC_TYPE)
- continue;
-
- /* Valid C types have at most one identifier. */
- if (c->ident)
- tag = c->ident;
- }
-
- rc = explain_qualifiers(buf, n, s);
- ret += advance(&buf, &n, rc);
-
- rc = snprintf(buf, n, "%s", cdecl__explain_typemap(typemap));
- if (tag) {
- ret += advance(&buf, &n, rc);
- rc = snprintf(buf, n, "%s", tag);
- }
-
- return ret + rc;
-}
-
-static const char *explain_storage(unsigned spec)
-{
- switch (spec) {
- case CDECL_STOR_TYPEDEF:
- return "typedef";
- case CDECL_STOR_EXTERN:
- return "extern";
- case CDECL_STOR_STATIC:
- return "static";
- case CDECL_STOR_AUTO:
- return "auto";
- case CDECL_STOR_REGISTER:
- return "register";
- default:
- assert(0);
- }
-}