#include <stdlib.h>
#include "gstgetbits.h"

char *print_bits(unsigned long bits,int size) {
  char *ret = (char *)malloc(size+1);
  int i;
  ret[size] = 0;
  for (i=0;i<size;i++) {
    if (bits & (1<<i))
      ret[(size-1)-i] = '1';
    else
      ret[(size-1)-i] = '0';
  }
  return ret;
}

static unsigned char testbuffer[] = 
{
  0x11, 0x22, 0x44, 0x88, 0xCC, 0xEE,0xFF,0x11
};

void empty(gst_getbits_t *gb, void *data) {
  printf("buffer empty\n");

  gst_getbits_newbuf(gb,(unsigned char *)testbuffer, 7);
}

int main(int argc,char *argv[]) {
  gst_getbits_t gb;
  int i, j;
  int bits;

  gst_getbits_init(&gb, NULL, NULL);
  gst_getbits_newbuf(&gb,(unsigned char *)testbuffer, 7);

  for (i=0;i<7;i++) {
    for (j=0;j<8;j++) {
      printf("%lu",gst_getbits2(&gb));
      gst_backbitsn(&gb, 1);
    }
    printf(" = %01x\n", testbuffer[i]);
  }

  gst_getbits_newbuf(&gb,(unsigned char *)testbuffer, 7);

  bits = gst_getbits8(&gb);
  printf("%08x <-> 00000011 %lu\n",bits, gb.bits);
  bits = gst_getbits8(&gb);
  printf("%08x <-> 00000022 %lu\n",bits, gb.bits);
  bits = gst_getbits8(&gb);
  printf("%08x <-> 00000044 %lu\n",bits, gb.bits);
  bits = gst_getbits8(&gb);
  printf("%08x <-> 00000088 %lu\n",bits, gb.bits);
  bits = gst_getbits6(&gb);
  printf("%08x <-> 00000033 %lu\n",bits, gb.bits);

  gst_backbitsn(&gb, 16);

  bits = gst_getbits10(&gb);
  printf("%08x <-> 00000088 \n",bits);

  gst_getbits_newbuf(&gb,(unsigned char *)testbuffer, 7);

  bits = gst_getbits8(&gb);
  printf("%08x <-> 00000011 \n",bits);
  bits = gst_getbits8(&gb);
  printf("%08x <-> 00000022 \n",bits);
  bits = gst_getbits8(&gb);
  printf("%08x <-> 00000044 \n",bits);

  bits = gst_getbits6(&gb);
  printf("%08x <-> 00000022 \n",bits);

  gst_backbitsn(&gb, 19);

  bits = gst_getbits19(&gb);
  printf("%08x <-> 00009122 \n",bits);

  bits = gst_getbits10(&gb);
  printf("%08x <-> 000000cc \n",bits);

  gst_backbitsn(&gb, 8);

  gst_backbitsn(&gb, 19);

  gst_backbitsn(&gb, 8);

  bits = gst_getbits19(&gb);
  printf("%08x <-> 00012244 \n",bits);
  bits = gst_getbits8(&gb);
  printf("%08x <-> 00000088 \n",bits);

  return 0;
}