- 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:
- abort();
- }
-}
-
-/* Renders the storage-class and function specifiers in canonical form. */
-static size_t explain_pre_specs(char *buf, size_t n, struct cdecl_declspec *s)
-{
- unsigned long funcmap = 0;
- const char *storage = NULL;
- size_t ret = 0;
-
- for (struct cdecl_declspec *c = s; c; c = c->next) {
- switch (cdecl_spec_kind(c)) {
- case CDECL_SPEC_FUNC:
- funcmap |= 1ul << (c->type & 0xff);
- break;
- case CDECL_SPEC_STOR:
- /* Valid C declarations have at most one
- * storage-class specifier. */
- storage = explain_storage(c->type);
- break;
- }
- }
-
- if (storage)
- ret += output(buf, n, ret, "%s", storage);
- if (funcmap & (1ul << (CDECL_FUNC_INLINE & 0xff)))
- ret += output(buf, n, ret, "%.*s%s", !!ret, "", "inline");
- return ret;
-}
-
-static struct cdecl_declarator *next_declarator(struct cdecl_declarator *d)
-{
- switch (d->type) {
- case CDECL_DECL_IDENT:
- return NULL;
- case CDECL_DECL_POINTER:
- return d->u.pointer.declarator;
- case CDECL_DECL_ARRAY:
- return d->u.array.declarator;
- default:
- abort();
- }
-}