]> git.vpit.fr Git - perl/modules/Sub-Nary.git/blobdiff - Nary.xs
Rewrite zero in XS
[perl/modules/Sub-Nary.git] / Nary.xs
diff --git a/Nary.xs b/Nary.xs
index 1d6cb98db32952e097f86667f005c55c5bd3b58d..2415760185f879bcddfba0c20c1ade5d93ab449f 100644 (file)
--- a/Nary.xs
+++ b/Nary.xs
@@ -33,6 +33,42 @@ CODE:
  ST(0) = sv_2mortal(newSVuv(o == NULL));
  XSRETURN(1);
 
+void
+zero(SV *sv)
+PROTOTYPE: $
+PREINIT:
+ HV *hv;
+ IV res;
+CODE:
+ if (!SvOK(sv))
+  XSRETURN_IV(1);
+ if (!SvROK(sv)) {
+  res = SvNOK(sv) ? SvNV(sv) == 0.0 : SvUV(sv) == 0;
+  XSRETURN_IV(res);
+ }
+ hv = (HV *) SvRV(sv);
+ res = hv_exists(hv, "0", 1) && hv_iterinit(hv) == 1;
+ XSRETURN_IV(res);
+
+void
+count(SV *sv)
+PROTOTYPE: $
+PREINIT:
+ HV *hv;
+ HE *key;
+ NV c = 0;
+CODE:
+ if (!SvOK(sv))
+  XSRETURN_IV(0);
+ if (!SvROK(sv))
+  XSRETURN_IV(1);
+ hv = (HV *) SvRV(sv);
+ hv_iterinit(hv);
+ while (key = hv_iternext(hv)) {
+  c += SvNV(HeVAL(key));
+ }
+ XSRETURN_NV(c);
+
 void
 scalops()
 PROTOTYPE: