The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use lib 't';

use FFI::Raw;
use CompileTest;

my $test   = '06-struct';
my $source = "./t/$test.c";
my $shared = CompileTest::compile($source);

my $int_arg = 42;
my $str_arg = "hello";

my $packed = pack('ix![p]p', 42, $str_arg);

my $arg = FFI::Raw::MemPtr -> new_from_buf($packed, length $packed);

my $take_one_struct = FFI::Raw -> new(
	$shared, 'take_one_struct',
	FFI::Raw::void, FFI::Raw::ptr
);

$take_one_struct -> call($arg);

print "ok - survived the call\n";

$arg = FFI::Raw::MemPtr -> new(length $packed);

my $return_one_struct = FFI::Raw -> new(
	$shared, 'return_one_struct',
	FFI::Raw::void, FFI::Raw::ptr
);

$return_one_struct -> call($arg);

print "ok - survived the call\n";

my ($int, $str) = unpack('ix![p]p', $arg -> tostr(length $packed));

print "ok - got passed int 42\n" if $int == 42;
print "ok - str\n" if $str eq 'hello';

print "1..7\n";