1 /* This file is part of the Scalar::Vec::Util Perl module.
2 * See http://search.cpan.org/dist/Scalar-Vec-Util/ */
4 #define PERL_NO_GET_CONTEXT
9 #define __PACKAGE__ "Scalar::Vec::Util"
10 #define __PACKAGE_LEN__ (sizeof(__PACKAGE__)-1)
14 STATIC const char svu_error_invarg[] = "Invalid argument";
16 /* --- XS ------------------------------------------------------------------ */
18 MODULE = Scalar::Vec::Util PACKAGE = Scalar::Vec::Util
24 HV *stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, 1);
25 newCONSTSUB(stash, "SVU_PP", newSVuv(0));
26 newCONSTSUB(stash, "SVU_SIZE", newSVuv(SVU_SIZE));
30 vfill(SV *sv, SV *ss, SV *sl, SV *sf)
35 if (!SvOK(sv) || !SvOK(ss) || !SvOK(sl) || !SvOK(sf))
36 croak(svu_error_invarg);
43 SvUPGRADE(sv, SVt_PV);
49 Zero(v + o, n - o, char);
61 vcopy(SV *sf, SV *sfs, SV *st, SV *sts, SV *sl)
63 size_t fs, ts, l, lf = 0, n, o;
66 if (!SvOK(sf) || !SvOK(sfs) || !SvOK(st) || !SvOK(sts) || !SvOK(sl))
67 croak(svu_error_invarg);
74 SvUPGRADE(sf, SVt_PV);
75 SvUPGRADE(st, SVt_PV);
81 Zero(t + o, n - o, char);
87 f = SvPVX(sf); /* We do it there in case st == sf. */
92 lf = fs + l - o * CHAR_BIT;
93 l = o * CHAR_BIT - fs;
97 bv_move(f, ts, fs, l);
99 bv_copy(t, ts, f, fs, l);
103 bv_fill(t, ts + l, lf, 0);
109 veq(SV *sv1, SV *ss1, SV *sv2, SV *ss2, SV *sl)
111 size_t s1, s2, l, o, n;
114 if (!SvOK(sv1) || !SvOK(ss1) || !SvOK(sv2) || !SvOK(ss2) || !SvOK(sl))
115 croak(svu_error_invarg);
120 SvUPGRADE(sv1, SVt_PV);
121 SvUPGRADE(sv2, SVt_PV);
126 l = o * CHAR_BIT - s1;
132 l = o * CHAR_BIT - s2;
138 RETVAL = newSVuv(bv_eq(v1, s1, v2, s2, l));