Scalar-List-Utils
view release on metacpan or search on metacpan
ListUtil.xs view on Meta::CPAN
void
any(block,...)
SV *block
ALIAS:
none = 0
all = 1
any = 2
notall = 3
PROTOTYPE: &@
PPCODE:
{
int ret_true = !(ix & 2); /* return true at end of loop for none/all; false for any/notall */
int invert = (ix & 1); /* invert block test for all/notall */
SV **args = &PL_stack_base[ax];
CV *cv = sv_to_cv(block,
ix == 0 ? "none" :
ix == 1 ? "all" :
ix == 2 ? "any" :
ix == 3 ? "notall" :
"unknown 'any' alias");
ListUtil.xs view on Meta::CPAN
ST(0) = ret_true ? &PL_sv_yes : &PL_sv_no;
XSRETURN(1);
}
void
head(size,...)
PROTOTYPE: $@
ALIAS:
head = 0
tail = 1
PPCODE:
{
int size = 0;
int start = 0;
int end = 0;
int i = 0;
size = SvIV( ST(0) );
if ( ix == 0 ) {
start = 1;
ListUtil.xs view on Meta::CPAN
for ( i = start; i < end; i++ ) {
PUSHs( sv_2mortal( newSVsv( ST(i) ) ) );
}
XSRETURN( end - start );
}
}
void
pairs(...)
PROTOTYPE: @
PPCODE:
{
int argi = 0;
int reti = 0;
HV *pairstash = get_hv("List::Util::_Pair::", GV_ADD);
if(items % 2 && ckWARN(WARN_MISC))
warn("Odd number of elements in pairs");
{
for(; argi < items; argi += 2) {
ListUtil.xs view on Meta::CPAN
reti++;
}
}
XSRETURN(reti);
}
void
unpairs(...)
PROTOTYPE: @
PPCODE:
{
/* Unlike pairs(), we're going to trash the input values on the stack
* almost as soon as we start generating output. So clone them first
*/
int i;
SV **args_copy;
Newx(args_copy, items, SV *);
SAVEFREEPV(args_copy);
Copy(&ST(0), args_copy, items, SV *);
ListUtil.xs view on Meta::CPAN
else
PUSHs(&PL_sv_undef);
}
XSRETURN(items * 2);
}
void
pairkeys(...)
PROTOTYPE: @
PPCODE:
{
int argi = 0;
int reti = 0;
if(items % 2 && ckWARN(WARN_MISC))
warn("Odd number of elements in pairkeys");
{
for(; argi < items; argi += 2) {
SV *a = ST(argi);
ListUtil.xs view on Meta::CPAN
ST(reti++) = sv_2mortal(newSVsv(a));
}
}
XSRETURN(reti);
}
void
pairvalues(...)
PROTOTYPE: @
PPCODE:
{
int argi = 0;
int reti = 0;
if(items % 2 && ckWARN(WARN_MISC))
warn("Odd number of elements in pairvalues");
{
for(; argi < items; argi += 2) {
SV *b = argi < items-1 ? ST(argi+1) : &PL_sv_undef;
ListUtil.xs view on Meta::CPAN
}
}
XSRETURN(reti);
}
void
pairfirst(block,...)
SV *block
PROTOTYPE: &@
PPCODE:
{
GV *agv,*bgv;
CV *cv = sv_to_cv(block, "pairfirst");
I32 ret_gimme = GIMME_V;
int argi = 1; /* "shift" the block */
if(!(items % 2) && ckWARN(WARN_MISC))
warn("Odd number of elements in pairfirst");
agv = gv_fetchpv("a", GV_ADD, SVt_PV);
ListUtil.xs view on Meta::CPAN
}
}
XSRETURN(0);
}
void
pairgrep(block,...)
SV *block
PROTOTYPE: &@
PPCODE:
{
GV *agv,*bgv;
CV *cv = sv_to_cv(block, "pairgrep");
I32 ret_gimme = GIMME_V;
/* This function never returns more than it consumed in arguments. So we
* can build the results "live", behind the arguments
*/
int argi = 1; /* "shift" the block */
int reti = 0;
ListUtil.xs view on Meta::CPAN
else if(ret_gimme == G_SCALAR) {
ST(0) = newSViv(reti);
XSRETURN(1);
}
}
void
pairmap(block,...)
SV *block
PROTOTYPE: &@
PPCODE:
{
GV *agv,*bgv;
CV *cv = sv_to_cv(block, "pairmap");
SV **args_copy = NULL;
I32 ret_gimme = GIMME_V;
int argi = 1; /* "shift" the block */
int reti = 0;
if(!(items % 2) && ckWARN(WARN_MISC))
ListUtil.xs view on Meta::CPAN
}
void
zip(...)
ALIAS:
zip_longest = ZIP_LONGEST
zip_shortest = ZIP_SHORTEST
mesh = ZIP_MESH
mesh_longest = ZIP_MESH_LONGEST
mesh_shortest = ZIP_MESH_SHORTEST
PPCODE:
Size_t nlists = items; /* number of lists */
AV **lists; /* inbound lists */
Size_t len = 0; /* length of longest inbound list = length of result */
Size_t i;
bool is_mesh = (ix & ZIP_MESH);
ix &= ~ZIP_MESH;
if(!nlists)
XSRETURN(0);
ListUtil.xs view on Meta::CPAN
}
MODULE=List::Util PACKAGE=Sub::Util
void
set_prototype(proto, code)
SV *proto
SV *code
PREINIT:
SV *cv; /* not CV * */
PPCODE:
SvGETMAGIC(code);
if(!SvROK(code))
croak("set_prototype: not a reference");
cv = SvRV(code);
if(SvTYPE(cv) != SVt_PVCV)
croak("set_prototype: not a subroutine reference");
if(SvPOK(proto)) {
/* set the prototype */
ListUtil.xs view on Meta::CPAN
HV *stash = CopSTASH(PL_curcop);
const char *s, *end = NULL, *begin = NULL;
MAGIC *mg;
STRLEN namelen;
const char* nameptr = SvPV(name, namelen);
int utf8flag = SvUTF8(name);
#if PERL_VERSION_LT(5, 41, 3) || PERL_VERSION_GT(5, 41, 5)
int quotes_seen = 0;
bool need_subst = FALSE;
#endif
PPCODE:
if (!SvROK(sub) && SvGMAGICAL(sub))
mg_get(sub);
if (SvROK(sub))
cv = (CV *) SvRV(sub);
else if (SvTYPE(sub) == SVt_PVGV)
cv = GvCVu(sub);
else if (!SvOK(sub))
croak(PL_no_usym, "a subroutine");
else if (PL_op->op_private & HINT_STRICT_REFS)
croak("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use",
ListUtil.xs view on Meta::CPAN
#endif
PUSHs(sub);
void
subname(code)
SV *code
PREINIT:
CV *cv;
GV *gv;
const char *stashname;
PPCODE:
if (!SvROK(code) && SvGMAGICAL(code))
mg_get(code);
if(!SvROK(code) || SvTYPE(cv = (CV *)SvRV(code)) != SVt_PVCV)
croak("Not a subroutine reference");
if(!(gv = CvGV(cv)))
XSRETURN(0);
if(GvSTASH(gv))
( run in 0.526 second using v1.01-cache-2.11-cpan-5511b514fd6 )