return NULL;
case CDECL_DECL_POINTER:
return d->u.pointer.declarator;
+ case CDECL_DECL_ARRAY:
+ return d->u.array.declarator;
default:
abort();
}
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)
{
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();
}