Take a look on CPAN at the C + macros code as well as the XS code in 
Net::Interface in the xs module. Look at places that use PUSH or 
XPUSH that return a variety of references. hv's, av's, etc... 
examples of each type and their manipulation can be found in both the 
xs and C modules found in the distro directory.

How many items you push on the stack before returning is up to your 
code.


> G/Morning
> On 10/06/2011 4:20 PM, Torsten Schoenfeld wrote:
> > On 10.06.2011 00:15, NormW wrote:
> >>> AV *results;
> >>> results = newAV();
> >>> ....
> >>> something = (AV *)SvRV(*other_av_thing);
> >>> ....
> >>> av_store(results,i, something);
> >>> ....
> >>> RETVAL = results;
> >>> sv_2mortal((SV *)RETVAL);
> >> Have seen that method in several XS programs (and PerlXSTut iirc)
> >> but it is unclear if that works when 3 elements are to be returned;
> >> will have a closer look at the Perl XS docs...
> >
> > In short: create the AVs like above, then use newRV_noinc to create
> > array references and push these onto the stack with XPUSHs. Use
> > sv_2mortal only on the array references.
> Thanks for the tip! Well make it my next method to try if the one now
> working on lays an egg.
> 
> Decided to examine what was needed on the Perl end of the XS function
> and after some doodling came up with:
> 
> my @ri = array of socket handles (similar to select.pm)
> 
> $n = nw_select(\@ri,\@wi,\@ei,$wait);
> 
> @ri;
> 
> I found some XS code that directly modifies an array(s) passed in as a
> parm, and doing this means it isn't necessary to return arrays via the
> stack, and can use RETVAL to return $nfound, which makes this a whole
> lot simpler problem... (assuming NetWare stays happy).
> 
> Will advise this list on progress.
> 
> Thanks to all for all the help provided,
> Cheers,
> Norm


Reply via email to