all entry points from zip.c splitted
--HG--
branch : HEAD
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 7fc379f..b9bee68 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -5,6 +5,8 @@
libzip_a_SOURCES=zip_open.c zip_close.c zip_err_str.c zip_name_locate.c \
zip_fopen.c zip_fopen_index.c zip_fclose.c zip_fread.c \
zip_add.c zip_repalce.c zip_add_zip.c zip_replace_zip.c \
+ zip_add_data.c zip_replace_data.c zip_add_file.c zip_replace_file.c \
+ zip_delete.c zip_unchange.c \
zf_new_free.c
BUILT_SOURCES=zip_err_str.c
diff --git a/lib/zip.h b/lib/zip.h
index 9900bcc..c2c89db 100644
--- a/lib/zip.h
+++ b/lib/zip.h
@@ -118,20 +118,26 @@
/* high level routines to modify zip file */
-int zip_unchange(struct zip *zf, int idx);
int zip_rename(struct zip *zf, int idx, char *name);
-int zip_add_file(struct zip *zf, char *name, FILE *file, int start, int len);
-int zip_add_data(struct zip *zf, char *name, char *buf, int start, int len);
-int zip_add_zip(struct zip *zf, char *name, struct zip *srczf, int srcidx,
- int start, int len);
-int zip_replace_file(struct zip *zf, int idx, char *name, FILE *file,
- int start, int len);
-int zip_replace_data(struct zip *zf, int idx, char *name, char *buf,
- int start, int len);
-int zip_replace_zip(struct zip *zf, int idx, char *name,
- struct zip *srczf, int srcidx, int start, int len);
-
int zip_delete(struct zip *zf, int idx);
+int zip_add_data(struct zip *zf, char *name, struct zip_meta *meta,
+ char *data, int len, int freep);
+int zip_replace_data(struct zip *zf, int idx, char *name,
+ struct zip_meta *meta,
+ char *data, int len, int freep);
+int zip_add_file(struct zip *zf, char *name, struct zip_meta *meta,
+ FILE *file, int start, int len);
+int zip_replace_file(struct zip *zf, int idx, char *name,
+ struct zip_meta *meta,
+ FILE *file, int start, int len);
+int zip_add_zip(struct zip *zf, char *name, struct zip_meta *meta,
+ struct zip *srczf, int srcidx, int start, int len);
+int zip_replace_zip(struct zip *zf, int idx, char *name,
+ struct zip_meta *meta,
+ struct zip *srczf, int srcidx, int start, int len)
+
+int zip_unchange(struct zip *zf, int idx);
+
#endif /* _HAD_ZIP_H */
diff --git a/lib/zip_add.c b/lib/zip_add.c
index 1e3fc65..a3ec59b 100644
--- a/lib/zip_add.c
+++ b/lib/zip_add.c
@@ -4,9 +4,8 @@
int
-zip_add(struct zip *zf, char *name, zip_read_func *fn, void *state, int comp)
+zip_add(struct zip *zf, char *name, struct zip_meta *meta,
+ zip_read_func *fn, void *state, int comp)
{
- _zip_new_entry(zf);
-
- return zip_replace(zf, zf->nentry-1, name, fn, state, comp);
+ return zip_replace(zf, -1, name, meta, fn, state, comp);
}
diff --git a/lib/zip_add_data.c b/lib/zip_add_data.c
new file mode 100644
index 0000000..50715bb
--- /dev/null
+++ b/lib/zip_add_data.c
@@ -0,0 +1,11 @@
+#include "zip.h"
+#include "zipint.h"
+
+
+
+int
+zip_add_data(struct zip *zf, char *name, struct zip_meta *meta,
+ char *data, int len, int freep)
+{
+ return zip_replace_data(zf, -1, name, meta, data, len, freep);
+}
diff --git a/lib/zip_add_file.c b/lib/zip_add_file.c
new file mode 100644
index 0000000..bc7490a
--- /dev/null
+++ b/lib/zip_add_file.c
@@ -0,0 +1,11 @@
+#include "zip.h"
+#include "zipint.h"
+
+
+
+int
+zip_add_file(struct zip *zf, char *name, struct zip_meta *meta,
+ FILE *file, int start, int len)
+{
+ return zip_replace_file(zf, -1, name, meta, file, start, len);
+}
diff --git a/lib/zip_add_zip.c b/lib/zip_add_zip.c
index 063a19b..772c913 100644
--- a/lib/zip_add_zip.c
+++ b/lib/zip_add_zip.c
@@ -4,8 +4,8 @@
int
-zip_add_zip(struct zip *zf, char *name,
+zip_add_zip(struct zip *zf, char *name, struct zip_meta *meta,
struct zip *srczf, int srcidx, int start, int len)
{
- return zip_replace_zip(zf, -1, name, srczf, srcidx, start, len);
+ return zip_replace_zip(zf, -1, name, meta, srczf, srcidx, start, len);
}
diff --git a/lib/zip_delete.c b/lib/zip_delete.c
new file mode 100644
index 0000000..332fe1e
--- /dev/null
+++ b/lib/zip_delete.c
@@ -0,0 +1,23 @@
+#include "zip.h"
+#include "zipint.h"
+
+
+
+int
+zip_delete(struct zip *zf, int idx)
+{
+ if (idx >= zf->nentry || idx < 0) {
+ zip_err = ZIP_NOENT;
+ return -1;
+ }
+
+ if (_zip_unchange_data(zf, idx) != 0)
+ return -1;
+
+ zf->changes = 1;
+ zf->entry[idx].state = Z_DELETED;
+
+ return 0;
+}
+
+
diff --git a/lib/zip_rename.c b/lib/zip_rename.c
new file mode 100644
index 0000000..f094003
--- /dev/null
+++ b/lib/zip_rename.c
@@ -0,0 +1,22 @@
+#include "zip.h"
+#include "zipint.h"
+
+
+
+int
+zip_rename(struct zip *zf, int idx, char *name)
+{
+ if (idx >= zf->nentry || idx < 0) {
+ zip_err = ZIP_NOENT;
+ return -1;
+ }
+
+ if (zf->entry[idx].state == Z_UNCHANGED)
+ zf->entry[idx].state = Z_RENAMED;
+
+ zf->changes = 1;
+
+ _zip_set_name(zf, idx, name);
+
+ return 0;
+}
diff --git a/lib/zip_replace.c b/lib/zip_replace.c
index 9adf5b7..84d9523 100644
--- a/lib/zip_replace.c
+++ b/lib/zip_replace.c
@@ -4,11 +4,15 @@
int
-zip_replace(struct zip *zf, int idx, char *name,
+zip_replace(struct zip *zf, int idx, char *name, struct zip_meta *meta,
zip_read_func *fn, void *state, int comp)
{
- if (idx == -1)
- zip_add(zf, name, fn, state, comp);
+ if (idx == -1) {
+ if (_zip_new_entry(zf) == NULL)
+ return -1;
+
+ idx = zf->nentry - 1;
+ }
if (idx < 0 || idx >= zf->nentry) {
zip_err = ZERR_NOENT;
@@ -23,7 +27,7 @@
zf->changes = 1;
zf->entry[idx].state = Z_REPLACED;
-
+ zf->entry[idx].ch_meta = meta;
zf->entry[idx].ch_func = fn;
zf->entry[idx].ch_data = state;
zf->entry[idx].ch_comp = comp;
diff --git a/lib/zip_replace_data.c b/lib/zip_replace_data.c
new file mode 100644
index 0000000..994e4cc
--- /dev/null
+++ b/lib/zip_replace_data.c
@@ -0,0 +1,75 @@
+#include <stdlib.h>
+
+#include "zip.h"
+#include "zipint.h"
+
+struct read_data {
+ char *buf, *data;
+ int size;
+ int freep;
+};
+
+static zip_read_func read_data;
+
+
+
+int
+zip_replace_data(struct zf *zf, int idx, char *name, struct zip_meta *meta,
+ char *data, int len, int freep)
+{
+ struct read_data *f;
+
+ if (srcidx < -1 || srcidx >= srczf->nentry) {
+ zip_err = ZERR_NOENT;
+ return -1;
+ }
+
+ if ((f=(struct read_data *)malloc(sizeof(struct read_data))) == NULL) {
+ zip_err = ZERR_MEMORY;
+ return -1;
+ }
+
+ f->data = data;
+ f->len = len;
+ f->freep = freep;
+
+ return zip_replace(zf, idx, name, meta, read_data, f, 0);
+}
+
+
+
+static int
+read_data(void *state, void *data, int len, enum zip_cmd cmd)
+{
+ struct read_data *z;
+ char *buf;
+ int n;
+
+ z = (struct read_file *)state;
+ buf = (char *)data;
+
+ switch (cmd) {
+ case ZIP_CMD_INIT:
+ z->buf = z->data;
+ return 0;
+
+ case ZIP_CMD_READ:
+ n = len > z->len ? z->len : len;
+
+ memcpy(buf, z->buf, n);
+ z->buf += n;
+ z->len -= n;
+
+ return n;
+
+ case ZIP_CMD_META:
+ return 0;
+
+ case ZIP_CMD_CLOSE:
+ if (z->freep) {
+ free(z->data);
+ z->data = NULL;
+ }
+ return 0;
+ }
+}
diff --git a/lib/zip_replace_file.c b/lib/zip_replace_file.c
new file mode 100644
index 0000000..a26066e
--- /dev/null
+++ b/lib/zip_replace_file.c
@@ -0,0 +1,82 @@
+#include <stdio.h>
+
+#include "zip.h"
+#include "zipint.h"
+
+struct read_file {
+ FILE *f;
+ int off, size;
+};
+
+static zip_read_func read_file;
+
+
+
+int
+zip_replace_file(struct zip *zf, int idx, char *name, struct zip_meta *meta,
+ FILE *file, int start, int len)
+{
+ struct read_file *f;
+
+ if (srcidx < -1 || srcidx >= srczf->nentry) {
+ zip_err = ZERR_NOENT;
+ return -1;
+ }
+
+ if ((f=(struct read_file *)malloc(sizeof(struct read_file))) == NULL) {
+ zip_err = ZERR_MEMORY;
+ return -1;
+ }
+
+ f->f = file;
+ f->off = start;
+ f->len = len;
+
+ return zip_replace(zf, idx, name, meta, read_file, f, 0);
+}
+
+
+
+static int
+read_file(void *state, void *data, int len, enum zip_cmd cmd)
+{
+ struct read_file *z;
+ char *buf;
+ int i, n;
+
+ z = (struct read_file *)state;
+ buf = (char *)data;
+
+ switch (cmd) {
+ case ZIP_CMD_INIT:
+ if (fseek(f->f, f->off, SEEK_SET) < 0) {
+ zip_err = ZERR_SEEK;
+ return -1;
+ }
+ return 0;
+
+ case ZIP_CMD_READ:
+ if (z->len != -1)
+ n = len > z->len ? z->len : len;
+ else
+ n = len;
+
+ if ((i=fread(z->f, 1, buf, n)) < 0)
+ return -1;
+
+ if (z->len != -1)
+ z->len -= i;
+
+ return i;
+
+ case ZIP_CMD_META:
+ return 0;
+
+ case ZIP_CMD_CLOSE:
+ if (z->f) {
+ fclose(z->f);
+ z->f = NULL;
+ }
+ return 0;
+ }
+}
diff --git a/lib/zip_replace_zip.c b/lib/zip_replace_zip.c
index 9bd4d24..486f6c6 100644
--- a/lib/zip_replace_zip.c
+++ b/lib/zip_replace_zip.c
@@ -21,13 +21,13 @@
int
-zip_replace_zip(struct zip *zf, int idx, char *name,
+zip_replace_zip(struct zip *zf, int idx, char *name, struct zip_meta *meta,
struct zip *srczf, int srcidx, int start, int len)
{
struct read_zip *z;
struct read_part *p;
- if (srcidx < 0 || srcidx >= srczf->nentry) {
+ if (srcidx < -1 || srcidx >= srczf->nentry) {
zip_err = ZERR_NOENT;
return -1;
}
@@ -39,7 +39,7 @@
}
z->zf = srczf;
z->idx = srcidx;
- return zip_replace(zf, idx, name, read_zip, z, 1);
+ return zip_replace(zf, idx, name, meta, read_zip, z, 1);
}
else {
if ((p=(struct read_part *)malloc(sizeof(struct read_part))) == NULL) {
@@ -51,14 +51,14 @@
p->off = start;
p->len = len;
p->zff = NULL;
- return zip_replace(zf, idx, name, read_part, z, 0);
+ return zip_replace(zf, idx, name, meta, read_part, z, 0);
}
}
-static unsigned long
-read_zip(void *state, void *data, int len, enum zip_cmd cmd);
+static int
+read_zip(void *state, void *data, int len, enum zip_cmd cmd)
{
struct read_zip *z;
@@ -84,8 +84,8 @@
-static unsigned long
-read_part(void *state, void *data, int len, enum zip_cmd cmd);
+static int
+read_part(void *state, void *data, int len, enum zip_cmd cmd)
{
struct read_part *z;
char b[8192], *buf;
@@ -123,8 +123,8 @@
return i;
- case ZIP_CMD_CRC:
- return -1;
+ case ZIP_CMD_META:
+ return 0;
case ZIP_CMD_CLOSE:
if (z->zff) {
diff --git a/lib/zip_unchange.c b/lib/zip_unchange.c
new file mode 100644
index 0000000..17e7c70
--- /dev/null
+++ b/lib/zip_unchange.c
@@ -0,0 +1,20 @@
+#include "zip.h"
+
+
+
+int
+zip_unchange(struct zip *zf, int idx)
+{
+ if (idx >= zf->nentry || idx < 0) {
+ zip_err = ZERR_NOENT;
+ return -1;
+ }
+
+ if (zf->entry[idx].fn_old) {
+ free(zf->entry[idx].fn);
+ zf->entry[idx].fn = zf->entry[idx].fn_old;
+ zf->entry[idx].fn_old = NULL;
+ }
+
+ return _zip_unchange_data(zf, idx);
+}
diff --git a/zip.c b/zip.c
index e4e0d01..8c8662e 100644
--- a/zip.c
+++ b/zip.c
@@ -6,181 +6,9 @@
static int zip_unchange_data(struct zf *zf, int idx);
static int zip_set_name(struct zf *zf, int idx, char *name);
-
-
-int
-zip_rename(struct zf *zf, int idx, char *name)
-{
- if (idx >= zf->nentry || idx < 0)
- return -1;
-
- if (zf->entry[idx].state == Z_UNCHANGED)
- zf->entry[idx].state = Z_RENAMED;
- zf->changes = 1;
-
- zip_set_name(zf, idx, name);
-
- return idx;
-}
-
-
-
-int
-zip_add_file(struct zf *zf, char *name, FILE *file,
- int start, int len)
-{
- zip_new_entry(zf);
-
- zf->changes = 1;
- zip_set_name(zf, zf->nentry-1, name ? name : "-");
- zf->entry[zf->nentry-1].ch_data_fp = file;
- zf->entry[zf->nentry-1].ch_data_offset = start;
- zf->entry[zf->nentry-1].ch_data_len = len;
-
- return zf->nentry-1;
-}
-
-
-
-int
-zip_add_data(struct zf *zf, char *name, char *buf,
- int start, int len)
-{
- zip_new_entry(zf);
-
- zf->changes = 1;
- zip_set_name(zf, zf->nentry-1, name ? name : "-");
- zf->entry[zf->nentry-1].ch_data_buf = buf;
- zf->entry[zf->nentry-1].ch_data_offset = start;
- zf->entry[zf->nentry-1].ch_data_len = len;
-
- return zf->nentry-1;
-}
-
-
-
-int
-zip_add_zip(struct zf *zf, char *name, struct zf *srczf, int srcidx,
- int start, int len)
-{
- if (srcidx >= srczf->nentry || srcidx < 0)
- return -1;
-
- zip_new_entry(zf);
-
- zf->changes = 1;
- zip_set_name(zf, zf->nentry-1, name ? name : srczf->entry[srcidx].fn);
- zf->entry[zf->nentry-1].ch_data_zf = srczf;
- zf->entry[zf->nentry-1].ch_data_zf_fileno = srcidx;
- zf->entry[zf->nentry-1].ch_data_offset = start;
- zf->entry[zf->nentry-1].ch_data_len = len;
-
- return zf->nentry-1;
-}
-
-
-
-int
-zip_replace_file(struct zf *zf, int idx, char *name, FILE *file,
- int start, int len)
-{
- if (idx >= zf->nentry || idx < 0)
- return -1;
-
- zip_unchange_data(zf, idx);
-
- zf->changes = 1;
- zf->entry[idx].state = Z_REPLACED;
- zip_set_name(zf, idx, name);
-
- zf->entry[idx].ch_data_fp = file;
- zf->entry[idx].ch_data_offset = start;
- zf->entry[idx].ch_data_len = len;
-
- return idx;
-}
-
-
-
-int
-zip_replace_data(struct zf *zf, int idx, char *name, char *buf,
- int start, int len)
-{
- if (idx >= zf->nentry || idx < 0)
- return -1;
-
- zip_unchange_data(zf, idx);
-
- zf->changes = 1;
- zf->entry[idx].state = Z_REPLACED;
- zip_set_name(zf, idx, name);
-
- zf->entry[idx].ch_data_buf = buf;
- zf->entry[idx].ch_data_offset = start;
- zf->entry[idx].ch_data_len = len;
-
- return idx;
-}
-
-
-
-int
-zip_replace_zip(struct zf *zf, int idx, char *name, struct zf *srczf,
- int srcidx, int start, int len)
-{
- if (idx >= zf->nentry || idx < 0)
- return -1;
-
- if (srcidx >= srczf->nentry || srcidx < 0)
- return -1;
-
- zip_unchange_data(zf, idx);
-
- zf->changes = 1;
- zf->entry[idx].state = Z_REPLACED;
- zip_set_name(zf, idx, name);
-
- zf->entry[idx].ch_data_zf = srczf;
- zf->entry[idx].ch_data_zf_fileno = srcidx;
- zf->entry[idx].ch_data_offset = start;
- zf->entry[idx].ch_data_len = len;
-
- return idx;
-}
-
-
-
-int
-zip_delete(struct zf *zf, int idx)
-{
- if (idx >= zf->nentry || idx < 0)
- return -1;
-
- zip_unchange(zf, idx);
-
- zf->changes = 1;
- zf->entry[idx].state = Z_DELETED;
-
- return idx;
-}
-
-
-
-int
-zip_unchange(struct zf *zf, int idx)
-{
- if (idx >= zf->nentry || idx < 0)
- return -1;
-
- if (zf->entry[idx].fn_old) {
- free(zf->entry[idx].fn);
- zf->entry[idx].fn = zf->entry[idx].fn_old;
- zf->entry[idx].fn_old = NULL;
- zf->entry[idx].fnlen = strlen(zf->entry[idx].fn);
- }
-
- return zip_unchange_data(zf, idx);
-}
+/* XXX: place in internal header file. */
+void zip_new_entry(struct zf *zf);
+void zip_entry_init(struct zf *zf, int idx);
@@ -211,23 +39,6 @@
-static int
-zip_set_name(struct zf *zf, int idx, char *name)
-{
- if (idx >= zf->nentry || idx < 0)
- return -1;
-
- if (name != NULL) {
- if (zf->entry[idx].fn_old == NULL)
- zf->entry[idx].fn_old = zf->entry[idx].fn;
- else
- free(zf->entry[idx].fn);
- zf->entry[idx].fn = xstrdup(name);
- zf->entry[idx].fnlen = strlen(name);
- }
-
- return idx;
-}
diff --git a/zip_err_str.c b/zip_err_str.c
new file mode 100644
index 0000000..bbed5f7
--- /dev/null
+++ b/zip_err_str.c
@@ -0,0 +1,22 @@
+/* This file was autogenerated by ./make_zip_err_str.sh from ./zip.h
+ -- don't change here */
+#include "zip.h"
+char *zip_err_str[] = {
+ "no error",
+ "multi-disk zip-files not supported",
+ "replacing zipfile with tempfile failed",
+ "closing zipfile failed",
+ "seek error",
+ "read error",
+ "write error",
+ "CRC error",
+ "containing zip file closed",
+ "no such file",
+ "file already exists",
+ "can't open file",
+ "failure to create temporary file",
+ "zlib error",
+ "malloc failure",
+ "entry has been changed",
+ "compression method not supported",
+};