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 void svu_validate_uv(pTHX_ SV *sv, size_t *offset, const char *desc) {
15 #define svu_validate_uv(S, O, D) svu_validate_uv(aTHX_ (S), (O), (D))
18 if (SvOK(sv) && SvIOK(sv)) {
38 croak("Invalid negative %s", desc ? desc : "integer");
41 /* --- XS ------------------------------------------------------------------ */
43 MODULE = Scalar::Vec::Util PACKAGE = Scalar::Vec::Util
49 HV *stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, 1);
50 newCONSTSUB(stash, "SVU_PP", newSVuv(0));
51 newCONSTSUB(stash, "SVU_SIZE", newSVuv(SVU_SIZE));
55 vfill(SV *sv, SV *ss, SV *sl, SV *sf)
61 svu_validate_uv(sl, &l, "length");
64 svu_validate_uv(ss, &s, "offset");
66 SvUPGRADE(sv, SVt_PV);
72 Zero(v + o, n - o, char);
84 vcopy(SV *sf, SV *sfs, SV *st, SV *sts, SV *sl)
87 size_t fs, ts, l, lf = 0, n, o;
90 svu_validate_uv(sl, &l, "length");
93 svu_validate_uv(sfs, &fs, "offset");
94 svu_validate_uv(sts, &ts, "offset");
95 SvUPGRADE(sf, SVt_PV);
96 SvUPGRADE(st, SVt_PV);
102 Zero(t + o, n - o, char);
108 f = SvPVX(sf); /* We do it there in case st == sf. */
113 lf = fs + l - o * CHAR_BIT;
114 l = o * CHAR_BIT - fs;
118 bv_move(f, ts, fs, l);
120 bv_copy(t, ts, f, fs, l);
124 bv_fill(t, ts + l, lf, 0);
130 veq(SV *sv1, SV *ss1, SV *sv2, SV *ss2, SV *sl)
133 size_t s1, s2, l, o, n;
136 svu_validate_uv(sl, &l, "length");
139 svu_validate_uv(ss1, &s1, "offset");
140 svu_validate_uv(ss2, &s2, "offset");
141 SvUPGRADE(sv1, SVt_PV);
142 SvUPGRADE(sv2, SVt_PV);
147 l = o * CHAR_BIT - s1;
153 l = o * CHAR_BIT - s2;
159 RETVAL = newSVuv(bv_eq(v1, s1, v2, s2, l));