I am just looking for a URL or an example of how to return a reference to a C
structure to perl. I have read the Cookbook, and I can get my code to work if
I actually create a blessed reference. I would prefer to bless it - I just
want a reference that I can later pass to other C functions.
I have looked at the docs for Inline::Struct, and I do not think that is what
I want. Again, I do not want a blessed reference, just a reference. I have
read perlguts, and believe the call I need to use is newRV_noinc.
What follows are two files. The first one is a package that is mostly
stolen^wmodeled on the Cookbook OO example. The main difference is that I do
not bless the structure, I just try to return a ref to it. The other piece of
code exercises my problem -- namely a segfault.
What have I missed?
Thanks,
Mik
---- The Package ------
package Break;
use Inline C => Config => INC => '-I/opt/PolicyDirector/include',
LIBS => ' -lpthread -lpdadminapi -llibstdc++';
use Inline C;
sub new {
my $class = shift;
my $self = {};
my %opts = @_;
$self->{unit} = $opts{unit};
$self->{obj} = induct( $opts{name}, $opts{rank}, $opts{serial} );
bless $self, $class;
}
sub get_name {
my $self = shift;
getname( $self->{obj} );
}
1;
__DATA__
__C__
typedef struct {
char *name;
char *rank;
long serial;
} Soldier;
SV* induct( char *name, char *rank, long serial ) {
Soldier* soldier = malloc(sizeof(Soldier));
soldier->name = strdup(name);
soldier->rank = strdup(rank);
soldier->serial = serial;
return newRV_noinc((SV*)soldier);
}
char* getname( SV* obj ) {
return ((Soldier*)SvIV(SvRV(obj)))->name;
}
------- The program ---------
#!/usr/bin/perl -w
use strict;
use Break;
use Data::Dumper;
my $foo = Break->new( name => 'mikfire',
rank => 'corporal',
serial => 1234567,
unit => '3rd army' );
print $foo->get_name( $foo->{obj} ), "\n";