Data-BitStream-XS

 view release on metacpan or  search on metacpan

XS.xs  view on Meta::CPAN

    }

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 )