X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fbitio.c;h=133b45e3cc099d224cdaffd34617de398ae62d0e;hb=34de503961eb25613a5b3f2a8e5bdb5d1f5de0e9;hp=dde7b7c6b2df3fbde362f3b8c6653f8482e1fafa;hpb=994d5705f3ab0c9c3bb57dcd9fa8bb2a5398de2c;p=swftools.git diff --git a/lib/bitio.c b/lib/bitio.c index dde7b7c..133b45e 100644 --- a/lib/bitio.c +++ b/lib/bitio.c @@ -5,42 +5,50 @@ Copyright (c) 2001 Matthias Kramm - This file is distributed under the GPL, see file COPYING for details */#include + This file is distributed under the GPL, see file COPYING for details */ +#include #include #include +#include #include -#include -#include "./bitio.h" +#include "../config.h" + +#ifdef HAVE_ZLIB +#include #define ZLIB_BUFFER_SIZE 16384 +#endif +#include "./bitio.h" struct memread_t { unsigned char*data; - int pos; int length; }; struct memwrite_t { unsigned char*data; - int pos; int length; }; struct zlibinflate_t { +#ifdef HAVE_ZLIB z_stream zs; struct reader_t*input; unsigned char readbuffer[ZLIB_BUFFER_SIZE]; +#endif }; struct zlibdeflate_t { +#ifdef HAVE_ZLIB z_stream zs; struct writer_t*output; unsigned char writebuffer[ZLIB_BUFFER_SIZE]; +#endif }; void reader_resetbits(struct reader_t*r) @@ -53,7 +61,9 @@ void reader_resetbits(struct reader_t*r) static int reader_zlibinflate(struct reader_t*reader, void* data, int len); static int reader_fileread(struct reader_t*reader, void* data, int len); static int reader_memread(struct reader_t*reader, void* data, int len); +#ifdef HAVE_ZLIB static void zlib_error(int ret, char* msg, z_stream*zs); +#endif void reader_init_filereader(struct reader_t*r, int handle) { @@ -62,6 +72,7 @@ void reader_init_filereader(struct reader_t*r, int handle) r->type = READER_TYPE_FILE; r->mybyte = 0; r->bitpos = 8; + r->pos = 0; } void reader_init_memreader(struct reader_t*r, void*newdata, int newlength) @@ -74,10 +85,12 @@ void reader_init_memreader(struct reader_t*r, void*newdata, int newlength) r->type = READER_TYPE_MEM; r->mybyte = 0; r->bitpos = 8; + r->pos = 0; } void reader_init_zlibinflate(struct reader_t*r, struct reader_t*input) { +#ifdef HAVE_ZLIB struct zlibinflate_t*z; int ret; memset(r, 0, sizeof(struct reader_t)); @@ -86,6 +99,7 @@ void reader_init_zlibinflate(struct reader_t*r, struct reader_t*input) r->internal = z; r->read = reader_zlibinflate; r->type = READER_TYPE_ZLIB; + r->pos = 0; z->input = input; memset(&z->zs,0,sizeof(z_stream)); z->zs.zalloc = Z_NULL; @@ -94,8 +108,12 @@ void reader_init_zlibinflate(struct reader_t*r, struct reader_t*input) ret = inflateInit(&z->zs); if (ret != Z_OK) zlib_error(ret, "bitio:inflate_init", &z->zs); reader_resetbits(r); +#else + fprintf(stderr, "Error: swftools was compiled without zlib support"); +#endif } +#ifdef HAVE_ZLIB static void zlib_error(int ret, char* msg, z_stream*zs) { fprintf(stderr, "%s: zlib error (%d): last zlib error: %s\n", @@ -105,29 +123,34 @@ static void zlib_error(int ret, char* msg, z_stream*zs) perror("errno:"); exit(1); } +#endif static int reader_fileread(struct reader_t*reader, void* data, int len) { - return read((int)reader->internal, data, len); + int ret = read((int)reader->internal, data, len); + if(ret>=0) + reader->pos += ret; + return ret; } static int reader_memread(struct reader_t*reader, void* data, int len) { struct memread_t*mr = (struct memread_t*)reader->internal; - if(mr->length - mr->pos > len) { - memcpy(data, &mr->data[mr->pos], len); - mr->pos += len; + if(mr->length - reader->pos > len) { + memcpy(data, &mr->data[reader->pos], len); + reader->pos += len; return len; } else { - memcpy(data, &mr->data[mr->pos], mr->length - mr->pos); - mr->pos = mr->length; - return mr->length - mr->pos; + memcpy(data, &mr->data[reader->pos], mr->length - reader->pos); + reader->pos = mr->length; + return mr->length - reader->pos; } } static int reader_zlibinflate(struct reader_t*reader, void* data, int len) { +#ifdef HAVE_ZLIB struct zlibinflate_t*z = (struct zlibinflate_t*)reader->internal; int ret; if(!z) @@ -155,13 +178,19 @@ static int reader_zlibinflate(struct reader_t*reader, void* data, int len) if (ret != Z_OK) zlib_error(ret, "bitio:inflate_end", &z->zs); free(reader->internal); reader->internal = 0; + reader->pos += pos; return pos; } if(!z->zs.avail_out) { break; } } + reader->pos += len; return len; +#else + fprintf(stderr, "Error: swftools was compiled without zlib support"); + exit(1); +#endif } unsigned int reader_readbit(struct reader_t*r) { @@ -200,14 +229,14 @@ 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 - mw->pos > len) { - memcpy(&mw->data[mw->pos], data, len); - mw->pos += len; + if(mw->length - w->pos > len) { + memcpy(&mw->data[w->pos], data, len); + w->pos += len; return len; } else { - memcpy(&mw->data[mw->pos], data, mw->length - mw->pos); - mw->pos = mw->length; - return mw->length - mw->pos; + 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) @@ -231,6 +260,7 @@ void writer_init_filewriter(struct writer_t*w, int 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) { @@ -245,10 +275,12 @@ void writer_init_memwriter(struct writer_t*w, void*data, int len) 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) { +#ifdef HAVE_ZLIB struct zlibdeflate_t*z; int ret; memset(w, 0, sizeof(struct writer_t)); @@ -258,6 +290,7 @@ void writer_init_zlibdeflate(struct writer_t*w, struct writer_t*output) w->write = writer_zlibdeflate_write; w->finish = writer_zlibdeflate_finish; w->type = WRITER_TYPE_ZLIB; + w->pos = 0; z->output = output; memset(&z->zs,0,sizeof(z_stream)); z->zs.zalloc = Z_NULL; @@ -269,9 +302,14 @@ void writer_init_zlibdeflate(struct writer_t*w, struct writer_t*output) w->mybyte = 0; z->zs.next_out = z->writebuffer; z->zs.avail_out = ZLIB_BUFFER_SIZE; +#else + fprintf(stderr, "Error: swftools was compiled without zlib support"); + exit(1); +#endif } static int writer_zlibdeflate_write(struct writer_t*writer, void* data, int len) { +#ifdef HAVE_ZLIB struct zlibdeflate_t*z = (struct zlibdeflate_t*)writer->internal; int ret; if(!z) @@ -295,10 +333,16 @@ static int writer_zlibdeflate_write(struct writer_t*writer, void* data, int len) break; } } + writer->pos += len; return len; +#else + fprintf(stderr, "Error: swftools was compiled without zlib support"); + exit(1); +#endif } static void writer_zlibdeflate_finish(struct writer_t*writer) { +#ifdef HAVE_ZLIB struct zlibdeflate_t*z = (struct zlibdeflate_t*)writer->internal; struct writer_t*output; int ret; @@ -326,6 +370,10 @@ static void writer_zlibdeflate_finish(struct writer_t*writer) free(writer->internal); writer->internal = 0; output->finish(output); +#else + fprintf(stderr, "Error: swftools was compiled without zlib support"); + exit(1); +#endif } void writer_writebit(struct writer_t*w, int bit)