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);
25 static int reader_fileread(struct reader_t*reader, void* data, int len)
27 return read((int)reader->internal, data, len);
29 static void reader_resetbits(struct reader_t*r)
34 static void reader_init_filereader(struct reader_t*r, int handle)
36 r->read = reader_fileread;
37 r->internal = (void*)handle;
38 r->type = READER_TYPE_FILE;
42 #define ZLIB_BUFFER_SIZE 16384
46 struct reader_t*input;
47 U8 readbuffer[ZLIB_BUFFER_SIZE];
49 static void zlib_error(int ret, char* msg, z_stream*zs)
51 fprintf(stderr, "%s: zlib error (%d): last zlib error: %s\n",
54 zs->msg?zs->msg:"unknown");
58 static int reader_zlibinflate(struct reader_t*reader, void* data, int len);
59 static void reader_init_zlibinflate(struct reader_t*r, struct reader_t*input)
61 struct zlibinflate_t*z;
63 z = (struct zlibinflate_t*)malloc(sizeof(struct zlibinflate_t));
65 r->read = reader_zlibinflate;
66 r->type = READER_TYPE_ZLIB;
68 memset(&z->zs,0,sizeof(z_stream));
69 z->zs.zalloc = Z_NULL;
71 z->zs.opaque = Z_NULL;
72 ret = inflateInit(&z->zs);
73 if (ret != Z_OK) zlib_error(ret, "bitio:inflate_init", &z->zs);
76 static int reader_zlibinflate(struct reader_t*reader, void* data, int len)
78 struct zlibinflate_t*z = (struct zlibinflate_t*)reader->internal;
83 z->zs.next_out = data;
84 z->zs.avail_out = len;
88 z->zs.avail_in = z->input->read(z->input, z->readbuffer, ZLIB_BUFFER_SIZE);
89 z->zs.next_in = z->readbuffer;
92 ret = inflate(&z->zs, Z_NO_FLUSH);
94 ret = inflate(&z->zs, Z_FINISH);
97 ret != Z_STREAM_END) zlib_error(ret, "bitio:inflate_inflate", &z->zs);
99 if (ret == Z_STREAM_END) {
100 int pos = z->zs.next_out - (Bytef*)data;
101 ret = inflateEnd(&z->zs);
102 if (ret != Z_OK) zlib_error(ret, "bitio:inflate_end", &z->zs);
103 free(reader->internal);
104 reader->internal = 0;
107 if(!z->zs.avail_out) {
113 static unsigned int reader_readbit(struct reader_t*r)
118 r->read(r, &r->mybyte, 1);
120 return (r->mybyte>>(7-r->bitpos++))&1;
122 static unsigned int reader_readbits(struct reader_t*r, int num)
129 val|=reader_readbit(r);
133 static int writer_filewrite_write(struct writer_t*w, void* data, int len)
135 return write((int)w->internal, data, len);
137 static void writer_filewrite_finish()
140 static void writer_resetbits(struct writer_t*w)
143 w->write(w, &w->mybyte, 1);
147 static void writer_init_filewriter(struct writer_t*w, int handle)
149 w->write = writer_filewrite_write;
150 w->finish = writer_filewrite_finish;
151 w->internal = (void*)handle;
152 w->type = WRITER_TYPE_FILE;
159 struct writer_t*output;
160 U8 writebuffer[ZLIB_BUFFER_SIZE];
162 static int writer_zlibdeflate_write(struct writer_t*writer, void* data, int len);
163 static void writer_zlibdeflate_finish();
164 static void writer_init_zlibdeflate(struct writer_t*w, struct writer_t*output)
166 struct zlibdeflate_t*z;
168 z = (struct zlibdeflate_t*)malloc(sizeof(struct zlibdeflate_t));
170 w->write = writer_zlibdeflate_write;
171 w->finish = writer_zlibdeflate_finish;
172 w->type = WRITER_TYPE_ZLIB;
174 memset(&z->zs,0,sizeof(z_stream));
175 z->zs.zalloc = Z_NULL;
176 z->zs.zfree = Z_NULL;
177 z->zs.opaque = Z_NULL;
178 ret = deflateInit(&z->zs, 9);
179 if (ret != Z_OK) zlib_error(ret, "bitio:deflate_init", &z->zs);
182 z->zs.next_out = z->writebuffer;
183 z->zs.avail_out = ZLIB_BUFFER_SIZE;
185 static int writer_zlibdeflate_write(struct writer_t*writer, void* data, int len)
187 struct zlibdeflate_t*z = (struct zlibdeflate_t*)writer->internal;
192 z->zs.next_in = data;
193 z->zs.avail_in = len;
196 ret = deflate(&z->zs, Z_NO_FLUSH);
198 if (ret != Z_OK) zlib_error(ret, "bitio:deflate_deflate", &z->zs);
200 if(z->zs.next_out != z->writebuffer) {
201 z->output->write(z->output, z->writebuffer, z->zs.next_out - (Bytef*)z->writebuffer);
202 z->zs.next_out = z->writebuffer;
203 z->zs.avail_out = ZLIB_BUFFER_SIZE;
206 if(!z->zs.avail_in) {
212 static void writer_zlibdeflate_finish(struct writer_t*writer)
214 struct zlibdeflate_t*z = (struct zlibdeflate_t*)writer->internal;
219 ret = deflate(&z->zs, Z_FINISH);
221 ret != Z_STREAM_END) zlib_error(ret, "bitio:deflate_deflate", &z->zs);
223 if(z->zs.next_out != z->writebuffer) {
224 z->output->write(z->output, z->writebuffer, z->zs.next_out - (Bytef*)z->writebuffer);
225 z->zs.next_out = z->writebuffer;
226 z->zs.avail_out = ZLIB_BUFFER_SIZE;
229 if (ret == Z_STREAM_END) {
234 ret = deflateEnd(&z->zs);
235 if (ret != Z_OK) zlib_error(ret, "bitio:deflate_end", &z->zs);
236 free(writer->internal);
237 writer->internal = 0;
240 static void writer_writebit(struct writer_t*w, int bit)
244 w->write(w, &w->mybyte, 1);
249 w->mybyte |= 1 << (7 - w->bitpos);
252 static void writer_writebits(struct writer_t*w, U32 data, int bits)
257 writer_writebit(w, (data >> (bits-t-1))&1);