]> git.draconx.ca Git - cdecl99.git/blobdiff - src/cdecl99.c
Kill the "horizontal" declarator chain.
[cdecl99.git] / src / cdecl99.c
index 6e15712780106619ebf226d9ed73d24e2e916eec..639edea68ac3de89665bfc67e24af40391ee7cff 100644 (file)
@@ -36,11 +36,37 @@ static void print_help(void)
 
 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;
 }