From 7022b70b587d5d4a7f4a24dc3943326e9cba4ad1 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Tue, 5 Jul 2011 18:23:52 -0400 Subject: [PATCH] Add a child pointer to cdecl_declarator. This eliminates the need for separate child pointers for each declarator type. --- src/cdecl.h | 6 ++---- src/explain.c | 18 ++---------------- src/parse.y | 10 +++++----- 3 files changed, 9 insertions(+), 25 deletions(-) diff --git a/src/cdecl.h b/src/cdecl.h index 9c06b79..536135f 100644 --- a/src/cdecl.h +++ b/src/cdecl.h @@ -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; diff --git a/src/explain.c b/src/explain.c index e0916a8..60e880b 100644 --- a/src/explain.c +++ b/src/explain.c @@ -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) { diff --git a/src/parse.y b/src/parse.y index 06cbc07..b21a1d4 100644 --- a/src/parse.y +++ b/src/parse.y @@ -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; }; -- 2.43.2