Dear All,

I wonder if any of you can help me, I am new to XS and want to call a C
function from perl.  It is actually a pointer to a function which is a
member of a structure.  A part of the C header file is as follows:

typedef struct _mystruct1 {
    int val;
    int (* init) (void *object1, void **object2);
} mystruct1;

typedef struct _mystruct2 {
    mystruct *ptr;
} mystruct2;

###############################################
In the C code I have:

mystruct2 *mine;
int res;
struct obj *object1, **object2;
.....

mine->ptr->val = 100;
res = mine->ptr->init(object1, object2);

###############################################
and I want to be able to say the same from perl, i.e.:
print "$mine->{"ptr"}->{"val"}";                                        #
This seems to work
$mine->{"ptr"}->{"init"}(object1, object2);                     # This does
not work

###############################################
To do that I used an XS program which has the following:

rh = (HV *)sv_2mortal((SV *)newHV());
hv_store(rh, "val", 3, newSViv(mine->ptr->val), 0);
hv_store(rh, "init", 4, newRV((SV *)mine->ptr->init), 0);       # This line
did not work

###############################################
I have tried to find out the type of the return pointer as in:
if (SvROK ((SV *) mine->ptr->init)) {
    type = SvTYPE(SvRV((SV *)mine->ptr->init));
    printf ("Something ..%d", type);
}

but both statements failed ...


Any help appreciated ...

Maged Messeh

Reply via email to