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

#include <EXTERN.h> 
#include <perl.h>   

/* this example shows how to create a hash in C, 
 * modify it, push a reference to it onto the stack,
 * call a subroutine which modifies it, 
 * then see the changes when we're back inside C
 */

void
hash_stuff(HV *hv)
{
    dSP;

    hv_store(hv, "foo", 3, newSVpv("val",3), FALSE);
    hv_store(hv, "me", 2, newSVpv("dougm",5), FALSE);

    ENTER;
    SAVETMPS;

    PUSHMARK(sp);
    XPUSHs(newRV_noinc((SV*)hv)); /* don't mortalize here */
    PUTBACK;

    perl_call_pv("My::subroutine", G_SCALAR | G_EVAL);

    if (SvTRUE(GvSV(errgv)))
        fprintf(stderr, "eval error: %s\n", SvPVx(GvSV(errgv), na));

    FREETMPS;
    LEAVE;
}

int main(int argc, char **argv, char **env)
{
    HV *hv;
    SV *val;
    char *key;
    I32 klen;

    char *embedding[] = { "", "hashref.pl" };
    PerlInterpreter *my_perl = perl_alloc();

    perl_construct(my_perl);
    perl_destruct_level = 1;

    perl_parse(my_perl, NULL, 2, embedding, (char **)NULL);
    perl_run(my_perl);

    hv = newHV();
    hash_stuff(hv); 

    (void)hv_iterinit(hv);
    while ((val = hv_iternextsv(hv, &key, &klen))) 
	printf("in C:    %s=`%s'\n", key, SvPV(val,na));

    /* now release hv */
    hv_undef(hv);
    SvREFCNT_dec((SV*)hv); 

    perl_destruct(my_perl);
    perl_free(my_perl);
}