- " *\n",
- " * $detail\n",
- " *\n",
- map(" * \@param $_->[0] $_->[1]\n", @$args),
- " * \@param $return->[0] $return->[1]\n",
- " * \@return 0 on success, non-0 on error\n",
- " */\n",
- "int disorder_$cmdc(disorder_client *c",
- map(", const char *$_->[0]", @$args),
- ", int *$return->[0]);\n",
- "\n");
- push(@c, "int disorder_$cmdc(disorder_client *c",
- map(", const char *$_->[0]", @$args),
- ", int *$return->[0]) {\n",
- " char *v;\n",
- " int rc = disorder_simple(c, &v, \"$cmd\"",
- map(", $_->[0]", @$args),
- ", (char *)0);\n",
- " if(rc) return rc;\n",
- " if(!strcmp(v, \"yes\")) *$return->[0] = 1;\n",
- " if(!strcmp(v, \"no\")) *$return->[0] = 0;\n",
- " else {\n",
- " disorder_error(0, \"malformed response to '$cmd' command\");\n",
- " rc = -1;\n",
- " }\n",
- " xfree(v);\n",
- " return 0;\n",
- "}\n\n");
+ " *\n",
+ " * $detail\n",
+ " *\n",
+ " * \@param c Client\n",
+ c_param_docs($args),
+ c_return_docs($return),
+ " * \@return 0 on success, non-0 on error\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");