-#include "typemap.h"
-
-static size_t advance_(char **buf, size_t *n, size_t amount)
-{
- if (amount >= *n) {
- *n = 0;
- *buf = 0;
- } else {
- *buf += amount;
- *n -= amount;
- }
-
- return amount;
-}
-
-static size_t advance(char **buf, size_t *n, size_t amount)
-{
- size_t ret, rc;
-
- if (!amount)
- return 0;
-
- ret = advance_(buf, n, amount);
- rc = snprintf(*buf, *n, " ");
- return ret + advance_(buf, n, rc);
-}
-
-static size_t
-explain_qualifiers(char *buf, size_t n, struct cdecl_declspec *s)
-{
- unsigned long qualmap = 0;
- size_t ret = 0, rc = 0;
-
- for (struct cdecl_declspec *c = s; c; c = c->next) {
- if (cdecl_spec_kind(c) != CDECL_SPEC_QUAL)
- continue;
- qualmap |= 1ul << (c->type & 0xff);
- }
-
- if (qualmap & (1ul << (CDECL_QUAL_RESTRICT & 0xff))) {
- ret += advance(&buf, &n, rc);
- rc = snprintf(buf, n, "restrict");
- }
- if (qualmap & (1ul << (CDECL_QUAL_VOLATILE & 0xff))) {
- ret += advance(&buf, &n, rc);
- rc = snprintf(buf, n, "volatile");
- }
- if (qualmap & (1ul << (CDECL_QUAL_CONST & 0xff))) {
- ret += advance(&buf, &n, rc);
- rc = snprintf(buf, n, "const");
- }
-
- return ret + rc;
-}
-
-/* Renders the type qualifiers and type specifiers in canonical form. */
-static size_t
-explain_post_specs(char *buf, size_t n, struct cdecl_declspec *s)
-{
- 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;