Fwd: Call variable length argument function from perl -> C using autogenerated code from xsubpp

[email protected]
Newsgroups perl.xs
Message-ID <[email protected]>
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/[email protected]/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!
>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.