#include <string.h>
#include <stdlib.h>
+#ifndef MONO_API
+#define MONO_API
+#endif
+
#ifndef TRUE
#define FALSE 0
#define TRUE 1
};
typedef struct _ZStream ZStream;
-ZStream *CreateZStream (gint compress, guchar gzip, read_write_func func, void *gchandle);
-gint CloseZStream (ZStream *zstream);
-gint Flush (ZStream *stream);
-gint ReadZStream (ZStream *stream, guchar *buffer, gint length);
-gint WriteZStream (ZStream *stream, guchar *buffer, gint length);
+MONO_API ZStream *CreateZStream (gint compress, guchar gzip, read_write_func func, void *gchandle);
+MONO_API gint CloseZStream (ZStream *zstream);
+MONO_API gint Flush (ZStream *stream);
+MONO_API gint ReadZStream (ZStream *stream, guchar *buffer, gint length);
+MONO_API gint WriteZStream (ZStream *stream, guchar *buffer, gint length);
static gint flush_internal (ZStream *stream, gboolean is_final);
static void *
while (zs->avail_out > 0) {
if (zs->avail_in == 0) {
n = stream->func (stream->buffer, BUFFER_SIZE, stream->gchandle);
+ n = n < 0 ? 0 : n;
stream->total_in += n;
- if (n <= 0) {
- stream->eof = TRUE;
- }
zs->next_in = stream->buffer;
- zs->avail_in = n < 0 ? 0 : n;
+ zs->avail_in = n;
}
- if (zs->avail_in == 0 && (zs->total_in == 0 || stream->total_in == zs->total_in))
- return Z_STREAM_END;
+ if (zs->avail_in == 0 && zs->total_in == 0)
+ return 0;
status = inflate (stream->stream, Z_SYNC_FLUSH);
if (status == Z_STREAM_END) {
stream->eof = TRUE;
break;
+ } else if (status == Z_BUF_ERROR && stream->total_in == zs->total_in) {
+ stream->eof = TRUE;
+ break;
} else if (status != Z_OK) {
return status;
}