doneill has asked for the wisdom of the Perl Monks concerning the following question:

I'm having an interesting problem with my perl xs dongle: What I want to do is fairly simple, this is my whack at making /any/ XS module that can do at least most of what I need.. Basic string passing, essentially... Anyways, here's what I have as my .xs content:
MODULE = boink PACKAGE = boink char hello_new( char *woteva ) PREINIT: char *boink; + CODE: printf("Boink::Malloc\n"); boink = malloc( strlen( woteva ) + 3 ); sprintf( boink, "[%s]", woteva ); printf("Boink: Returning '%s'\n", boink ); RETVAL = (int)boink; + void hello_free( char *boink ) CODE: printf("Boink::Free\n"); free( boink );
Not the most intuitive I'm certain, but it should suffice: In my .pm file, I have the essential wrappers (and possibly the centre of my woes):
my $mres; my $textin; my $ptr; + sub hello { $textin = shift; $$ptr = boink::hello_new( $textin ); + bless $ptr; $mres = $$ptr; + print $mres; + boink::hello_free( $ptr ); + return $mres; }
Then, I have my little test script:
use ExtUtils::testlib; use boink; + boink::hello( "testing\n" );
Ultimately, my result should be:
Boink::Malloc Boink: Returning '[testing ]' [testing ] Boink::Free
BUT instead, I get:
Boink::Malloc Boink: Returning '[testing ]' testing Boink::Free
Which, is actually what I originally passed /in/ to my subroutine... Any pointers here?

Replies are listed 'Best First'.
Re: My XS pointer problem...
by MarkM (Curate) on Apr 08, 2003 at 02:21 UTC

    It looks like you have a few problems, the first of which being that "CODE:" XS sections, although defining RETVAL, do not use RETVAL as the default OUTPUT argument. An explicit "OUTPUT: RETVAL" is necessary.

    The next problem that you will hit is that you are returning a 'char', casting a malloc()'d pointer to an 'int', and assuming that you can dereference this from Perl. You should be returning a 'char *' or 'SV *' instead.

    I recommend a little more reading up on the XS interface. It is very complicated stuff. Cheers, and good luck.

      Well, the idea was to follow tye's advice I found in some other articles on using as much perl/c to wrap the function, and less XS for reasons of cleanliness, simplicity, and debugging which constitutes the former two ideals.