Best Practices for passing option hashes into XS

Dave Hodgkinson davehodg at gmail.com
Sun Apr 28 08:32:47 BST 2013


Look at anything by Zefram...

Sent from my iPhone

On 28 Apr 2013, at 01:55, Simon Wistow <simon at thegestalt.org> wrote:

> I have a method
> 
>    sub foo {
>        my ($arg1, %opts) = @_;
> 
>    }
> 
> which I want to translate to XS - what's the best practices for this? 
> Both my C and my XS are incredibly rusty.
> 
> My first thought is something like (modulo memory leaks):
> 
> In Foo.xs
> 
> 
> void
> foo(arg1, ...)
>    char* arg1
> PREINIT:
>    HV* opts = newHV();
> CODE:
>    int count;
>    for (int count=1; count<items; count+=2) {
>        hv_store(opts, ST(count), ST(count+1));
>    }
> 
> 
> and then pass the HV into some C code. But I dislike having Perl types 
> in otherwise Perl free code.
> 
> So my second thought is to have a struct
> 
> typedef struct {
>  char* first_opt;
>  char* second_opt;
> } foo_struct;
> 
> 
> void
> foo(arg1, ...)
>    char* arg1    
> CODE:
>    foo_struct* opts = malloc(sizeof(foo_struct));
>    opts.first_opt = 0;
>    opts.second_opt = 0;
>    opts.third_opt = 0;
>    for (int count=1; count<items; count+=2) {
>      if (ST(count) == "first_opt") {
>        opts.first_opt = ST(count+1);  
>      } elsif (ST(count) == "second_opt") {
>        opts.second_opt = ST(count+1);  
>      }    else {
>        croak("Unknown option"); 
>      }    
>    }
> 
> 
> But that seems ugly too. I feel like I can't be the first person to have 
> done something like this. Any other modules that I can ripoff^W get 
> inspiration from?
> 
> 


More information about the london.pm mailing list