+static int parse_protostr(char *protostr, struct parsed_proto *pp);
+
+static int parse_arg(char **p_, struct parsed_proto_arg *arg, int xarg)
+{
+ char buf[256];
+ char *p = *p_;
+ char *pe;
+ int ret;
+
+ arg->pp = calloc(1, sizeof(*arg->pp));
+ my_assert_not(arg->pp, NULL);
+ arg->pp->is_arg = 1;
+
+ pe = p;
+ while (1) {
+ pe = strpbrk(pe, ",()");
+ if (pe == NULL)
+ return -1;
+ if (*pe == ',' || *pe == ')')
+ break;
+ pe = strchr(pe, ')');
+ if (pe == NULL)
+ return -1;
+ pe++;
+ }
+
+ if (pe - p > sizeof(buf) - 1)
+ return -1;
+ memcpy(buf, p, pe - p);
+ buf[pe - p] = 0;
+
+ ret = parse_protostr(buf, arg->pp);
+ if (ret < 0)
+ return -1;
+
+ // we don't use actual names right now...
+ snprintf(arg->pp->name, sizeof(arg->pp->name), "a%d", xarg);
+
+ if (!arg->type.is_struct)
+ // we'll treat it as void * for non-calls
+ arg->type.name = strdup("void *");
+ arg->type.is_ptr = 1;
+
+ p += ret;
+ *p_ = p;
+ return 0;
+}
+