return ret + cdecl__advance_(buf, n, rc);
}
-static size_t explain_spec(char *buf, size_t n, struct cdecl_declspec *s)
+static const char *explain_spec_simple(struct cdecl_declspec *s)
{
switch (s->type) {
- /* Function specifiers */
- case CDECL_FUNC_INLINE:
- return snprintf(buf, n, "inline");
- /* Storage-class specifiers */
- case CDECL_STOR_TYPEDEF:
- return snprintf(buf, n, "typedef");
- case CDECL_STOR_EXTERN:
- return snprintf(buf, n, "extern");
- case CDECL_STOR_STATIC:
- return snprintf(buf, n, "static");
- case CDECL_STOR_AUTO:
- return snprintf(buf, n, "auto");
- case CDECL_STOR_REGISTER:
- return snprintf(buf, n, "register");
- /* Type qualifiers */
- case CDECL_QUAL_RESTRICT:
- return snprintf(buf, n, "restrict");
- case CDECL_QUAL_VOLATILE:
- return snprintf(buf, n, "volatile");
- case CDECL_QUAL_CONST:
- return snprintf(buf, n, "const");
- /* Type specifiers */
- case CDECL_TYPE_VOID:
- return snprintf(buf, n, "void");
- case CDECL_TYPE_CHAR:
- return snprintf(buf, n, "char");
- case CDECL_TYPE_SHORT:
- return snprintf(buf, n, "short");
- case CDECL_TYPE_INT:
- return snprintf(buf, n, "int");
- case CDECL_TYPE_LONG:
- return snprintf(buf, n, "long");
- case CDECL_TYPE_FLOAT:
- return snprintf(buf, n, "float");
- case CDECL_TYPE_DOUBLE:
- return snprintf(buf, n, "double");
- case CDECL_TYPE_SIGNED:
- return snprintf(buf, n, "signed");
- case CDECL_TYPE_UNSIGNED:
- return snprintf(buf, n, "unsigned");
- case CDECL_TYPE_BOOL:
- return snprintf(buf, n, "_Bool");
- case CDECL_TYPE_COMPLEX:
- return snprintf(buf, n, "_Complex");
- case CDECL_TYPE_IMAGINARY:
- return snprintf(buf, n, "_Imaginary");
- case CDECL_TYPE_STRUCT:
- return snprintf(buf, n, "struct %s", s->ident);
- case CDECL_TYPE_UNION:
- return snprintf(buf, n, "union %s", s->ident);
- case CDECL_TYPE_ENUM:
- return snprintf(buf, n, "enum %s", s->ident);
- case CDECL_TYPE_IDENT:
- return snprintf(buf, n, "%s", s->ident);
- default:
- assert(0);
+# include "namespecs.h"
}
+
+ assert(0);
+}
+
+static size_t explain_spec(char *buf, size_t n, struct cdecl_declspec *s)
+{
+ const char *keyword = explain_spec_simple(s);
+
+ if (keyword[0] && s->ident)
+ return snprintf(buf, n, "%s %s", keyword, s->ident);
+ else if (s->ident)
+ return snprintf(buf, n, "%s", s->ident);
+ return snprintf(buf, n, "%s", keyword);
}
/*