/* DO NOT MODIFY THIS FILE it is generated from these files:
* inc/template/accessor.tt
* inc/template/accessor_wrapper.tt
* inc/run/generate_record_accessor.pl
*/
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include "ffi_platypus.h"
#include "ffi_platypus_guts.h"
XS(ffi_pl_record_accessor_uint8)
{
ffi_pl_record_member *member;
SV *self;
char *ptr1;
uint8_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
if(!SvOK(self))
croak("Null record error");
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (uint8_t*) &ptr1[member->offset];
if(items > 1)
{
if(SvREADONLY(self))
{
croak("record is read-only");
}
else
{
*ptr2 = (uint8_t) SvUV(ST(1));
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
XSRETURN_UV(*ptr2);
}
XS(ffi_pl_record_accessor_uint8_array)
{
ffi_pl_record_member *member;
SV *self;
SV *arg;
SV **item;
AV *av;
char *ptr1;
int i;
uint8_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (uint8_t*) &ptr1[member->offset];
if(items > 1 && SvREADONLY(self))
{
croak("record is read-only");
}
if(items > 2)
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
arg = ST(2);
ptr2[i] = SvUV(arg);
}
else
{
warn("illegal index %d", i);
}
}
else if(items > 1)
{
arg = ST(1);
if(SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV)
{
av = (AV*) SvRV(arg);
for(i=0; i < member->count; i++)
{
item = av_fetch(av, i, 0);
if(item != NULL && SvOK(*item))
{
ptr2[i] = SvUV(*item);
}
else
{
ptr2[i] = 0;
}
}
}
else
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
XSRETURN_UV(ptr2[i]);
}
else
{
warn("illegal index %d", i);
XSRETURN_EMPTY;
}
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
av = newAV();
av_fill(av, member->count-1);
for(i=0; i < member->count; i++)
{
sv_setuv(*av_fetch(av, i, 1), ptr2[i]);
}
ST(0) = newRV_inc((SV*)av);
XSRETURN(1);
}
XS(ffi_pl_record_accessor_sint8)
{
ffi_pl_record_member *member;
SV *self;
char *ptr1;
int8_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
if(!SvOK(self))
croak("Null record error");
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (int8_t*) &ptr1[member->offset];
if(items > 1)
{
if(SvREADONLY(self))
{
croak("record is read-only");
}
else
{
*ptr2 = (int8_t) SvIV(ST(1));
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
XSRETURN_IV(*ptr2);
}
XS(ffi_pl_record_accessor_sint8_array)
{
ffi_pl_record_member *member;
SV *self;
SV *arg;
SV **item;
AV *av;
char *ptr1;
int i;
int8_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (int8_t*) &ptr1[member->offset];
if(items > 1 && SvREADONLY(self))
{
croak("record is read-only");
}
if(items > 2)
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
arg = ST(2);
ptr2[i] = SvIV(arg);
}
else
{
warn("illegal index %d", i);
}
}
else if(items > 1)
{
arg = ST(1);
if(SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV)
{
av = (AV*) SvRV(arg);
for(i=0; i < member->count; i++)
{
item = av_fetch(av, i, 0);
if(item != NULL && SvOK(*item))
{
ptr2[i] = SvIV(*item);
}
else
{
ptr2[i] = 0;
}
}
}
else
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
XSRETURN_IV(ptr2[i]);
}
else
{
warn("illegal index %d", i);
XSRETURN_EMPTY;
}
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
av = newAV();
av_fill(av, member->count-1);
for(i=0; i < member->count; i++)
{
sv_setiv(*av_fetch(av, i, 1), ptr2[i]);
}
ST(0) = newRV_inc((SV*)av);
XSRETURN(1);
}
XS(ffi_pl_record_accessor_uint16)
{
ffi_pl_record_member *member;
SV *self;
char *ptr1;
uint16_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
if(!SvOK(self))
croak("Null record error");
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (uint16_t*) &ptr1[member->offset];
if(items > 1)
{
if(SvREADONLY(self))
{
croak("record is read-only");
}
else
{
*ptr2 = (uint16_t) SvUV(ST(1));
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
XSRETURN_UV(*ptr2);
}
XS(ffi_pl_record_accessor_uint16_array)
{
ffi_pl_record_member *member;
SV *self;
SV *arg;
SV **item;
AV *av;
char *ptr1;
int i;
uint16_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (uint16_t*) &ptr1[member->offset];
if(items > 1 && SvREADONLY(self))
{
croak("record is read-only");
}
if(items > 2)
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
arg = ST(2);
ptr2[i] = SvUV(arg);
}
else
{
warn("illegal index %d", i);
}
}
else if(items > 1)
{
arg = ST(1);
if(SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV)
{
av = (AV*) SvRV(arg);
for(i=0; i < member->count; i++)
{
item = av_fetch(av, i, 0);
if(item != NULL && SvOK(*item))
{
ptr2[i] = SvUV(*item);
}
else
{
ptr2[i] = 0;
}
}
}
else
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
XSRETURN_UV(ptr2[i]);
}
else
{
warn("illegal index %d", i);
XSRETURN_EMPTY;
}
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
av = newAV();
av_fill(av, member->count-1);
for(i=0; i < member->count; i++)
{
sv_setuv(*av_fetch(av, i, 1), ptr2[i]);
}
ST(0) = newRV_inc((SV*)av);
XSRETURN(1);
}
XS(ffi_pl_record_accessor_sint16)
{
ffi_pl_record_member *member;
SV *self;
char *ptr1;
int16_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
if(!SvOK(self))
croak("Null record error");
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (int16_t*) &ptr1[member->offset];
if(items > 1)
{
if(SvREADONLY(self))
{
croak("record is read-only");
}
else
{
*ptr2 = (int16_t) SvIV(ST(1));
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
XSRETURN_IV(*ptr2);
}
XS(ffi_pl_record_accessor_sint16_array)
{
ffi_pl_record_member *member;
SV *self;
SV *arg;
SV **item;
AV *av;
char *ptr1;
int i;
int16_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (int16_t*) &ptr1[member->offset];
if(items > 1 && SvREADONLY(self))
{
croak("record is read-only");
}
if(items > 2)
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
arg = ST(2);
ptr2[i] = SvIV(arg);
}
else
{
warn("illegal index %d", i);
}
}
else if(items > 1)
{
arg = ST(1);
if(SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV)
{
av = (AV*) SvRV(arg);
for(i=0; i < member->count; i++)
{
item = av_fetch(av, i, 0);
if(item != NULL && SvOK(*item))
{
ptr2[i] = SvIV(*item);
}
else
{
ptr2[i] = 0;
}
}
}
else
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
XSRETURN_IV(ptr2[i]);
}
else
{
warn("illegal index %d", i);
XSRETURN_EMPTY;
}
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
av = newAV();
av_fill(av, member->count-1);
for(i=0; i < member->count; i++)
{
sv_setiv(*av_fetch(av, i, 1), ptr2[i]);
}
ST(0) = newRV_inc((SV*)av);
XSRETURN(1);
}
XS(ffi_pl_record_accessor_uint32)
{
ffi_pl_record_member *member;
SV *self;
char *ptr1;
uint32_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
if(!SvOK(self))
croak("Null record error");
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (uint32_t*) &ptr1[member->offset];
if(items > 1)
{
if(SvREADONLY(self))
{
croak("record is read-only");
}
else
{
*ptr2 = (uint32_t) SvUV(ST(1));
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
XSRETURN_UV(*ptr2);
}
XS(ffi_pl_record_accessor_uint32_array)
{
ffi_pl_record_member *member;
SV *self;
SV *arg;
SV **item;
AV *av;
char *ptr1;
int i;
uint32_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (uint32_t*) &ptr1[member->offset];
if(items > 1 && SvREADONLY(self))
{
croak("record is read-only");
}
if(items > 2)
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
arg = ST(2);
ptr2[i] = SvUV(arg);
}
else
{
warn("illegal index %d", i);
}
}
else if(items > 1)
{
arg = ST(1);
if(SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV)
{
av = (AV*) SvRV(arg);
for(i=0; i < member->count; i++)
{
item = av_fetch(av, i, 0);
if(item != NULL && SvOK(*item))
{
ptr2[i] = SvUV(*item);
}
else
{
ptr2[i] = 0;
}
}
}
else
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
XSRETURN_UV(ptr2[i]);
}
else
{
warn("illegal index %d", i);
XSRETURN_EMPTY;
}
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
av = newAV();
av_fill(av, member->count-1);
for(i=0; i < member->count; i++)
{
sv_setuv(*av_fetch(av, i, 1), ptr2[i]);
}
ST(0) = newRV_inc((SV*)av);
XSRETURN(1);
}
XS(ffi_pl_record_accessor_sint32)
{
ffi_pl_record_member *member;
SV *self;
char *ptr1;
int32_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
if(!SvOK(self))
croak("Null record error");
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (int32_t*) &ptr1[member->offset];
if(items > 1)
{
if(SvREADONLY(self))
{
croak("record is read-only");
}
else
{
*ptr2 = (int32_t) SvIV(ST(1));
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
XSRETURN_IV(*ptr2);
}
XS(ffi_pl_record_accessor_sint32_array)
{
ffi_pl_record_member *member;
SV *self;
SV *arg;
SV **item;
AV *av;
char *ptr1;
int i;
int32_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (int32_t*) &ptr1[member->offset];
if(items > 1 && SvREADONLY(self))
{
croak("record is read-only");
}
if(items > 2)
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
arg = ST(2);
ptr2[i] = SvIV(arg);
}
else
{
warn("illegal index %d", i);
}
}
else if(items > 1)
{
arg = ST(1);
if(SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV)
{
av = (AV*) SvRV(arg);
for(i=0; i < member->count; i++)
{
item = av_fetch(av, i, 0);
if(item != NULL && SvOK(*item))
{
ptr2[i] = SvIV(*item);
}
else
{
ptr2[i] = 0;
}
}
}
else
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
XSRETURN_IV(ptr2[i]);
}
else
{
warn("illegal index %d", i);
XSRETURN_EMPTY;
}
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
av = newAV();
av_fill(av, member->count-1);
for(i=0; i < member->count; i++)
{
sv_setiv(*av_fetch(av, i, 1), ptr2[i]);
}
ST(0) = newRV_inc((SV*)av);
XSRETURN(1);
}
XS(ffi_pl_record_accessor_uint64)
{
ffi_pl_record_member *member;
SV *self;
char *ptr1;
uint64_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
if(!SvOK(self))
croak("Null record error");
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (uint64_t*) &ptr1[member->offset];
if(items > 1)
{
if(SvREADONLY(self))
{
croak("record is read-only");
}
else
{
*ptr2 = (uint64_t) SvUV(ST(1));
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
XSRETURN_UV(*ptr2);
}
XS(ffi_pl_record_accessor_uint64_array)
{
ffi_pl_record_member *member;
SV *self;
SV *arg;
SV **item;
AV *av;
char *ptr1;
int i;
uint64_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (uint64_t*) &ptr1[member->offset];
if(items > 1 && SvREADONLY(self))
{
croak("record is read-only");
}
if(items > 2)
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
arg = ST(2);
ptr2[i] = SvUV(arg);
}
else
{
warn("illegal index %d", i);
}
}
else if(items > 1)
{
arg = ST(1);
if(SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV)
{
av = (AV*) SvRV(arg);
for(i=0; i < member->count; i++)
{
item = av_fetch(av, i, 0);
if(item != NULL && SvOK(*item))
{
ptr2[i] = SvUV(*item);
}
else
{
ptr2[i] = 0;
}
}
}
else
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
XSRETURN_UV(ptr2[i]);
}
else
{
warn("illegal index %d", i);
XSRETURN_EMPTY;
}
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
av = newAV();
av_fill(av, member->count-1);
for(i=0; i < member->count; i++)
{
sv_setuv(*av_fetch(av, i, 1), ptr2[i]);
}
ST(0) = newRV_inc((SV*)av);
XSRETURN(1);
}
XS(ffi_pl_record_accessor_sint64)
{
ffi_pl_record_member *member;
SV *self;
char *ptr1;
int64_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
if(!SvOK(self))
croak("Null record error");
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (int64_t*) &ptr1[member->offset];
if(items > 1)
{
if(SvREADONLY(self))
{
croak("record is read-only");
}
else
{
*ptr2 = (int64_t) SvIV(ST(1));
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
XSRETURN_IV(*ptr2);
}
XS(ffi_pl_record_accessor_sint64_array)
{
ffi_pl_record_member *member;
SV *self;
SV *arg;
SV **item;
AV *av;
char *ptr1;
int i;
int64_t *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (int64_t*) &ptr1[member->offset];
if(items > 1 && SvREADONLY(self))
{
croak("record is read-only");
}
if(items > 2)
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
arg = ST(2);
ptr2[i] = SvIV(arg);
}
else
{
warn("illegal index %d", i);
}
}
else if(items > 1)
{
arg = ST(1);
if(SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV)
{
av = (AV*) SvRV(arg);
for(i=0; i < member->count; i++)
{
item = av_fetch(av, i, 0);
if(item != NULL && SvOK(*item))
{
ptr2[i] = SvIV(*item);
}
else
{
ptr2[i] = 0;
}
}
}
else
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
XSRETURN_IV(ptr2[i]);
}
else
{
warn("illegal index %d", i);
XSRETURN_EMPTY;
}
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
av = newAV();
av_fill(av, member->count-1);
for(i=0; i < member->count; i++)
{
sv_setiv(*av_fetch(av, i, 1), ptr2[i]);
}
ST(0) = newRV_inc((SV*)av);
XSRETURN(1);
}
XS(ffi_pl_record_accessor_float)
{
ffi_pl_record_member *member;
SV *self;
char *ptr1;
float *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
if(!SvOK(self))
croak("Null record error");
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (float*) &ptr1[member->offset];
if(items > 1)
{
if(SvREADONLY(self))
{
croak("record is read-only");
}
else
{
*ptr2 = (float) SvNV(ST(1));
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
XSRETURN_NV(*ptr2);
}
XS(ffi_pl_record_accessor_float_array)
{
ffi_pl_record_member *member;
SV *self;
SV *arg;
SV **item;
AV *av;
char *ptr1;
int i;
float *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (float*) &ptr1[member->offset];
if(items > 1 && SvREADONLY(self))
{
croak("record is read-only");
}
if(items > 2)
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
arg = ST(2);
ptr2[i] = SvNV(arg);
}
else
{
warn("illegal index %d", i);
}
}
else if(items > 1)
{
arg = ST(1);
if(SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV)
{
av = (AV*) SvRV(arg);
for(i=0; i < member->count; i++)
{
item = av_fetch(av, i, 0);
if(item != NULL && SvOK(*item))
{
ptr2[i] = SvNV(*item);
}
else
{
ptr2[i] = 0.0;
}
}
}
else
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
XSRETURN_NV(ptr2[i]);
}
else
{
warn("illegal index %d", i);
XSRETURN_EMPTY;
}
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
av = newAV();
av_fill(av, member->count-1);
for(i=0; i < member->count; i++)
{
sv_setnv(*av_fetch(av, i, 1), ptr2[i]);
}
ST(0) = newRV_inc((SV*)av);
XSRETURN(1);
}
XS(ffi_pl_record_accessor_double)
{
ffi_pl_record_member *member;
SV *self;
char *ptr1;
double *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
if(!SvOK(self))
croak("Null record error");
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (double*) &ptr1[member->offset];
if(items > 1)
{
if(SvREADONLY(self))
{
croak("record is read-only");
}
else
{
*ptr2 = (double) SvNV(ST(1));
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
XSRETURN_NV(*ptr2);
}
XS(ffi_pl_record_accessor_double_array)
{
ffi_pl_record_member *member;
SV *self;
SV *arg;
SV **item;
AV *av;
char *ptr1;
int i;
double *ptr2;
dVAR; dXSARGS;
if(items == 0)
croak("This is a method, you must provide at least the object");
member = (ffi_pl_record_member*) CvXSUBANY(cv).any_ptr;
self = ST(0);
if(SvROK(self))
self = SvRV(self);
ptr1 = (char*) SvPV_nolen(self);
ptr2 = (double*) &ptr1[member->offset];
if(items > 1 && SvREADONLY(self))
{
croak("record is read-only");
}
if(items > 2)
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
arg = ST(2);
ptr2[i] = SvNV(arg);
}
else
{
warn("illegal index %d", i);
}
}
else if(items > 1)
{
arg = ST(1);
if(SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV)
{
av = (AV*) SvRV(arg);
for(i=0; i < member->count; i++)
{
item = av_fetch(av, i, 0);
if(item != NULL && SvOK(*item))
{
ptr2[i] = SvNV(*item);
}
else
{
ptr2[i] = 0.0;
}
}
}
else
{
i = SvIV(ST(1));
if(i >= 0 && i < member->count)
{
XSRETURN_NV(ptr2[i]);
}
else
{
warn("illegal index %d", i);
XSRETURN_EMPTY;
}
}
}
if(GIMME_V == G_VOID)
XSRETURN_EMPTY;
av = newAV();
av_fill(av, member->count-1);
for(i=0; i < member->count; i++)
{
sv_setnv(*av_fetch(av, i, 1), ptr2[i]);
}
ST(0) = newRV_inc((SV*)av);
XSRETURN(1);
}