+
+#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",
+ msg,
+ ret,
+ zs->msg?zs->msg:"unknown");
+ perror("errno:");
+ exit(1);
+}
+#endif
+
+static int reader_fileread(struct reader_t*reader, void* data, int 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 - reader->pos > len) {
+ memcpy(data, &mr->data[reader->pos], len);
+ reader->pos += len;
+ return len;
+ } else {
+ memcpy(data, &mr->data[reader->pos], mr->length - reader->pos);
+ reader->pos = mr->length;
+ return mr->length - reader->pos;
+ }
+}
+