-unsigned int reader_readbit(struct reader_t*r)
-{
- if(r->bitpos==8)
- {
- r->bitpos=0;
- r->read(r, &r->mybyte, 1);
- }
- return (r->mybyte>>(7-r->bitpos++))&1;
-}
-unsigned int reader_readbits(struct reader_t*r, int num)
-{
- int t;
- int val = 0;
- for(t=0;t<num;t++)
- {
- val<<=1;
- val|=reader_readbit(r);
- }
- return val;
-}
-
-static int writer_zlibdeflate_write(struct writer_t*writer, void* data, int len);
-static void writer_zlibdeflate_finish(struct writer_t*writer);
-static int writer_filewrite_write(struct writer_t*w, void* data, int len);
-static void writer_filewrite_finish(struct writer_t*w);
-
-static int writer_filewrite_write(struct writer_t*w, void* data, int len)
-{
- return write((int)w->internal, data, len);
-}
-static void writer_filewrite_finish(struct writer_t*w)
-{
-}
-
-static int writer_memwrite_write(struct writer_t*w, void* data, int len)
-{
- struct memread_t*mw = (struct memread_t*)w->internal;
- if(mw->length - w->pos > len) {
- memcpy(&mw->data[w->pos], data, len);
- w->pos += len;
- return len;
- } else {
- memcpy(&mw->data[w->pos], data, mw->length - w->pos);
- w->pos = mw->length;
- return mw->length - w->pos;
- }
-}
-static void writer_memwrite_finish(struct writer_t*w)
-{
- free(w->internal);
-}
-
-void writer_resetbits(struct writer_t*w)
-{
- if(w->bitpos)
- w->write(w, &w->mybyte, 1);
- w->bitpos = 0;
- w->mybyte = 0;
-}
-void writer_init_filewriter(struct writer_t*w, int handle)
-{
- memset(w, 0, sizeof(struct writer_t));
- w->write = writer_filewrite_write;
- w->finish = writer_filewrite_finish;
- w->internal = (void*)handle;
- w->type = WRITER_TYPE_FILE;
- w->bitpos = 0;
- w->mybyte = 0;
- w->pos = 0;
-}
-void writer_init_memwriter(struct writer_t*w, void*data, int len)
-{
- struct memwrite_t *mr;
- mr = malloc(sizeof(struct memwrite_t));
- mr->data = data;
- mr->length = len;
- memset(w, 0, sizeof(struct writer_t));
- w->write = writer_memwrite_write;
- w->finish = writer_memwrite_finish;
- w->internal = (void*)mr;
- w->type = WRITER_TYPE_FILE;
- w->bitpos = 0;
- w->mybyte = 0;
- w->pos = 0;
-}
-
-void writer_init_zlibdeflate(struct writer_t*w, struct writer_t*output)