/*
* Helper functions for outputting text.
- * Copyright © 2011 Nick Bowler
+ * Copyright © 2011, 2021 Nick Bowler
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include <stdio.h>
#include <assert.h>
-#include "typemap.h"
-#include "output.h"
#include "cdecl.h"
+#include "cdecl-internal.h"
size_t cdecl__advance_(char **buf, size_t *n, size_t amount)
{
return ret + cdecl__advance_(buf, n, rc);
}
+#include "specstr.h"
+
static size_t explain_spec(char *buf, size_t n, 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:
+ const char *keyword = spec_string(s->type);
+
+ 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);
- default:
- assert(0);
- }
+ return snprintf(buf, n, "%s", keyword);
}
/*