Rather than threading a flag through this function just to print
"declare" or "type" at the toplevel, we can just directly print
that in the one place where it is needed, which simplifies the
implementation a bit.
return cdecl__explain_specs(buf, n, s, CDECL_SPEC_QUAL|CDECL_SPEC_TYPE);
}
return cdecl__explain_specs(buf, n, s, CDECL_SPEC_QUAL|CDECL_SPEC_TYPE);
}
-/*
- * Renders the start of the thing being declared. If top is true, print
- * the "declare" or "type" keywords at the front, as appropriate.
- */
-explain_prologue(char *buf, size_t n, struct cdecl_declarator *d, bool top)
+explain_name(char *buf, size_t n, struct cdecl_declarator *d)
- size_t ret = 0, rc = 0;
-
- while (d) {
- switch (d->type) {
- case CDECL_DECL_NULL:
- if (top)
- return snprintf(buf, n, "type");
- return 0;
- case CDECL_DECL_IDENT:
- if (top)
- rc = snprintf(buf, n, "declare");
- ret += cdecl__advance(&buf, &n, rc);
- return ret + snprintf(buf, n, "%s as", d->u.ident);
- }
-
+ if (d->type != CDECL_DECL_IDENT)
+ return 0;
+
+ return snprintf(buf, n, "%s as", d->u.ident);
static size_t
explain_declarators(char *buf, size_t n, struct cdecl_declarator *decl);
static size_t
explain_declarators(char *buf, size_t n, struct cdecl_declarator *decl);
-static size_t explain_decl(char *buf, size_t n, struct cdecl *decl, bool top)
+static size_t explain_decl(char *buf, size_t n, struct cdecl *decl)
- rc = explain_prologue(buf, n, decl->declarators, top);
+ rc = explain_name(buf, n, decl->declarators);
ret += cdecl__advance(&buf, &n, rc);
rc = explain_pre_specs(buf, n, decl->specifiers);
ret += cdecl__advance(&buf, &n, rc);
rc = explain_pre_specs(buf, n, decl->specifiers);
ret += cdecl__advance_(&buf, &n, rc);
for (struct cdecl *p = f->parameters; p; p = p->next) {
ret += cdecl__advance_(&buf, &n, rc);
for (struct cdecl *p = f->parameters; p; p = p->next) {
- rc = explain_decl(buf, n, p, false);
+ rc = explain_decl(buf, n, p);
ret += cdecl__advance_(&buf, &n, rc);
if (p->next)
ret += cdecl__advance_(&buf, &n, rc);
if (p->next)
size_t cdecl_explain(char *buf, size_t n, struct cdecl *decl)
{
size_t cdecl_explain(char *buf, size_t n, struct cdecl *decl)
{
- return explain_decl(buf, n, decl, true);
+ size_t ret, rc;
+
+ if (cdecl_is_abstract(decl->declarators))
+ rc = snprintf(buf, n, "type");
+ else
+ rc = snprintf(buf, n, "declare");
+ ret = cdecl__advance(&buf, &n, rc);
+
+ return ret + explain_decl(buf, n, decl);