more horizontal refactoring
[swftools.git] / lib / bitio.c
index c8f1d7d..b84ebe8 100644 (file)
@@ -28,7 +28,9 @@
 #endif
 #include <string.h>
 #include <memory.h>
+#define __USE_LARGEFILE64
 #include <fcntl.h>
+#include <errno.h>
 
 #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;
@@ -70,11 +77,19 @@ static int reader_fileread(reader_t*reader, void* data, int len)
 }
 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;
@@ -82,6 +97,21 @@ void reader_init_filereader(reader_t*r, int handle)
     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 ------------------------------- */
 
@@ -98,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)
@@ -114,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;
@@ -122,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
@@ -293,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
@@ -343,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
@@ -395,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
@@ -416,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;
@@ -681,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;