]> git.draconx.ca Git - cdecl99.git/commitdiff
libcdecl: Simplify explain_decl -> explain_prologue.
authorNick Bowler <nbowler@draconx.ca>
Thu, 22 Jun 2023 00:46:53 +0000 (20:46 -0400)
committerNick Bowler <nbowler@draconx.ca>
Thu, 22 Jun 2023 00:46:53 +0000 (20:46 -0400)
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

index 877d6db511363437253a6f9b912aa85199a8dfd9..fe3ed7d9904ea4bc9f4bb127858a23e1d3965a30 100644 (file)
@@ -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);
 }