static int cmd_explain(char *cmd, char *arg)
{
+ static size_t bufsz;
+ static char *buf;
+
struct cdecl *decl;
+ size_t rc;
decl = cdecl_parse_decl(arg);
- cdecl_free(decl);
+ if (!decl)
+ goto out;
+
+ for (struct cdecl *i = decl; i; i = i->next) {
+retry:
+ rc = cdecl_explain(buf, bufsz, i);
+ if (rc >= bufsz) {
+ char *tmp;
+
+ tmp = realloc(buf, rc + 1);
+ if (!tmp) {
+ fprintf(stderr, "failed to allocate memory\n");
+ goto out;
+ }
+
+ buf = tmp;
+ bufsz = rc + 1;
+ goto retry;
+ }
+ printf("%s\n", buf);
+ }
+out:
+ cdecl_free(decl);
return 1;
}