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 size_t svu_validate_uv(pTHX_ SV *sv, const char *desc) {
15 #define svu_validate_uv(S, D) svu_validate_uv(aTHX_ (S), (D))
18 if (SvOK(sv) && SvIOK(sv)) {
32 croak("Invalid negative %s", desc ? desc : "integer");
36 /* --- XS ------------------------------------------------------------------ */
38 MODULE = Scalar::Vec::Util PACKAGE = Scalar::Vec::Util
44 HV *stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, 1);
45 newCONSTSUB(stash, "SVU_PP", newSVuv(0));
46 newCONSTSUB(stash, "SVU_SIZE", newSVuv(SVU_SIZE));
50 vfill(SV *sv, SV *ss, SV *sl, SV *sf)
56 l = svu_validate_uv(sl, "length");
59 s = svu_validate_uv(ss, "offset");
61 SvUPGRADE(sv, SVt_PV);
67 Zero(v + o, n - o, char);
79 vcopy(SV *sf, SV *sfs, SV *st, SV *sts, SV *sl)
82 size_t fs, ts, l, lf = 0, n, o;
85 l = svu_validate_uv(sl, "length");
88 fs = svu_validate_uv(sfs, "offset");
89 ts = svu_validate_uv(sts, "offset");
90 SvUPGRADE(sf, SVt_PV);
91 SvUPGRADE(st, SVt_PV);
97 Zero(t + o, n - o, char);
103 f = SvPVX(sf); /* We do it there in case st == sf. */
108 lf = fs + l - o * CHAR_BIT;
109 l = o * CHAR_BIT - fs;
113 bv_move(f, ts, fs, l);
115 bv_copy(t, ts, f, fs, l);
119 bv_fill(t, ts + l, lf, 0);
125 veq(SV *sv1, SV *ss1, SV *sv2, SV *ss2, SV *sl)
128 size_t s1, s2, l, o, n;
131 l = svu_validate_uv(sl, "length");
134 s1 = svu_validate_uv(ss1, "offset");
135 s2 = svu_validate_uv(ss2, "offset");
136 SvUPGRADE(sv1, SVt_PV);
137 SvUPGRADE(sv2, SVt_PV);
142 l = o * CHAR_BIT - s1;
148 l = o * CHAR_BIT - s2;
154 RETVAL = newSVuv(bv_eq(v1, s1, v2, s2, l));