- "int disorder_$cmdc(disorder_client *c",
- map(", const char *$_->[0]", @$args),
- ", char ***$return->[0]p, int *n$return->[0]p);\n",
- "\n");
- push(@c, "int disorder_$cmdc(disorder_client *c",
- map(", const char *$_->[0]", @$args),
- ", char ***$return->[0]p, int *n$return->[0]p) {\n",
- " return disorder_simple_list(c, $return->[0]p, n$return->[0]p, \"$cmd\"",
- map(", $_->[0]", @$args),
- ", (char *)0);\n",
- "}\n\n");
+ "int disorder_$cmdc(",
+ join(", ", "disorder_client *c",
+ map(c_in_decl($_), @$args),
+ c_out_decl($return)),
+ ");\n\n");
+ print STDERR "C ";
+ push(@c, "int disorder_$cmdc(",
+ join(", ", "disorder_client *c",
+ map(c_in_decl($_), @$args),
+ c_out_decl($return)),
+ ") {\n");
+ my @cargs = ();
+ for my $arg (@$args) {
+ if($arg->[0] eq 'body' or $arg->[0] eq 'list') {
+ push(@cargs, "disorder_$arg->[0]", $arg->[1], "n$arg->[1]");
+ } elsif($arg->[0] eq 'string') {
+ push(@cargs, $arg->[1]);
+ } elsif($arg->[0] eq 'integer') {
+ push(@cargs, "buf_$arg->[1]");
+ push(@c, " char buf_$arg->[1]\[16];\n",
+ " byte_snprintf(buf_$arg->[1], sizeof buf_$arg->[1], \"%ld\", $arg->[1]);\n");
+ } else {
+ die "$0: unsupported arg type '$arg->[0]' for '$cmd'\n";
+ }
+ }
+ if(!defined $return) {
+ push(@c, " return disorder_simple(",
+ join(", ", "c", 0, "\"$cmd\"", @cargs, "(char *)0"),
+ ");\n");
+ } elsif($return->[0] eq 'string') {
+ push(@c, " return dequote(disorder_simple(",
+ join(", ", "c", "$return->[1]p", "\"$cmd\"",
+ @cargs,
+ "(char *)0"),
+ "), $return->[1]p);\n");
+ } elsif($return->[0] eq 'boolean') {
+ push(@c, " char *v;\n",
+ " int rc;\n",
+ " if((rc = disorder_simple(",
+ join(", ", "c", "&v", "\"$cmd\"",
+ @cargs,
+ "(char *)0"),
+ ")))\n",
+ " return rc;\n",
+ " return boolean(\"$cmd\", v, $return->[1]p);\n");
+ } elsif($return->[0] eq 'integer') {
+ push(@c, " char *v;\n",
+ " int rc;\n",
+ "\n",
+ " if((rc = disorder_simple(",
+ join(", ", "c", "&v", "\"$cmd\"",
+ @cargs,
+ "(char *)0"),
+ ")))\n",
+ " return rc;\n",
+ " *$return->[1]p = atol(v);\n",
+ " xfree(v);\n",
+ " return 0;\n");
+ } elsif($return->[0] eq 'user') {
+ push(@c, " char *u;\n",
+ " int rc;\n",
+ " if((rc = disorder_simple(",
+ join(", ", "c", "&u", "\"$cmd\"",
+ @cargs, "(char *)0"),
+ ")))\n",
+ " return rc;\n",
+ " c->user = u;\n",
+ " return 0;\n");
+ } elsif($return->[0] eq 'body') {
+ push(@c, " return disorder_simple_list(",
+ join(", ", "c", "$return->[1]p", "n$return->[1]p", "\"$cmd\"",
+ @cargs,
+ "(char *)0"),
+ ");\n");
+ } elsif($return->[0] eq 'queue') {
+ push(@c, " return somequeue(c, \"$cmd\", $return->[1]p);\n");
+ } elsif($return->[0] eq 'queue-one') {
+ push(@c, " return onequeue(c, \"$cmd\", $return->[1]p);\n");
+ } elsif($return->[0] eq 'pair-list') {
+ push(@c, " return pairlist(",
+ join(", ", "c", "$return->[1]p", "\"$cmd\"",
+ @cargs,
+ "(char *)0"),
+ ");\n");
+ } else {
+ die "$0: C API: unknown type '$return->[0]' for '$cmd'\n";
+ }
+ push(@c, "}\n\n");