Data-BitStream-XS
view release on metacpan or search on metacpan
}
SV *
read_string(IN Data::BitStream::XS list, IN int bits)
PREINIT:
char* buf;
CODE:
if (list->is_writing)
{ croak("read while writing"); XSRETURN_UNDEF; }
if (bits < 0)
{ croak("invalid parameters: bits %d must be >= 0",bits); XSRETURN_UNDEF;}
if (bits > (list->len - list->pos))
{ croak("short read"); XSRETURN_UNDEF; }
buf = read_string(list, bits);
RETVAL = newSVpvn(buf, bits);
Safefree(buf);
OUTPUT:
RETVAL
SV*
to_raw(IN Data::BitStream::XS list)
PREINIT:
char* buf;
size_t bytes;
CODE:
buf = to_raw(list);
bytes = NBYTES(list->len); /* Return just the necessary number of bytes */
RETVAL = newSVpvn(buf, bytes);
Safefree(buf);
OUTPUT:
RETVAL
void
put_raw(IN Data::BitStream::XS list, IN const char* str, IN int bits)
void
from_raw(IN Data::BitStream::XS list, IN const char* str, IN int bits)
void
_xput_stream(IN Data::BitStream::XS list, IN Data::BitStream::XS source)
CODE:
if (!list->is_writing) {
croak("write while reading");
} else {
_xput_stream(list, source);
}
void
get_unary(IN Data::BitStream::XS list, IN int count = 1)
ALIAS:
get_unary1 = 1
get_gamma = 2
get_delta = 3
get_omega = 4
get_fib = 5
get_levenstein = 6
get_evenrodeh = 7
get_goldbach_g1 = 8
get_goldbach_g2 = 9
PPCODE:
switch (ix) {
case 0: GET_CODE(unary); break;
case 1: GET_CODE(unary1); break;
case 2: GET_CODE(gamma); break;
case 3: GET_CODE(delta); break;
case 4: GET_CODE(omega); break;
case 5: GET_CODE(fib); break;
case 6: GET_CODE(levenstein); break;
case 7: GET_CODE(evenrodeh); break;
case 8: GET_CODE(goldbach_g1); break;
case 9:
default: GET_CODE(goldbach_g2); break;
}
void
put_unary(IN Data::BitStream::XS list, ...)
ALIAS:
put_unary1 = 1
put_gamma = 2
put_delta = 3
put_omega = 4
put_fib = 5
put_levenstein = 6
put_evenrodeh = 7
put_goldbach_g1 = 8
put_goldbach_g2 = 9
PREINIT:
int c;
CODE:
if (!list->is_writing) croak("write while reading");
c = 0;
while (++c < items) {
UV n = get_uv_from_st(ST(c));
switch (ix) {
case 0: put_unary(list,n); break;
case 1: put_unary1(list,n); break;
case 2: put_gamma(list,n); break;
case 3: put_delta(list,n); break;
case 4: put_omega(list,n); break;
case 5: put_fib(list,n); break;
case 6: put_levenstein(list,n); break;
case 7: put_evenrodeh(list,n); break;
case 8: put_goldbach_g1(list,n); break;
case 9:
default: put_goldbach_g2(list,n); break;
}
}
void
get_fibgen(IN Data::BitStream::XS list, IN int m, IN int count = 1)
ALIAS:
get_binword = 1
get_baer = 2
get_boldivigna = 3
get_comma = 4
get_gamma_rice = 5
get_expgolomb = 25
get_gamma_golomb = 6
get_gammagolomb = 26
PPCODE:
if (ix == 25) ix = 5;
if (ix == 26) ix = 6;
if ( (ix == 0 && (m < 2 || m > 16)) ||
(ix == 1 && (m <= 0 || m > BITS_PER_WORD)) ||
(ix == 2 && (m < -32 || m > 32)) ||
(ix == 3 && (m < 1 || m > 15)) ||
(ix == 4 && (m < 1 || m > 16)) ||
(ix == 5 && (m < 0 || m > BITS_PER_WORD)) ||
(ix == 6 && m < 1) )
croak("invalid parameters: %d\n", m);
switch (ix) {
case 0: GET_CODEP(fibgen, m); break;
case 1: GET_CODEP(binword, m); break;
case 2: GET_CODEP(baer, m); break;
case 3: GET_CODEP(boldivigna, m); break;
case 4: GET_CODEP(comma, m); break;
case 5: GET_CODEP(gamma_rice, m); break;
case 6:
default: GET_CODEP(gamma_golomb, m); break;
}
void
put_fibgen(IN Data::BitStream::XS list, IN int m, ...)
ALIAS:
put_binword = 1
put_baer = 2
put_boldivigna = 3
put_comma = 4
put_gamma_rice = 5
put_expgolomb = 25
put_gamma_golomb = 6
put_gammagolomb = 26
PREINIT:
int c;
CODE:
if (!list->is_writing) croak("write while reading");
if (ix == 25) ix = 5;
if (ix == 26) ix = 6;
if ( (ix == 0 && (m < 2 || m > 16)) ||
(ix == 1 && (m <= 0 || m > BITS_PER_WORD)) ||
(ix == 2 && (m < -32 || m > 32)) ||
(ix == 3 && (m < 1 || m > 15)) ||
(ix == 4 && (m < 1 || m > 16)) ||
(ix == 5 && (m < 0 || m > BITS_PER_WORD)) ||
(ix == 6 && m < 1) )
croak("invalid parameters: %d\n", m);
c = 1;
while (++c < items) {
UV n = get_uv_from_st(ST(c));
switch (ix) {
case 0: put_fibgen(list,m,n); break;
case 1: put_binword(list,m,n); break;
case 2: put_baer(list,m,n); break;
case 3: put_boldivigna(list,m,n); break;
case 4: put_comma(list,m,n); break;
case 5: put_gamma_rice(list,m,n); break;
case 6:
default: put_gamma_golomb(list,m,n); break;
}
}
void
get_blocktaboo(IN Data::BitStream::XS list, IN const char* taboostr, IN int count = 1)
PREINIT:
int k;
UV taboo;
PPCODE:
k = parse_binary_string(taboostr, &taboo);
if ( (k < 1) || (k > 16) ) {
croak("invalid parameters: block taboo %s", taboostr);
XSRETURN_UNDEF;
}
GET_CODEPP(block_taboo, k, taboo);
void
put_blocktaboo(IN Data::BitStream::XS list, IN const char* taboostr, ...)
PREINIT:
int k;
UV taboo;
CODE:
k = parse_binary_string(taboostr, &taboo);
if ( (k < 1) || (k > 16) ) {
croak("invalid parameters: block taboo %s", taboostr);
return;
}
/* We've turned one argument into two */
PUT_CODEVP(block_taboo, 1, list, k, taboo);
void
_xget_rice_sub(IN Data::BitStream::XS list, IN SV* coderef, IN int k, IN int count = 1)
PREINIT:
SV* self = ST(0);
SV* cref = 0;
PPCODE:
if ( (k < 0) || (k > BITS_PER_WORD) ) {
croak("invalid parameters: rice %d", k);
XSRETURN_UNDEF;
}
if (!SvROK(coderef)) {
self = 0;
cref = 0;
} else {
if ((!SvROK(coderef)) || (SvTYPE(SvRV(coderef)) != SVt_PVCV) ) {
croak("invalid parameters: rice coderef");
return;
}
cref = SvRV(coderef);
}
GET_CODESPP(rice_sub, self, cref, k);
void
_xput_rice_sub(IN Data::BitStream::XS list, IN SV* coderef, IN int k, ...)
PREINIT:
SV* self = ST(0);
SV* cref = 0;
CODE:
if ( (k < 0) || (k > BITS_PER_WORD) ) {
croak("invalid parameters: rice %d", k);
return;
}
if (!SvROK(coderef)) {
self = 0;
cref = 0;
} else {
if ((!SvROK(coderef)) || (SvTYPE(SvRV(coderef)) != SVt_PVCV) ) {
croak("invalid parameters: rice coderef");
return;
}
cref = SvRV(coderef);
}
PUT_CODESPP(rice_sub, self, cref, k);
void
_xget_golomb_sub(IN Data::BitStream::XS list, IN SV* coderef, IN UV m, IN int count = 1)
PREINIT:
SV* self = ST(0);
SV* cref = 0;
PPCODE:
if (m < W_ONE) {
croak("invalid parameters: golomb %lu", m);
XSRETURN_UNDEF;
}
if (!SvROK(coderef)) {
self = 0;
cref = 0;
} else {
if ((!SvROK(coderef)) || (SvTYPE(SvRV(coderef)) != SVt_PVCV) ) {
croak("invalid parameters: golomb coderef");
return;
}
cref = SvRV(coderef);
}
GET_CODESPP(golomb_sub, self, cref, m);
void
_xput_golomb_sub(IN Data::BitStream::XS list, IN SV* coderef, IN UV m, ...)
PREINIT:
SV* self = ST(0);
SV* cref = 0;
CODE:
if (m < W_ONE) {
croak("invalid parameters: golomb %lu", m);
return;
}
if (!SvROK(coderef)) {
self = 0;
cref = 0;
} else {
if ((!SvROK(coderef)) || (SvTYPE(SvRV(coderef)) != SVt_PVCV) ) {
croak("invalid parameters: golomb coderef");
return;
}
cref = SvRV(coderef);
}
PUT_CODESPP(golomb_sub, self, cref, m);
void
_xget_arice_sub(list, coderef, k, count=1)
Data::BitStream::XS list
SV* coderef
int &k
int count
PREINIT:
SV* self = ST(0);
SV* cref = 0;
SV* stack_k_ptr = ST(2); /* Remember position of k, it will be modified */
PPCODE:
if ( (k < 0) || (k > BITS_PER_WORD) ) {
croak("invalid parameters: adaptive_rice %d", k);
XSRETURN_UNDEF;
}
if (!SvROK(coderef)) {
self = 0;
cref = 0;
} else {
if ((!SvROK(coderef)) || (SvTYPE(SvRV(coderef)) != SVt_PVCV) ) {
croak("invalid parameters: adaptive_rice coderef");
return;
}
cref = SvRV(coderef);
}
GET_CODESPP(adaptive_rice_sub, self, cref, &k);
/* Return the modified k back to Perl */
sv_setiv(stack_k_ptr, k);
SvSETMAGIC(stack_k_ptr);
void
_xput_arice_sub(list, coderef, k, ...)
Data::BitStream::XS list
SV* coderef
int &k
PREINIT:
SV* self = ST(0);
SV* cref = 0;
CODE:
if ( (k < 0) || (k > BITS_PER_WORD) ) {
croak("invalid parameters: adaptive_rice %d", k);
return;
}
if (!SvROK(coderef)) {
self = 0;
cref = 0;
} else {
if ((!SvROK(coderef)) || (SvTYPE(SvRV(coderef)) != SVt_PVCV) ) {
croak("invalid parameters: adaptive_rice coderef");
return;
}
cref = SvRV(coderef);
}
PUT_CODESPP(adaptive_rice_sub, self, cref, &k);
OUTPUT:
k
void
get_startstop(IN Data::BitStream::XS list, IN SV* p, IN int count = 1)
PREINIT:
char* map;
PPCODE:
map = make_startstop_prefix_map(p);
if (map == 0) {
XSRETURN_UNDEF;
}
/* TODO: we'll skip free in some croak conditions */
GET_CODEP(startstop, map);
Safefree(map);
void
put_startstop(IN Data::BitStream::XS list, IN SV* p, ...)
PREINIT:
char* map;
CODE:
map = make_startstop_prefix_map(p);
if (map == 0)
return;
PUT_CODEVP(startstop, 1, list, map);
Safefree(map);
void prime_init(IN UV n)
UV prime_count(IN UV n)
UV nth_prime(IN UV n)
int is_prime(IN UV n)
( run in 0.588 second using v1.01-cache-2.11-cpan-71847e10f99 )