]> git.draconx.ca Git - cdecl99.git/commitdiff
Make an explicit null declarator type.
authorNick Bowler <nbowler@draconx.ca>
Wed, 6 Jul 2011 01:12:59 +0000 (21:12 -0400)
committerNick Bowler <nbowler@draconx.ca>
Wed, 6 Jul 2011 01:12:59 +0000 (21:12 -0400)
Now that we have a child pointers in every declarator, this is way
cleaner than abusing the identifier type.

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

index 807ad6a687145e4d0dab486a7d9c1036463b6300..883a4e40138fafbe01959b280eeae681266e905a 100644 (file)
@@ -41,6 +41,7 @@ enum {
 
 /* Declarator types. */
 enum {
+       CDECL_DECL_NULL,
        CDECL_DECL_IDENT,
        CDECL_DECL_POINTER,
        CDECL_DECL_ARRAY,
index 60e880b0586b2e4c7b47ca5d9f48d6b3ee07b5eb..b0e9a84fe9ddce6e08c7ee089d1ad069f6614e38 100644 (file)
@@ -164,11 +164,13 @@ static size_t
 explain_prologue(char *buf, size_t n, struct cdecl_declarator *d)
 {
        while (d) {
-               if (d->type == CDECL_DECL_IDENT) {
-                       if (!d->u.ident)
-                               return snprintf(buf, n, "type");
+               switch (d->type) {
+               case CDECL_DECL_NULL:
+                       return snprintf(buf, n, "type");
+               case CDECL_DECL_IDENT:
                        return snprintf(buf, n, "declare %s as", d->u.ident);
                }
+
                d = d->child;
        }
 }
@@ -211,7 +213,7 @@ explain_declarators(char *buf, size_t n, struct cdecl_declarator *d)
 {
        size_t ret = 0, rc;
 
-       if (d->type == CDECL_DECL_IDENT)
+       if (d->type == CDECL_DECL_IDENT || d->type == CDECL_DECL_NULL)
                return 0;
 
        rc = explain_declarators(buf, n, d->child);
index b21a1d4b951021d4138e3036d04c0d968b89f7cd..7d4c3dc0c889f88469c4905f9f8cf36fa685b33d 100644 (file)
@@ -79,6 +79,8 @@ static void free_declarator(struct cdecl_declarator *x)
        while (x) {
                p = x->next;
                switch (x->type) {
+               case CDECL_DECL_NULL:
+                       break;
                case CDECL_DECL_IDENT:
                        free(x->u.ident);
                        break;
@@ -289,12 +291,11 @@ pointer: T_ASTERISK qualifiers direct_declarator {
                .child = $3);
 }
 
-declarator: direct_declarator | pointer;
+declarator: direct_declarator | pointer
 
 direct_declarator: {
        ALLOC_STRUCT($$, struct cdecl_declarator,
-               .type = CDECL_DECL_IDENT,
-               .u.ident = NULL);
+               .type = CDECL_DECL_NULL);
 } | T_IDENT {
        ALLOC_STRUCT($$, struct cdecl_declarator,
                .type = CDECL_DECL_IDENT,