From 3d8b54b105613351b86cf5929fe9fd4e5934afea Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Wed, 21 Jun 2023 20:46:53 -0400 Subject: [PATCH] libcdecl: Simplify explain_decl -> explain_prologue. 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. --- src/explain.c | 44 ++++++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/src/explain.c b/src/explain.c index 877d6db..fe3ed7d 100644 --- a/src/explain.c +++ b/src/explain.c @@ -37,32 +37,16 @@ static size_t explain_post_specs(char *buf, size_t n, struct cdecl_declspec *s) 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. - */ static size_t -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); - } - + while (d->child) d = d->child; - } - assert(0); + if (d->type != CDECL_DECL_IDENT) + return 0; + + return snprintf(buf, n, "%s as", d->u.ident); } static size_t @@ -101,11 +85,11 @@ explain_array(char *buf, size_t n, struct cdecl_array *a) 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) { size_t ret = 0, rc; - 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); @@ -129,7 +113,7 @@ static size_t explain_function(char *buf, size_t n, struct cdecl_function *f) 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) @@ -170,5 +154,13 @@ explain_declarators(char *buf, size_t n, struct cdecl_declarator *d) 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); } -- 2.43.2