]> git.draconx.ca Git - cdecl99.git/commitdiff
Add a child pointer to cdecl_declarator.
authorNick Bowler <nbowler@draconx.ca>
Tue, 5 Jul 2011 22:23:52 +0000 (18:23 -0400)
committerNick Bowler <nbowler@draconx.ca>
Tue, 5 Jul 2011 22:23:52 +0000 (18:23 -0400)
This eliminates the need for separate child pointers for each
declarator type.

src/cdecl.h
src/explain.c
src/parse.y

index 9c06b799c261a674df2301f9f26ab2055006cf32..536135f0e0ec90b822b4e8f5e4e761107a1d609d 100644 (file)
@@ -54,18 +54,16 @@ struct cdecl {
        } *specifiers;
 
        struct cdecl_declarator {
-               struct cdecl_declarator *next;
+               struct cdecl_declarator *next, *child;
                unsigned type;
                union {
                        char *ident;
                        struct cdecl_pointer {
-                               struct cdecl_declspec   *qualifiers;
-                               struct cdecl_declarator *declarator;
+                               struct cdecl_declspec *qualifiers;
                        } pointer;
                        struct cdecl_array {
                                char *vla;
                                uintmax_t length;
-                               struct cdecl_declarator *declarator;
                        } array;
                } u;
        } *declarators;
index e0916a8a4e9a5e5c181c300cc7aec7e734476326..60e880b0586b2e4c7b47ca5d9f48d6b3ee07b5eb 100644 (file)
@@ -159,20 +159,6 @@ static size_t explain_pre_specs(char *buf, size_t n, struct cdecl_declspec *s)
        return ret;
 }
 
-static struct cdecl_declarator *next_declarator(struct cdecl_declarator *d)
-{
-       switch (d->type) {
-       case CDECL_DECL_IDENT:
-               return NULL;
-       case CDECL_DECL_POINTER:
-               return d->u.pointer.declarator;
-       case CDECL_DECL_ARRAY:
-               return d->u.array.declarator;
-       default:
-               assert(0);
-       }
-}
-
 /* Renders the name of the thing being declared. */
 static size_t
 explain_prologue(char *buf, size_t n, struct cdecl_declarator *d)
@@ -183,7 +169,7 @@ explain_prologue(char *buf, size_t n, struct cdecl_declarator *d)
                                return snprintf(buf, n, "type");
                        return snprintf(buf, n, "declare %s as", d->u.ident);
                }
-               d = next_declarator(d);
+               d = d->child;
        }
 }
 
@@ -228,7 +214,7 @@ explain_declarators(char *buf, size_t n, struct cdecl_declarator *d)
        if (d->type == CDECL_DECL_IDENT)
                return 0;
 
-       rc = explain_declarators(buf, n, next_declarator(d));
+       rc = explain_declarators(buf, n, d->child);
        ret += advance(&buf, &n, rc);
 
        switch (d->type) {
index 06cbc07d96418508f6a951271819ac38095258f2..b21a1d4b951021d4138e3036d04c0d968b89f7cd 100644 (file)
@@ -84,15 +84,15 @@ static void free_declarator(struct cdecl_declarator *x)
                        break;
                case CDECL_DECL_POINTER:
                        free_declspec(x->u.pointer.qualifiers);
-                       free_declarator(x->u.pointer.declarator);
                        break;
                case CDECL_DECL_ARRAY:
                        free(x->u.array.vla);
-                       free_declarator(x->u.array.declarator);
                        break;
                default:
                        assert(0);
                }
+
+               free_declarator(x->child);
                free(x);
                x = p;
        }
@@ -281,12 +281,12 @@ pointer: T_ASTERISK qualifiers direct_declarator {
        ALLOC_STRUCT($$, struct cdecl_declarator,
                .type = CDECL_DECL_POINTER,
                .u.pointer.qualifiers = $2,
-               .u.pointer.declarator = $3);
+               .child = $3);
 } | T_ASTERISK qualifiers pointer {
        ALLOC_STRUCT($$, struct cdecl_declarator,
                .type = CDECL_DECL_POINTER,
                .u.pointer.qualifiers = $2,
-               .u.pointer.declarator = $3);
+               .child = $3);
 }
 
 declarator: direct_declarator | pointer;
@@ -301,7 +301,7 @@ direct_declarator: {
                .u.ident = $1);
 } | direct_declarator array {
        $$ = $2;
-       $$->u.array.declarator = $1;
+       $$->child = $1;
 } | T_LPAREN declarator T_RPAREN {
        $$ = $2;
 };