added forgotten files
--HG--
branch : HEAD
diff --git a/lib/zip_fclose.c b/lib/zip_fclose.c
new file mode 100644
index 0000000..2bddffd
--- /dev/null
+++ b/lib/zip_fclose.c
@@ -0,0 +1,31 @@
+#include "zip.h"
+#include "zipint.h"
+
+
+
+int
+zip_fclose(struct zip_file *zff)
+{
+ int i, ret;
+
+ if (zff->zstr)
+ inflateEnd(zff->zstr);
+ free(zff->buffer);
+ free(zff->zstr);
+
+ for (i=0; i<zff->zf->nfile; i++) {
+ if (zff->zf->file[i] == zff) {
+ zff->zf->file[i] = zff->zf->file[zff->zf->nfile-1];
+ zff->zf->nfile--;
+ break;
+ }
+ }
+
+ /* EOF is ok */
+ ret = (zff->flags == -1 ? 0 : zff->flags);
+ if (!ret)
+ ret = (zff->crc_orig == zff->crc);
+
+ free(zff);
+ return ret;
+}
diff --git a/lib/zip_fread.c b/lib/zip_fread.c
new file mode 100644
index 0000000..9837207
--- /dev/null
+++ b/lib/zip_fread.c
@@ -0,0 +1,86 @@
+#include "zip.h"
+#include "zipint.h"
+
+
+
+int
+zip_fread(struct zip_file *zff, char *outbuf, int toread)
+{
+ int len, out_before, ret;
+
+ if (!zff)
+ return -1;
+
+ if (zff->flags != 0)
+ return -1;
+
+ if (toread == 0)
+ return 0;
+
+ if (zff->bytes_left == 0) {
+ zff->flags = -1;
+ if (zff->crc != zff->crc_orig) {
+ zff->flags = ZERR_CRC;
+ return -1;
+ }
+ return 0;
+ }
+
+ if (zff->method == 0) {
+ ret = _zip_file_fillbuf(outbuf, toread, zff);
+ if (ret > 0) {
+ zff->crc = crc32(zff->crc, outbuf, ret);
+ zff->bytes_left -= ret;
+ }
+ return ret;
+ }
+
+ zff->zstr->next_out = outbuf;
+ zff->zstr->avail_out = toread;
+ out_before = zff->zstr->total_out;
+
+ /* endless loop until something has been accomplished */
+ for (;;) {
+ ret = inflate(zff->zstr, Z_SYNC_FLUSH);
+
+ switch (ret) {
+ case Z_OK:
+ case Z_STREAM_END:
+ /* all ok */
+ /* XXX: STREAM_END probably won't happen, since we didn't
+ have a header */
+ len = zff->zstr->total_out - out_before;
+ if (len >= zff->bytes_left || len >= toread) {
+ zff->crc = crc32(zff->crc, outbuf, len);
+ zff->bytes_left -= len;
+ return(len);
+ }
+ break;
+
+ case Z_BUF_ERROR:
+ if (zff->zstr->avail_in == 0) {
+ /* read some more bytes */
+ len = _zip_file_fillbuf(zff->buffer, BUFSIZE, zff);
+ if (len <= 0) {
+ /* XXX: error
+ myerror (ERRSTR, "read error");
+ */
+ return -1;
+ }
+ zff->zstr->next_in = zff->buffer;
+ zff->zstr->avail_in = len;
+ continue;
+ }
+ /* XXX: set error */
+ myerror(ERRFILE, "zlib error: buf_err: %s", zff->zstr->msg);
+ return -1;
+ case Z_NEED_DICT:
+ case Z_DATA_ERROR:
+ case Z_STREAM_ERROR:
+ case Z_MEM_ERROR:
+ /* XXX: set error */
+ myerror(ERRFILE, "zlib error: %s", zff->zstr->msg);
+ return -1;
+ }
+ }
+}