+ } elsif ($sig =~ /^(\w+), string, 0U? : (\w+)$/) {
+ my $c_ret_type = short_name_to_c_type ($2);
+ "\
+ CAMLlocal1 (rv);
+ " . gen_unpack_args ($1) . "
+ char *str = String_val (strv);
+ $c_ret_type r;
+
+ NONBLOCKING (r = $c_name ($1, str, 0));
+ CHECK_ERROR (!r, conn, \"$c_name\");
+
+ " . gen_pack_result ($2) . "
+
+ CAMLreturn (rv);
+"
+ } elsif ($sig =~ /^(\w+), (u?)int : unit$/) {
+ my $unsigned = $2 eq "u" ? "unsigned " : "";
+ "\
+ " . gen_unpack_args ($1) . "
+ ${unsigned}int i = Int_val (iv);
+ int r;
+
+ NONBLOCKING (r = $c_name ($1, i));
+ CHECK_ERROR (!r, conn, \"$c_name\");
+
+ CAMLreturn (Val_unit);
+"
+ } elsif ($sig =~ /^(\w+), (u?)int : (\w+)$/) {
+ my $c_ret_type = short_name_to_c_type ($3);
+ my $unsigned = $2 eq "u" ? "unsigned " : "";
+ "\
+ CAMLlocal1 (rv);
+ " . gen_unpack_args ($1) . "
+ ${unsigned}int i = Int_val (iv);
+ $c_ret_type r;
+
+ NONBLOCKING (r = $c_name ($1, i));
+ CHECK_ERROR (!r, conn, \"$c_name\");
+
+ " . gen_pack_result ($3) . "
+
+ CAMLreturn (rv);
+"
+ } elsif ($sig =~ /^(\w+), uuid : (\w+)$/) {
+ my $c_ret_type = short_name_to_c_type ($2);
+ "\
+ CAMLlocal1 (rv);
+ " . gen_unpack_args ($1) . "
+ unsigned char *uuid = (unsigned char *) String_val (uuidv);
+ $c_ret_type r;
+
+ NONBLOCKING (r = $c_name ($1, uuid));
+ CHECK_ERROR (!r, conn, \"$c_name\");
+
+ " . gen_pack_result ($2) . "
+
+ CAMLreturn (rv);
+"
+ } elsif ($sig =~ /^(\w+), 0U? : (\w+)$/) {
+ my $c_ret_type = short_name_to_c_type ($2);
+ "\
+ CAMLlocal1 (rv);
+ " . gen_unpack_args ($1) . "
+ $c_ret_type r;
+
+ NONBLOCKING (r = $c_name ($1, 0));
+ CHECK_ERROR (!r, conn, \"$c_name\");
+
+ " . gen_pack_result ($2) . "
+
+ CAMLreturn (rv);
+"
+ } elsif ($sig =~ /^(\w+) : (\w+)$/) {
+ my $c_ret_type = short_name_to_c_type ($2);
+ "\
+ CAMLlocal1 (rv);
+ " . gen_unpack_args ($1) . "
+ $c_ret_type r;
+
+ NONBLOCKING (r = $c_name ($1));
+ CHECK_ERROR (!r, conn, \"$c_name\");
+
+ " . gen_pack_result ($2) . "
+
+ CAMLreturn (rv);
+"
+ } elsif ($sig =~ /^(\w+), string : (\w+) from (\w+)$/) {
+ my $c_ret_type = short_name_to_c_type ($2);
+ "\
+ CAMLlocal2 (rv, connv);
+ " . gen_unpack_args ($1) . "
+ char *str = String_val (strv);
+ $c_ret_type r;
+
+ NONBLOCKING (r = $c_name ($1, str));
+ CHECK_ERROR (!r, conn, \"$c_name\");
+
+ connv = Field ($3v, 1);
+ " . gen_pack_result ($2) . "
+
+ CAMLreturn (rv);
+"
+ } elsif ($sig =~ /^(\w+), string, 0U? : (\w+) from (\w+)$/) {
+ my $c_ret_type = short_name_to_c_type ($2);
+ "\
+ CAMLlocal2 (rv, connv);
+ " . gen_unpack_args ($1) . "
+ char *str = String_val (strv);
+ $c_ret_type r;
+
+ NONBLOCKING (r = $c_name ($1, str, 0));
+ CHECK_ERROR (!r, conn, \"$c_name\");
+
+ connv = Field ($3v, 1);
+ " . gen_pack_result ($2) . "
+
+ CAMLreturn (rv);
+"
+ } elsif ($sig =~ /^(\w+), 0U? : (\w+) from (\w+)$/) {
+ my $c_ret_type = short_name_to_c_type ($2);
+ "\
+ CAMLlocal2 (rv, connv);
+ " . gen_unpack_args ($1) . "
+ $c_ret_type r;
+
+ NONBLOCKING (r = $c_name ($1, 0));
+ CHECK_ERROR (!r, conn, \"$c_name\");
+
+ connv = Field ($3v, 1);
+ " . gen_pack_result ($2) . "
+
+ CAMLreturn (rv);
+"
+ } elsif ($sig =~ /^(\w+) : (\w+) from (\w+)$/) {
+ my $c_ret_type = short_name_to_c_type ($2);
+ "\
+ CAMLlocal2 (rv, connv);
+ " . gen_unpack_args ($1) . "
+ $c_ret_type r;
+
+ NONBLOCKING (r = $c_name ($1));
+ CHECK_ERROR (!r, conn, \"$c_name\");
+
+ connv = Field ($3v, 1);
+ " . gen_pack_result ($2) . "
+
+ CAMLreturn (rv);
+"