X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FScalar-Vec-Util.git;a=blobdiff_plain;f=Util.xs;h=f48753935ca5bbe54c1b7beb730acf74a8a970e4;hp=75ba8cabcabc72fd469c12eb9ceb36381c39f15e;hb=9fb8fa8f2787544984b8feee41a6e8760849a263;hpb=dec1755eec42f54c4d57813ed03393c0f765a699 diff --git a/Util.xs b/Util.xs index 75ba8ca..f487539 100644 --- a/Util.xs +++ b/Util.xs @@ -11,7 +11,27 @@ #include "bitvect.h" -STATIC const char svu_error_invarg[] = "Invalid argument"; +STATIC size_t svu_validate_uv(pTHX_ SV *sv, const char *desc) { +#define svu_validate_uv(S, D) svu_validate_uv(aTHX_ (S), (D)) + IV i; + + if (SvOK(sv) && SvIOK(sv)) { + if (SvIsUV(sv)) + return SvUVX(sv); + else { + i = SvIVX(sv); + if (i >= 0) + return i; + } + } else { + i = SvIV(sv); + if (i >= 0) + return i; + } + + croak("Invalid negative %s", desc ? desc : "integer"); + return 0; +} /* --- XS ------------------------------------------------------------------ */ @@ -33,13 +53,10 @@ PREINIT: size_t s, l, n, o; char f, *v; CODE: - if (!SvOK(sv) || !SvOK(ss) || !SvOK(sl) || !SvOK(sf)) - croak(svu_error_invarg); - - l = SvUV(sl); + l = svu_validate_uv(sl, "length"); if (!l) XSRETURN(0); - s = SvUV(ss); + s = svu_validate_uv(ss, "offset"); f = SvTRUE(sf); SvUPGRADE(sv, SVt_PV); @@ -65,14 +82,11 @@ PREINIT: size_t fs, ts, l, lf = 0, n, o; char *t, *f; CODE: - if (!SvOK(sf) || !SvOK(sfs) || !SvOK(st) || !SvOK(sts) || !SvOK(sl)) - croak(svu_error_invarg); - - l = SvUV(sl); + l = svu_validate_uv(sl, "length"); if (!l) XSRETURN(0); - fs = SvUV(sfs); - ts = SvUV(sts); + fs = svu_validate_uv(sfs, "offset"); + ts = svu_validate_uv(sts, "offset"); SvUPGRADE(sf, SVt_PV); SvUPGRADE(st, SVt_PV); @@ -114,14 +128,11 @@ PREINIT: size_t s1, s2, l, o, n; char *v1, *v2; CODE: - if (!SvOK(sv1) || !SvOK(ss1) || !SvOK(sv2) || !SvOK(ss2) || !SvOK(sl)) - croak(svu_error_invarg); - - l = SvUV(sl); + l = svu_validate_uv(sl, "length"); if (!l) - XSRETURN(0); - s1 = SvUV(ss1); - s2 = SvUV(ss2); + XSRETURN_YES; + s1 = svu_validate_uv(ss1, "offset"); + s2 = svu_validate_uv(ss2, "offset"); SvUPGRADE(sv1, SVt_PV); SvUPGRADE(sv2, SVt_PV);