]> git.vpit.fr Git - perl/modules/Scalar-Vec-Util.git/blobdiff - Util.xs
Build the $name and the main $file from $dist
[perl/modules/Scalar-Vec-Util.git] / Util.xs
diff --git a/Util.xs b/Util.xs
index f954a42bcac3126d10215331e9b23ac3f521c139..f48753935ca5bbe54c1b7beb730acf74a8a970e4 100644 (file)
--- a/Util.xs
+++ b/Util.xs
 
 #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 ------------------------------------------------------------------ */
 
@@ -28,17 +48,15 @@ BOOT:
 
 void
 vfill(SV *sv, SV *ss, SV *sl, SV *sf)
+PROTOTYPE: $$$$
 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);
 
@@ -59,18 +77,16 @@ CODE:
 
 void
 vcopy(SV *sf, SV *sfs, SV *st, SV *sts, SV *sl)
+PROTOTYPE: $$$$$
 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);
 
@@ -107,18 +123,16 @@ CODE:
 
 SV *
 veq(SV *sv1, SV *ss1, SV *sv2, SV *ss2, SV *sl)
+PROTOTYPE: $$$$$
 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);