1 #define READER_TYPE_FILE 0
2 #define READER_TYPE_MEM 1
3 #define READER_TYPE_ZLIB 2
4 #define WRITER_TYPE_FILE 0
5 #define WRITER_TYPE_MEM 1
6 #define WRITER_TYPE_ZLIB 2
10 int (*read)(struct reader_t*, void*data, int len);
18 int (*write)(struct writer_t*, void*data, int len);
24 static int reader_fileread(struct reader_t*reader, void* data, int len)
26 return read((int)reader->internal, data, len);
28 static void reader_resetbits(struct reader_t*r)
33 static void reader_init_filereader(struct reader_t*r, int handle)
35 r->read = reader_fileread;
36 r->internal = (void*)handle;
37 r->type = READER_TYPE_FILE;
40 #define ZLIB_BUFFER_SIZE 16384
44 struct reader_t*input;
45 U8 readbuffer[ZLIB_BUFFER_SIZE];
47 static void zlib_error(int ret, char* msg, z_stream*zs)
49 fprintf(stderr, "%s: zlib error (%d): last zlib error: %s\n",
52 zs->msg?zs->msg:"unknown");
56 static int reader_zlibinflate(struct reader_t*reader, void* data, int len);
57 static void reader_init_zlibinflate(struct reader_t*r, struct reader_t*input)
59 struct zlibinflate_t*z;
61 z = (struct zlibinflate_t*)malloc(sizeof(struct zlibinflate_t));
63 r->read = reader_zlibinflate;
64 r->type = READER_TYPE_ZLIB;
66 memset(&z->zs,0,sizeof(z_stream));
67 z->zs.zalloc = Z_NULL;
69 z->zs.opaque = Z_NULL;
70 ret = inflateInit(&z->zs);
71 if (ret != Z_OK) zlib_error(ret, "bitio:inflate_init", &z->zs);
74 static int reader_zlibinflate(struct reader_t*reader, void* data, int len)
76 struct zlibinflate_t*z = (struct zlibinflate_t*)reader->internal;
81 z->zs.next_out = data;
82 z->zs.avail_out = len;
86 z->zs.avail_in = z->input->read(z->input, z->readbuffer, ZLIB_BUFFER_SIZE);
87 z->zs.next_in = z->readbuffer;
90 ret = inflate(&z->zs, Z_NO_FLUSH);
92 ret = inflate(&z->zs, Z_FINISH);
95 ret != Z_STREAM_END) zlib_error(ret, "bitio:inflate_inflate", &z->zs);
97 if (ret == Z_STREAM_END) {
98 int pos = z->zs.next_out - (Bytef*)data;
99 ret = inflateEnd(&z->zs);
100 if (ret != Z_OK) zlib_error(ret, "bitio:inflate_end", &z->zs);
101 free(reader->internal);
102 reader->internal = 0;
105 if(!z->zs.avail_out) {
111 static unsigned int reader_readbit(struct reader_t*r)
116 r->read(r, &r->mybyte, 1);
118 return (r->mybyte>>(7-r->bitpos++))&1;
120 static unsigned int reader_readbits(struct reader_t*r, int num)
127 val|=reader_readbit(r);
131 static int writer_filewrite(struct writer_t*w, void* data, int len)
133 return write((int)w->internal, data, len);
135 static void writer_resetbits(struct writer_t*w)
138 w->write(w, &w->mybyte, 1);
142 static void writer_init_filewriter(struct writer_t*w, int handle)
144 w->write = writer_filewrite;
145 w->internal = (void*)handle;
146 w->type = WRITER_TYPE_FILE;
150 static void writer_writebit(struct writer_t*w, int bit)
154 w->write(w, &w->mybyte, 1);
159 w->mybyte |= 1 << (7 - w->bitpos);
162 static void writer_writebits(struct writer_t*w, U32 data, int bits)
167 writer_writebit(w, (data >> (bits-t-1))&1);