Params-Validate
view release on metacpan or search on metacpan
lib/Params/Validate/XS.xs view on Meta::CPAN
break;
}
buffer = validate_pos_failure(av_len(p), min, av_len(specs), options);
validation_failure(buffer, options);
}
}
}
validate_pos_depends(p, specs, options);
/* test for extra parameters */
if (av_len(p) > av_len(specs)) {
if ((temp = hv_fetch(options, "allow_extra", 11, 0))) {
SvGETMAGIC(*temp);
allow_extra = SvTRUE(*temp);
}
else {
allow_extra = 0;
}
if (allow_extra) {
/* put all additional parameters into return array */
if (GIMME_V != G_VOID) {
for(i = av_len(specs) + 1; i <= av_len(p); i++) {
value = *av_fetch(p, i, 1);
if (value) {
SvGETMAGIC(value);
av_push(ret, SvREFCNT_inc(value));
}
else {
av_push(ret, &PL_sv_undef);
}
}
}
}
else {
SV* buffer = validate_pos_failure(av_len(p), min, av_len(specs), options);
validation_failure(buffer, options);
}
}
if (GIMME_V != G_VOID) {
for (i = 0; i <= av_len(untaint_indexes); i++) {
SvTAINTED_off(*av_fetch(p, SvIV(*av_fetch(untaint_indexes, i, 0)), 0));
}
}
return 1;
}
MODULE = Params::Validate::XS PACKAGE = Params::Validate::XS
void
validate(p, specs)
SV* p
SV* specs
PROTOTYPE: \@$
PPCODE:
HV* ret = NULL;
AV* pa;
HV* ph;
HV* options;
IV ok;
if (no_validation() && GIMME_V == G_VOID) {
XSRETURN(0);
}
SvGETMAGIC(p);
if (! (SvROK(p) && SvTYPE(SvRV(p)) == SVt_PVAV)) {
croak("Expecting array reference as first parameter");
}
SvGETMAGIC(specs);
if (! (SvROK(specs) && SvTYPE(SvRV(specs)) == SVt_PVHV)) {
croak("Expecting hash reference as second parameter");
}
pa = (AV*) SvRV(p);
ph = NULL;
if (av_len(pa) == 0) {
/* we were called as validate( @_, ... ) where @_ has a
single element, a hash reference */
SV* value;
value = *av_fetch(pa, 0, 1);
if (value) {
SvGETMAGIC(value);
if (SvROK(value) && SvTYPE(SvRV(value)) == SVt_PVHV) {
ph = (HV*) SvRV(value);
}
}
}
options = get_options(NULL);
if (! ph) {
ph = (HV*) sv_2mortal((SV*) newHV());
PUTBACK;
ok = convert_array2hash(pa, options, ph);
SPAGAIN;
if (!ok) {
XSRETURN(0);
}
}
if (GIMME_V != G_VOID) {
ret = (HV*) sv_2mortal((SV*) newHV());
}
PUTBACK;
ok = validate(ph, (HV*) SvRV(specs), options, ret);
SPAGAIN;
if (! ok) {
XSRETURN(0);
}
RETURN_HASH(ret);
void
validate_pos(p, ...)
SV* p
PROTOTYPE: \@@
PPCODE:
AV* specs;
AV* ret = NULL;
IV i;
IV ok;
if (no_validation() && GIMME_V == G_VOID) {
XSRETURN(0);
}
SvGETMAGIC(p);
if (!SvROK(p) || !(SvTYPE(SvRV(p)) == SVt_PVAV)) {
croak("Expecting array reference as first parameter");
}
specs = (AV*) sv_2mortal((SV*) newAV());
av_extend(specs, items);
for(i = 1; i < items; i++) {
if (!av_store(specs, i - 1, SvREFCNT_inc(ST(i)))) {
SvREFCNT_dec(ST(i));
croak("Cannot store value in array");
}
}
if (GIMME_V != G_VOID) {
ret = (AV*) sv_2mortal((SV*) newAV());
}
PUTBACK;
ok = validate_pos((AV*) SvRV(p), specs, get_options(NULL), ret);
SPAGAIN;
if (! ok) {
XSRETURN(0);
}
RETURN_ARRAY(ret);
void
validate_with(...)
PPCODE:
HV* p;
SV* params;
SV* spec;
IV i;
IV ok;
if (no_validation() && GIMME_V == G_VOID) XSRETURN(0);
/* put input list into hash */
p = (HV*) sv_2mortal((SV*) newHV());
for(i = 0; i < items; i += 2) {
SV* key;
SV* value;
key = ST(i);
if (i + 1 < items) {
value = ST(i + 1);
}
else {
value = &PL_sv_undef;
}
if (! hv_store_ent(p, key, SvREFCNT_inc(value), 0)) {
SvREFCNT_dec(value);
croak("Cannot add new key to hash");
}
}
params = *hv_fetch(p, "params", 6, 1);
SvGETMAGIC(params);
spec = *hv_fetch(p, "spec", 4, 1);
SvGETMAGIC(spec);
if (SvROK(spec) && SvTYPE(SvRV(spec)) == SVt_PVAV) {
if (SvROK(params) && SvTYPE(SvRV(params)) == SVt_PVAV) {
AV* ret = NULL;
if (GIMME_V != G_VOID) {
ret = (AV*) sv_2mortal((SV*) newAV());
}
PUTBACK;
ok = validate_pos((AV*) SvRV(params), (AV*) SvRV(spec), get_options(p), ret);
SPAGAIN;
if (! ok) {
XSRETURN(0);
}
RETURN_ARRAY(ret);
}
else {
croak("Expecting array reference in 'params'");
}
}
else if (SvROK(spec) && SvTYPE(SvRV(spec)) == SVt_PVHV) {
HV* hv;
HV* ret = NULL;
HV* options;
( run in 0.574 second using v1.01-cache-2.11-cpan-5511b514fd6 )