var arg lists are supported in perl -> c.
Here is an interface routine (from a .xs file) that implements
pushing into an array:
UV
mm_array_push (array, ...)
mm_array *array
ALIAS:
mma_array_push=1
PREINIT:
int add_count = items - 1;
SV *addSVs[add_count];
int i;
CODE:
for (i=0; i < add_count; i++) addSVs[i] = ST(i+1);
if (!mm_array_splice (array, array->entries, 0, NULL,
add_count, addSVs, ix)
&& PL_dowarn && mm_error()) warn ("IPC::MMA: %s", mm_error());
RETVAL = array->entries;
OUTPUT:
RETVAL
This routine is converted by xsubpp into the one below by the
following automatic step in the module's 'make' stage:
/usr/bin/perl /usr/local/lib/perl5/5.10.1/ExtUtils/xsubpp -typemap /
usr/local/lib/perl5/5.10.1/ExtUtils/typemap -typemap typemap MMA.xs
> MMA.xsc && mv MMA.xsc MMA.c
XS(XS_IPC__MMA_mm_array_push)
{
#ifdef dVAR
dVAR; dXSARGS;
#else
dXSARGS;
#endif
dXSI32;
if (items < 1)
croak_xs_usage(cv, "array, ...");
{
mm_array * array;
#line 1771 "MMA.xs"
int add_count = items - 1;
SV *addSVs[add_count];
int i;
#line 2427 "MMA.c"
UV RETVAL;
dXSTARG;
if (sv_derived_from(ST(0), "mm_arrayPtr")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
array = INT2PTR(mm_array *,tmp);
}
else
Perl_croak(aTHX_ "%s: %s is not of type %s",
GvNAME(CvGV(cv)),
"array", "mm_arrayPtr");
#line 1775 "MMA.xs"
for (i=0; i < add_count; i++) addSVs[i] = ST(i+1);
if (!mm_array_splice (array, array->entries, 0, NULL,
add_count, addSVs, ix)
&& PL_dowarn && mm_error()) warn ("IPC::MMA: %s", mm_error());
RETVAL = array->entries;
#line 2444 "MMA.c"
XSprePUSH; PUSHu((UV)RETVAL);
}
XSRETURN(1);
}
On Mar 2, 2011, at 8:19 AM, Harakiri wrote:
Hello,
i've searched the mailing list and found an entry from 2001 that
var arg list were not supported in perl -> c :
http://www.mail-archive.com/perl-xs@perl.org/msg00345.html
Has this changed?
Im using the xsubpp util to create my glue cpp classes.
Example:
static int Random( int Count, ... );
turns into
XS(XS_MyClass_Random)
{
dXSARGS;
if (items < 2)
Perl_croak(aTHX_ "Usage: MyClass::Random(CLASS,
Count, ...)");
{
char * CLASS = (char *)SvPV_nolen(ST(0));
int RETVAL;
dXSTARG;
int Count = (int)SvIV(ST(1));
RETVAL = MyClass::Random(Count);
XSprePUSH; PUSHi((IV)RETVAL);
}
XSRETURN(1);
}
as you can see the "..." is not honored, only the first argument is
used. I know i could manually glue this somehow but i DONT want
that because i have alot of method signatures which always have
been converted fine using xsubpp - i dont want to manually alter
the generated file just for one method.
Is there a way?
Thank you!