+
+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);
+}
+
+static int reader_fileread(struct reader_t*reader, void* data, int len)
+{
+ return read((int)reader->internal, data, len);
+}
+
+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;
+ return len;
+ } else {
+ memcpy(data, &mr->data[mr->pos], mr->length - mr->pos);
+ mr->pos = mr->length;
+ return mr->length - mr->pos;
+ }
+}
+