]> git.draconx.ca Git - cdecl99.git/blobdiff - src/explain.c
Add support for array declarators.
[cdecl99.git] / src / explain.c
index c6c7e9c49b4ffcd87cc259ca3209068329b45951..d8a5f057915191bbf392ef47186a5231e6cf9102 100644 (file)
@@ -161,6 +161,8 @@ static struct cdecl_declarator *next_declarator(struct cdecl_declarator *d)
                return NULL;
        case CDECL_DECL_POINTER:
                return d->u.pointer.declarator;
+       case CDECL_DECL_ARRAY:
+               return d->u.array.declarator;
        default:
                abort();
        }
@@ -188,6 +190,28 @@ explain_pointer(char *buf, size_t n, struct cdecl_pointer *p)
        return ret + snprintf(buf, n, "pointer to");
 }
 
+static size_t
+explain_array(char *buf, size_t n, struct cdecl_array *a)
+{
+       size_t ret = 0, rc = 0;
+
+       if (a->vla)
+               rc = snprintf(buf, n, "variable-length array");
+       else
+               rc = snprintf(buf, n, "array");
+       ret += advance(&buf, &n, rc);
+
+       if (a->vla) {
+               rc = snprintf(buf, n, "%s", a->vla);
+               ret += advance(&buf, &n, rc);
+       } else if (a->length) {
+               rc = snprintf(buf, n, "%ju", a->length);
+               ret += advance(&buf, &n, rc);
+       }
+
+       return ret + snprintf(buf, n, "of");
+}
+
 static size_t
 explain_declarators(char *buf, size_t n, struct cdecl_declarator *d)
 {
@@ -202,6 +226,8 @@ explain_declarators(char *buf, size_t n, struct cdecl_declarator *d)
        switch (d->type) {
        case CDECL_DECL_POINTER:
                return ret + explain_pointer(buf, n, &d->u.pointer);
+       case CDECL_DECL_ARRAY:
+               return ret + explain_array(buf, n, &d->u.array);
        default:
                abort();
        }