What's the best way to have an XSUB return a string (char *) when the caller doesn't know how big that string will be?

In C a function can't return a pointer to a function-static variable, but in Perl you can get away with a function returning a reference to a function-scoped lexical variable.

Can you do (fake) this sort of thing in an XSUB?

Presumably, if I malloced the space that I'm "returning a pointer to" then it needs freeing up afterwards, but not before Perl has copied it somewhere! Is a CLEANUP section good for that?

As a (silly) test, the following XSUB seems to work, but I'd just like to check that this is alright.

   char *
   hello()
       PREINIT:
           char    *text;

       CODE:
           Newz(0, text, 13, char);
           strcpy(text, "Hello, world");
           RETVAL = text;

       OUTPUT:
           RETVAL

       CLEANUP:
           Safefree(text);

It's a cheat really, because the return value is not a pointer to "local data" -- it's a pointer to a copy of it, the malloced local data itself being freed again -- but at least the caller doesn't have to provide the space for the data to be copied to.

Is there a better way to have a "Perlish" calling style like

$text = my_xsub();

when the caller doesn't know in advance how big that $text is going to be?

Thanks,
- Steve



Reply via email to