+static const char *to_specstring(unsigned type)
+{
+ switch (type) {
+ 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";
+ case CDECL_FUNC_INLINE: return "inline";
+ case CDECL_QUAL_RESTRICT: return "restrict";
+ case CDECL_QUAL_VOLATILE: return "volatile";
+ case CDECL_QUAL_CONST: return "const";
+ case CDECL_TYPE_VOID: return "void";
+ case CDECL_TYPE_SIGNED: return "signed";
+ case CDECL_TYPE_UNSIGNED: return "unsigned";
+ case CDECL_TYPE_CHAR: return "char";
+ case CDECL_TYPE_SHORT: return "short";
+ case CDECL_TYPE_LONG: return "long";
+ case CDECL_TYPE_INT: return "int";
+ case CDECL_TYPE_FLOAT: return "float";
+ case CDECL_TYPE_DOUBLE: return "double";
+ case CDECL_TYPE_COMPLEX: return "_Complex";
+ case CDECL_TYPE_IMAGINARY: return "_Imaginary";
+ case CDECL_TYPE_BOOL: return "_Bool";
+ case CDECL_TYPE_STRUCT: return "struct";
+ case CDECL_TYPE_UNION: return "union";
+ case CDECL_TYPE_ENUM: return "enum";
+ }
+
+ return "";
+}
+
+static void print_spec(struct cdecl_declspec *spec)
+{
+ const char *s = to_specstring(spec->type);
+
+ printf("%s", s);
+ if (spec->ident) {
+ if (s[0])
+ putchar(' ');
+ printf("%s", spec->ident);
+ }
+}
+