X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fbitio.c;h=b84ebe86c3a48dbd4e4aa9c44fc87ee55118f779;hp=bd549359daac3a1bec7914cbaef29db1f4f25c2e;hb=879d0eec420fe0fd5ddcd56c8fe62b82a6744edd;hpb=2b7d856ec993650ff4f685ba35c352d92f013122 diff --git a/lib/bitio.c b/lib/bitio.c index bd54935..b84ebe8 100644 --- a/lib/bitio.c +++ b/lib/bitio.c @@ -28,7 +28,9 @@ #endif #include #include +#define __USE_LARGEFILE64 #include +#include #include "../config.h" @@ -49,9 +51,14 @@ static void reader_nullread_dealloc(reader_t*r) { memset(r, 0, sizeof(reader_t)); } +static int reader_nullseek(reader_t*r, int pos) +{ + return pos; +} void reader_init_nullreader(reader_t*r) { r->read = reader_nullread; + r->seek = reader_nullseek; r->dealloc = reader_nullread_dealloc; r->internal = 0; r->type = READER_TYPE_NULL; @@ -68,15 +75,43 @@ static int reader_fileread(reader_t*reader, void* data, int len) reader->pos += ret; return ret; } +static void reader_fileread_dealloc(reader_t*r) +{ + if(r->type == READER_TYPE_FILE2) { + close((ptroff_t)r->internal); + } + memset(r, 0, sizeof(reader_t)); +} +static int reader_fileread_seek(reader_t*r, int pos) +{ + return lseek((ptroff_t)r->internal, pos, SEEK_SET); +} void reader_init_filereader(reader_t*r, int handle) { r->read = reader_fileread; + r->seek = reader_fileread_seek; + r->dealloc = reader_fileread_dealloc; r->internal = (void*)handle; r->type = READER_TYPE_FILE; r->mybyte = 0; r->bitpos = 8; r->pos = 0; } +void reader_init_filereader2(reader_t*r, const char*filename) +{ +#ifdef HAVE_OPEN64 + int fi = open64 +#else + int fi = open +#endif + (filename, +#ifdef O_BINARY + O_BINARY| +#endif + O_RDONLY); + reader_init_filereader(r, fi); + r->type = READER_TYPE_FILE2; +} /* ---------------------------- mem reader ------------------------------- */ @@ -93,10 +128,21 @@ static int reader_memread(reader_t*reader, void* data, int len) if(mr->length - reader->pos < len) { len = mr->length - reader->pos; } + if(!len) return 0; memcpy(data, &mr->data[reader->pos], len); reader->pos += len; return len; } +static int reader_memseek(reader_t*reader, int pos) +{ + memread_t*mr = (memread_t*)reader->internal; + if(pos>=0 && pos<=mr->length) { + reader->pos = pos; + return pos; + } else { + return -1; + } +} static void reader_memread_dealloc(reader_t*reader) { if(reader->internal) @@ -109,6 +155,7 @@ void reader_init_memreader(reader_t*r, void*newdata, int newlength) mr->data = (unsigned char*)newdata; mr->length = newlength; r->read = reader_memread; + r->seek = reader_memseek; r->dealloc = reader_memread_dealloc; r->internal = (void*)mr; r->type = READER_TYPE_MEM; @@ -117,6 +164,33 @@ void reader_init_memreader(reader_t*r, void*newdata, int newlength) r->pos = 0; } +/* ---------------------------- zzip reader ------------------------------ */ +#ifdef HAVE_ZZIP +static int reader_zzip_read(reader_t*reader, void* data, int len) +{ + return zzip_file_read((ZZIP_FILE*)reader->internal, data, len); +} +static void reader_zzip_dealloc(reader_t*reader) +{ + memset(reader, 0, sizeof(reader_t)); +} +static int reader_zzip_seek(reader_t*reader, int pos) +{ + return zzip_seek((ZZIP_FILE*)reader->internal, pos, SEEK_SET); +} +void reader_init_zzipreader(reader_t*r,ZZIP_FILE*z) +{ + r->read = reader_zzip_read; + r->seek = reader_zzip_seek; + r->dealloc = reader_zzip_dealloc; + r->internal = z; + r->type = READER_TYPE_ZZIP; + r->mybyte = 0; + r->bitpos = 8; + r->pos = 0; +} +#endif + /* ---------------------------- mem writer ------------------------------- */ typedef struct _memwrite @@ -288,7 +362,12 @@ void writer_init_filewriter(writer_t*w, int handle) } void writer_init_filewriter2(writer_t*w, char*filename) { - int fi = open("movie.swf", +#ifdef HAVE_OPEN64 + int fi = open64 +#else + int fi = open +#endif + (filename, #ifdef O_BINARY O_BINARY| #endif @@ -338,7 +417,7 @@ static void zlib_error(int ret, char* msg, z_stream*zs) msg, ret, zs->msg?zs->msg:"unknown"); - perror("errno:"); + if(errno) perror("errno:"); exit(1); } #endif @@ -390,6 +469,11 @@ static int reader_zlibinflate(reader_t*reader, void* data, int len) exit(1); #endif } +static int reader_zlibseek(reader_t*reader, int pos) +{ + fprintf(stderr, "Erro: seeking not supported for zlib streams"); + return -1; +} static void reader_zlibinflate_dealloc(reader_t*reader) { #ifdef HAVE_ZLIB @@ -411,6 +495,7 @@ void reader_init_zlibinflate(reader_t*r, reader_t*input) memset(r, 0, sizeof(reader_t)); r->internal = z; r->read = reader_zlibinflate; + r->seek = reader_zlibseek; r->dealloc = reader_zlibinflate_dealloc; r->type = READER_TYPE_ZLIB; r->pos = 0; @@ -676,6 +761,7 @@ U32 reader_readU32(reader_t*r) fprintf(stderr, "bitio.c:reader_readU32: Read over end of memory region\n"); return b1|b2<<8|b3<<16|b4<<24; } + float reader_readFloat(reader_t*r) { float f;