39 lines
902 B
C
39 lines
902 B
C
|
#include "EXTERN.h"
|
||
|
#include "perl.h"
|
||
|
#include "XSUB.h"
|
||
|
#include "INLINE.h"
|
||
|
|
||
|
char** XS_unpack_charPtrPtr(SV* arg) {
|
||
|
AV* avref;
|
||
|
char** array;
|
||
|
STRLEN len;
|
||
|
SV** elem;
|
||
|
int i;
|
||
|
|
||
|
if(!SvROK(arg))
|
||
|
croak("XS_unpack_charPtrPtr: arg is not a reference");
|
||
|
if( SvTYPE(SvRV(arg)) != SVt_PVAV)
|
||
|
croak("XS_unpack_charPtrPtr: arg is not an array");
|
||
|
avref = (AV*)SvRV(arg);
|
||
|
len = av_len( avref) + 1;
|
||
|
array = (char **) SvPVX( sv_2mortal( NEWSV(0, (len +1) * sizeof( char*) )));
|
||
|
for(i = 0; i < len; i++ ) {
|
||
|
elem = av_fetch( avref, i, 0);
|
||
|
array[i] = (char *) SvPV( *elem, PL_na);
|
||
|
}
|
||
|
array[len] = NULL;
|
||
|
return array;
|
||
|
}
|
||
|
|
||
|
void XS_pack_charPtrPtr( SV* arg, char** array, int count) {
|
||
|
int i;
|
||
|
AV* avref;
|
||
|
|
||
|
avref = (AV*) sv_2mortal((SV*) newAV() );
|
||
|
for( i = 0; i < count; i++) {
|
||
|
av_push(avref, newSVpv(array[i], strlen(array[i])) );
|
||
|
}
|
||
|
SvSetSV( arg, newRV((SV*) avref) );
|
||
|
}
|
||
|
|