Next step of API cleanup: no size_t, no int as file index.

--HG--
branch : HEAD
diff --git a/lib/make_zipconf.sh b/lib/make_zipconf.sh
index 05bde12..a089308 100644
--- a/lib/make_zipconf.sh
+++ b/lib/make_zipconf.sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 #  make_zipconf.sh: create platform specific include file zipconf.h
-#  Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
+#  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
 #
 #  This file is part of libzip, a library to manipulate ZIP archives.
 #  The authors can be contacted at <libzip@nih.at>
@@ -43,19 +43,26 @@
     outfile="$5"
 
     bits=`expr $bytes '*' 8`
-    type="${short}int${bits}_t"
+    type="${short}int${bits}"
     TYPE=`echo $type | tr a-z A-Z`
-    if grep -q "define HAVE_${TYPE}" "$infile"
+    if grep -q "define HAVE_${TYPE}_T" "$infile"
     then
-	echo "typedef $type zip_$type;" >> "$outfile"
+	echo "typedef ${type}_t zip_${type}_t;" >> "$outfile"
+	LTYPE="$TYPE"
     else
+	SHORT=`echo $short | tr a-z A-Z`
+	if [ -z "$SHORT" ]
+	then
+	    SHORT='S'
+	fi
 	if [ "$bytes" -eq 1 ]
 	then
 	    if [ -z "$long" ]
 	    then
 		long='signed'
 	    fi
-	    echo "typedef $long char $type;" >> $outfile
+	    echo "typedef $long char ${type}_t;" >> $outfile
+	    LTYPE="${SHORT}CHAR"
 	else
 	    ctype=`sed -n "s/.define SIZEOF_\([A-Z_]*\) $bytes/\1/p" "$infile" \
 		| head -1 | tr A-Z_ 'a-z '`
@@ -64,9 +71,22 @@
 		echo "$0: no $bits bit type found" >&2
 		exit 1
 	    fi
-	    echo "typedef $long $ctype $type;" >> $outfile
+	    echo "typedef $long $ctype ${type}_t;" >> "$outfile"
+	    case "$ctype" in
+		short) LTYPE=${SHORT}SHRT;;
+		int) LTYPE=${SHORT}INT;;
+                long) LTYPE=${SHORT}LONG;;
+		"long long") LTYPE=${SHORT}LLONG;;
+            esac
 	fi
     fi
+
+    if [ -z "$long" ]
+    then
+	echo "#define ZIP_${TYPE}_MIN ${LTYPE}_MIN" >> "$outfile"
+    fi
+    echo "#define ZIP_${TYPE}_MAX ${LTYPE}_MAX" >> "$outfile"
+    echo >> "$outfile"
 }
 
 
@@ -99,8 +119,10 @@
 if grep -q 'define HAVE_INTTYPES_H' "$1"
 then
     echo '#include <inttypes.h>' >> "$2.$$"
-    echo >> "$2.$$"
+else
+    echo '#include <limits.h>' >> "$2.$$"
 fi
+echo >> "$2.$$"
 
 for size in 1 2 4 8
 do
diff --git a/lib/zip.h b/lib/zip.h
index 66886e1..26350d9 100644
--- a/lib/zip.h
+++ b/lib/zip.h
@@ -173,7 +173,7 @@
 
 struct zip_stat {
     const char *name;			/* name of the file */
-    int index;				/* index within archive */
+    zip_uint64_t index;			/* index within archive */
     zip_uint32_t crc;			/* crc of file data */
     time_t mtime;			/* modification time */
     zip_uint64_t size;			/* size of file (uncompressed) */
@@ -186,8 +186,8 @@
 struct zip_file;
 struct zip_source;
 
-typedef ssize_t (*zip_source_callback)(void *state, void *data,
-				       size_t len, enum zip_source_cmd cmd);
+typedef zip_int64_t (*zip_source_callback)(void *, void *, zip_uint64_t,
+					   enum zip_source_cmd);
 typedef struct zip_source *(*zip_compression_implementation)(struct zip *,
 						     struct zip_source *,
 						     zip_uint16_t, int);
@@ -198,14 +198,14 @@
 
 
 
-ZIP_EXTERN int zip_add(struct zip *, const char *, struct zip_source *);
-ZIP_EXTERN int zip_add_dir(struct zip *, const char *);
+ZIP_EXTERN zip_int64_t zip_add(struct zip *, const char *, struct zip_source *);
+ZIP_EXTERN zip_int64_t zip_add_dir(struct zip *, const char *);
 ZIP_EXTERN int zip_close(struct zip *);
-ZIP_EXTERN int zip_delete(struct zip *, int);
+ZIP_EXTERN int zip_delete(struct zip *, zip_uint64_t);
 ZIP_EXTERN void zip_error_clear(struct zip *);
 ZIP_EXTERN void zip_error_get(struct zip *, int *, int *);
 ZIP_EXTERN int zip_error_get_sys_type(int);
-ZIP_EXTERN int zip_error_to_str(char *, size_t, int, int);
+ZIP_EXTERN int zip_error_to_str(char *, zip_uint64_t, int, int);
 ZIP_EXTERN int zip_fclose(struct zip_file *);
 ZIP_EXTERN struct zip *zip_fdopen(int, int, int *);
 ZIP_EXTERN void zip_file_error_clear(struct zip_file *);
@@ -214,30 +214,33 @@
 ZIP_EXTERN struct zip_file *zip_fopen(struct zip *, const char *, int);
 ZIP_EXTERN struct zip_file *zip_fopen_encrypted(struct zip *, const char *,
 						int, const char *);
-ZIP_EXTERN struct zip_file *zip_fopen_index(struct zip *, int, int);
-ZIP_EXTERN struct zip_file *zip_fopen_index_encrypted(struct zip *, int, int,
+ZIP_EXTERN struct zip_file *zip_fopen_index(struct zip *, zip_uint64_t, int);
+ZIP_EXTERN struct zip_file *zip_fopen_index_encrypted(struct zip *,
+						      zip_uint64_t, int,
 						      const char *);
-ZIP_EXTERN ssize_t zip_fread(struct zip_file *, void *, size_t);
+ZIP_EXTERN zip_int64_t zip_fread(struct zip_file *, void *, zip_uint64_t);
 ZIP_EXTERN const char *zip_get_archive_comment(struct zip *, int *, int);
 ZIP_EXTERN int zip_get_archive_flag(struct zip *, int, int);
 ZIP_EXTERN zip_compression_implementation zip_get_compression_implementation(
     zip_uint16_t);
 ZIP_EXTERN zip_encryption_implementation zip_get_encryption_implementation(
     zip_uint16_t);
-ZIP_EXTERN const char *zip_get_file_comment(struct zip *, int, int *, int);
-ZIP_EXTERN const char *zip_get_name(struct zip *, int, int);
+ZIP_EXTERN const char *zip_get_file_comment(struct zip *, zip_uint64_t,
+					    int *, int);
+ZIP_EXTERN const char *zip_get_name(struct zip *, zip_uint64_t, int);
 ZIP_EXTERN int zip_get_num_files(struct zip *);
 ZIP_EXTERN int zip_name_locate(struct zip *, const char *, int);
 ZIP_EXTERN struct zip *zip_open(const char *, int, int *);
-ZIP_EXTERN int zip_rename(struct zip *, int, const char *);
-ZIP_EXTERN int zip_replace(struct zip *, int, struct zip_source *);
+ZIP_EXTERN int zip_rename(struct zip *, zip_uint64_t, const char *);
+ZIP_EXTERN int zip_replace(struct zip *, zip_uint64_t, struct zip_source *);
 ZIP_EXTERN int zip_set_archive_comment(struct zip *, const char *, int);
 ZIP_EXTERN int zip_set_archive_flag(struct zip *, int, int);
-ZIP_EXTERN int zip_set_file_comment(struct zip *, int, const char *, int);
+ZIP_EXTERN int zip_set_file_comment(struct zip *, zip_uint64_t,
+				    const char *, int);
 ZIP_EXTERN struct zip_source *zip_source_buffer(struct zip *, const void *,
 						zip_uint64_t, int);
-ZIP_EXTERN ssize_t zip_source_call(struct zip_source *, void *, size_t,
-				   enum zip_source_cmd);
+ZIP_EXTERN zip_int64_t zip_source_call(struct zip_source *, void *,
+				       zip_uint64_t, enum zip_source_cmd);
 ZIP_EXTERN struct zip_source *zip_source_deflate(struct zip *,
 						 struct zip_source *,
 						 zip_uint16_t, int);
@@ -253,12 +256,14 @@
 						zip_uint16_t, int,
 						const char *);
 ZIP_EXTERN struct zip_source *zip_source_zip(struct zip *, struct zip *,
-				     int, int, zip_uint64_t, zip_int64_t);
+					     zip_uint64_t, int,
+					     zip_uint64_t, zip_int64_t);
 ZIP_EXTERN int zip_stat(struct zip *, const char *, int, struct zip_stat *);
-ZIP_EXTERN int zip_stat_index(struct zip *, int, int, struct zip_stat *);
+ZIP_EXTERN int zip_stat_index(struct zip *, zip_uint64_t, int,
+			      struct zip_stat *);
 ZIP_EXTERN void zip_stat_init(struct zip_stat *);
 ZIP_EXTERN const char *zip_strerror(struct zip *);
-ZIP_EXTERN int zip_unchange(struct zip *, int);
+ZIP_EXTERN int zip_unchange(struct zip *, zip_uint64_t);
 ZIP_EXTERN int zip_unchange_all(struct zip *);
 ZIP_EXTERN int zip_unchange_archive(struct zip *);
 
diff --git a/lib/zip_add.c b/lib/zip_add.c
index f6bdb2a..6a310a8 100644
--- a/lib/zip_add.c
+++ b/lib/zip_add.c
@@ -37,7 +37,14 @@
 
 
 
-ZIP_EXTERN int
+/*
+  NOTE: Return type is signed so we can return -1 on error.
+        The index can not be larger than ZIP_INT64_MAX since the size
+        of the central directory cannot be larger than
+        ZIP_UINT64_MAX, and each entry is larger than 2 bytes.
+*/
+
+ZIP_EXTERN zip_int64_t
 zip_add(struct zip *za, const char *name, struct zip_source *source)
 {
     if (name == NULL || source == NULL) {
@@ -45,5 +52,5 @@
 	return -1;
     }
 	
-    return _zip_replace(za, -1, name, source);
+    return _zip_replace(za, ZIP_UINT64_MAX, name, source);
 }
diff --git a/lib/zip_add_dir.c b/lib/zip_add_dir.c
index 39c13ee..28a8ad1 100644
--- a/lib/zip_add_dir.c
+++ b/lib/zip_add_dir.c
@@ -40,10 +40,13 @@
 
 
 
-ZIP_EXTERN int
+/* NOTE: Signed due to -1 on error.  See zip_add.c for more details. */
+
+ZIP_EXTERN zip_int64_t
 zip_add_dir(struct zip *za, const char *name)
 {
-    int len, ret;
+    int len;
+    zip_int64_t ret;
     char *s;
     struct zip_source *source;
 
diff --git a/lib/zip_close.c b/lib/zip_close.c
index baac888..c0a2301 100644
--- a/lib/zip_close.c
+++ b/lib/zip_close.c
@@ -323,7 +323,7 @@
     cb = zs->f;
     ud = zs->ud;
 
-    if (cb(ud, &st, sizeof(st), ZIP_SOURCE_STAT) < (ssize_t)sizeof(st)) {
+    if (cb(ud, &st, sizeof(st), ZIP_SOURCE_STAT) < (zip_int64_t)sizeof(st)) {
 	ch_set_error(&za->error, cb, ud);
 	return -1;
     }
@@ -387,7 +387,7 @@
 	      struct zip_error *error)
 {
     char buf[BUFSIZE];
-    ssize_t n;
+    zip_int64_t n;
 
     st->comp_size = 0;
     while ((n=cb(ud, buf, sizeof(buf), ZIP_SOURCE_READ)) > 0) {
@@ -414,8 +414,8 @@
 {
     char b1[BUFSIZE], b2[BUFSIZE];
     int end, flush, ret;
-    ssize_t n;
-    size_t n2;
+    zip_int64_t n;
+    zip_uint64_t n2;
     z_stream zstr;
     int mem_level;
 
@@ -496,7 +496,7 @@
 {
     int e[2];
 
-    if ((cb(ud, e, sizeof(e), ZIP_SOURCE_ERROR)) < (ssize_t)sizeof(e)) {
+    if ((cb(ud, e, sizeof(e), ZIP_SOURCE_ERROR)) < (zip_int64_t)sizeof(e)) {
 	error->zip_err = ZIP_ER_INTERNAL;
 	error->sys_err = 0;
     }
diff --git a/lib/zip_delete.c b/lib/zip_delete.c
index 382b3fd..8178ebb 100644
--- a/lib/zip_delete.c
+++ b/lib/zip_delete.c
@@ -38,9 +38,9 @@
 
 
 ZIP_EXTERN int
-zip_delete(struct zip *za, int idx)
+zip_delete(struct zip *za, zip_uint64_t idx)
 {
-    if (idx < 0 || idx >= za->nentry) {
+    if (idx >= za->nentry) {
 	_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
 	return -1;
     }
diff --git a/lib/zip_entry_new.c b/lib/zip_entry_new.c
index 7059b1b..a22dd40 100644
--- a/lib/zip_entry_new.c
+++ b/lib/zip_entry_new.c
@@ -1,6 +1,6 @@
 /*
   zip_entry_new.c -- create and init struct zip_entry
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -51,7 +51,7 @@
 	}
     }
     else {
-	if (za->nentry >= za->nentry_alloc-1) {
+	if (za->nentry+1 >= za->nentry_alloc) {
 	    za->nentry_alloc += 16;
 	    za->entry = (struct zip_entry *)realloc(za->entry,
 						    sizeof(struct zip_entry)
diff --git a/lib/zip_error_to_str.c b/lib/zip_error_to_str.c
index bdba41a..11a0cd2 100644
--- a/lib/zip_error_to_str.c
+++ b/lib/zip_error_to_str.c
@@ -1,6 +1,6 @@
 /*
   zip_error_to_str.c -- get string representation of zip error code
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -43,7 +43,7 @@
 
 
 ZIP_EXTERN int
-zip_error_to_str(char *buf, size_t len, int ze, int se)
+zip_error_to_str(char *buf, zip_uint64_t len, int ze, int se)
 {
     const char *zs, *ss;
 
diff --git a/lib/zip_fopen_index.c b/lib/zip_fopen_index.c
index 95be69e..3a58bbe 100644
--- a/lib/zip_fopen_index.c
+++ b/lib/zip_fopen_index.c
@@ -42,7 +42,7 @@
 
 
 ZIP_EXTERN struct zip_file *
-zip_fopen_index(struct zip *za, int fileno, int flags)
+zip_fopen_index(struct zip *za, zip_uint64_t fileno, int flags)
 {
     return zip_fopen_index_encrypted(za, fileno, flags, za->default_password);
 }
diff --git a/lib/zip_fopen_index_encrypted.c b/lib/zip_fopen_index_encrypted.c
index ace0a5d..911370b 100644
--- a/lib/zip_fopen_index_encrypted.c
+++ b/lib/zip_fopen_index_encrypted.c
@@ -44,7 +44,7 @@
 
 
 ZIP_EXTERN struct zip_file *
-zip_fopen_index_encrypted(struct zip *za, int fileno, int flags,
+zip_fopen_index_encrypted(struct zip *za, zip_uint64_t fileno, int flags,
 			  const char *password)
 {
     int zfflags;
@@ -55,7 +55,7 @@
     zip_uint64_t start;
     struct zip_stat st;
 
-    if ((fileno < 0) || (fileno >= za->nentry)) {
+    if (fileno >= za->nentry) {
 	_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
 	return NULL;
     }
diff --git a/lib/zip_fread.c b/lib/zip_fread.c
index 4146b68..ecda5b0 100644
--- a/lib/zip_fread.c
+++ b/lib/zip_fread.c
@@ -1,6 +1,6 @@
 /*
   zip_fread.c -- read from file
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -37,10 +37,10 @@
 
 
 
-ZIP_EXTERN ssize_t
-zip_fread(struct zip_file *zf, void *outbuf, size_t toread)
+ZIP_EXTERN zip_int64_t
+zip_fread(struct zip_file *zf, void *outbuf, zip_uint64_t toread)
 {
-    ssize_t n;
+    zip_int64_t n;
 
     if (!zf)
 	return -1;
@@ -48,6 +48,11 @@
     if (zf->error.zip_err != 0)
 	return -1;
 
+    if (toread > ZIP_INT64_MAX) {
+	_zip_error_set(&zf->error, ZIP_ER_INVAL, 0);
+	return -1;
+    }
+
     if ((zf->flags & ZIP_ZF_EOF) || (toread == 0))
 	return 0;
 
diff --git a/lib/zip_get_file_comment.c b/lib/zip_get_file_comment.c
index adace72..b9dacbe 100644
--- a/lib/zip_get_file_comment.c
+++ b/lib/zip_get_file_comment.c
@@ -38,9 +38,9 @@
 
 
 ZIP_EXTERN const char *
-zip_get_file_comment(struct zip *za, int idx, int *lenp, int flags)
+zip_get_file_comment(struct zip *za, zip_uint64_t idx, int *lenp, int flags)
 {
-    if (idx < 0 || idx >= za->nentry) {
+    if (idx >= za->nentry) {
 	_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
 	return NULL;
     }
diff --git a/lib/zip_get_name.c b/lib/zip_get_name.c
index 8f5050b..531af50 100644
--- a/lib/zip_get_name.c
+++ b/lib/zip_get_name.c
@@ -38,7 +38,7 @@
 
 
 ZIP_EXTERN const char *
-zip_get_name(struct zip *za, int idx, int flags)
+zip_get_name(struct zip *za, zip_uint64_t idx, int flags)
 {
     return _zip_get_name(za, idx, flags, &za->error);
 }
@@ -46,9 +46,10 @@
 
 
 const char *
-_zip_get_name(struct zip *za, int idx, int flags, struct zip_error *error)
+_zip_get_name(struct zip *za, zip_uint64_t idx, int flags,
+	      struct zip_error *error)
 {
-    if (idx < 0 || idx >= za->nentry) {
+    if (idx >= za->nentry) {
 	_zip_error_set(error, ZIP_ER_INVAL, 0);
 	return NULL;
     }
diff --git a/lib/zip_rename.c b/lib/zip_rename.c
index 1609b5c..d78bbe8 100644
--- a/lib/zip_rename.c
+++ b/lib/zip_rename.c
@@ -40,12 +40,12 @@
 
 
 ZIP_EXTERN int
-zip_rename(struct zip *za, int idx, const char *name)
+zip_rename(struct zip *za, zip_uint64_t idx, const char *name)
 {
     const char *old_name;
     int old_is_dir, new_is_dir;
     
-    if (idx >= za->nentry || idx < 0 || name[0] == '\0') {
+    if (idx >= za->nentry || name[0] == '\0') {
 	_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
 	return -1;
     }
diff --git a/lib/zip_replace.c b/lib/zip_replace.c
index baa0b8a..03d66d5 100644
--- a/lib/zip_replace.c
+++ b/lib/zip_replace.c
@@ -38,7 +38,7 @@
 
 
 ZIP_EXTERN int
-zip_replace(struct zip *za, int idx, struct zip_source *source)
+zip_replace(struct zip *za, zip_uint64_t idx, struct zip_source *source)
 {
     if (idx < 0 || idx >= za->nentry || source == NULL) {
 	_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
@@ -54,8 +54,10 @@
 
 
 
-int
-_zip_replace(struct zip *za, int idx, const char *name,
+/* NOTE: Signed due to -1 on error.  See zip_add.c for more details. */
+
+zip_int64_t
+_zip_replace(struct zip *za, zip_uint64_t idx, const char *name,
 	     struct zip_source *source)
 {
     if (ZIP_IS_RDONLY(za)) {
@@ -63,7 +65,7 @@
 	return -1;
     }
 
-    if (idx == -1) {
+    if (idx == ZIP_UINT64_MAX) {
 	if (_zip_entry_new(za) == NULL)
 	    return -1;
 
diff --git a/lib/zip_set_file_comment.c b/lib/zip_set_file_comment.c
index 571e86c..6ae76a0 100644
--- a/lib/zip_set_file_comment.c
+++ b/lib/zip_set_file_comment.c
@@ -40,11 +40,12 @@
 
 
 ZIP_EXTERN int
-zip_set_file_comment(struct zip *za, int idx, const char *comment, int len)
+zip_set_file_comment(struct zip *za, zip_uint64_t idx,
+		     const char *comment, int len)
 {
     char *tmpcom;
 
-    if (idx < 0 || idx >= za->nentry
+    if (idx >= za->nentry
 	|| len < 0 || len > MAXCOMLEN
 	|| (len > 0 && comment == NULL)) {
 	_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
diff --git a/lib/zip_set_name.c b/lib/zip_set_name.c
index 5c7da3d..2a90601 100644
--- a/lib/zip_set_name.c
+++ b/lib/zip_set_name.c
@@ -41,12 +41,12 @@
 
 
 int
-_zip_set_name(struct zip *za, int idx, const char *name)
+_zip_set_name(struct zip *za, zip_uint64_t idx, const char *name)
 {
     char *s;
-    int i;
+    zip_int64_t i;
     
-    if (idx < 0 || idx >= za->nentry || name == NULL) {
+    if (idx >= za->nentry || name == NULL) {
 	_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
 	return -1;
     }
diff --git a/lib/zip_source_buffer.c b/lib/zip_source_buffer.c
index e2f1218..bd81894 100644
--- a/lib/zip_source_buffer.c
+++ b/lib/zip_source_buffer.c
@@ -1,6 +1,6 @@
 /*
   zip_source_buffer.c -- create zip data source from buffer
-  Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -44,8 +44,7 @@
     int freep;
 };
 
-static ssize_t read_data(void *state, void *data, size_t len,
-			 enum zip_source_cmd cmd);
+static zip_int64_t read_data(void *, void *, zip_uint64_t, enum zip_source_cmd);
 
 
 
@@ -83,12 +82,12 @@
 
 
 
-static ssize_t
-read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd)
+static zip_int64_t
+read_data(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd)
 {
     struct read_data *z;
     char *buf;
-    size_t n;
+    zip_uint64_t n;
 
     z = (struct read_data *)state;
     buf = (char *)data;
@@ -99,6 +98,8 @@
 	return 0;
 	
     case ZIP_SOURCE_READ:
+	/* XXX: return error if (len > ZIP_INT64_MAX) */
+
 	n = z->end - z->buf;
 	if (n > len)
 	    n = len;
diff --git a/lib/zip_source_call.c b/lib/zip_source_call.c
index c07979b..0454e0a 100644
--- a/lib/zip_source_call.c
+++ b/lib/zip_source_call.c
@@ -37,8 +37,9 @@
 
 
 
-ZIP_EXTERN ssize_t zip_source_call(struct zip_source *src, void *data,
-				   size_t len, enum zip_source_cmd cmd)
+ZIP_EXTERN zip_int64_t zip_source_call(struct zip_source *src, void *data,
+				       zip_uint64_t len,
+				       enum zip_source_cmd cmd)
 {
     return src->f(src->ud, data, len, cmd);
 }
diff --git a/lib/zip_source_deflate.c b/lib/zip_source_deflate.c
index 04efd4b..b289500 100644
--- a/lib/zip_source_deflate.c
+++ b/lib/zip_source_deflate.c
@@ -50,10 +50,12 @@
     z_stream zstr;
 };
 
-static ssize_t compress_read(struct deflate *, void *, size_t);
-static ssize_t decompress_read(struct deflate *, void *, size_t);
-static ssize_t deflate_compress(void *, void *, size_t, enum zip_source_cmd);
-static ssize_t deflate_decompress(void *, void *, size_t, enum zip_source_cmd);
+static zip_int64_t compress_read(struct deflate *, void *, zip_uint64_t);
+static zip_int64_t decompress_read(struct deflate *, void *, zip_uint64_t);
+static zip_int64_t deflate_compress(void *, void *, zip_uint64_t,
+				    enum zip_source_cmd);
+static zip_int64_t deflate_decompress(void *, void *, zip_uint64_t,
+				      enum zip_source_cmd);
 
 
 
@@ -90,12 +92,12 @@
 
 
 
-static ssize_t
-compress_read(struct deflate *ctx, void *data, size_t len)
+static zip_int64_t
+compress_read(struct deflate *ctx, void *data, zip_uint64_t len)
 {
     int end, ret;
-    ssize_t n;
-    size_t out_before;
+    zip_int64_t n;
+    zip_uint64_t out_before;
 
     if (ctx->e[0] != 0)
 	return -1;
@@ -167,11 +169,11 @@
 
 
 
-static ssize_t
-decompress_read(struct deflate *ctx, void *data, size_t len)
+static zip_int64_t
+decompress_read(struct deflate *ctx, void *data, zip_uint64_t len)
 {
     int end, ret;
-    ssize_t n;
+    zip_int64_t n;
 
     if (ctx->e[0] != 0)
 	return -1;
@@ -232,8 +234,9 @@
 
 
 
-static ssize_t
-deflate_compress(void *ud, void *data, size_t len, enum zip_source_cmd cmd)
+static zip_int64_t
+deflate_compress(void *ud, void *data, zip_uint64_t len,
+		 enum zip_source_cmd cmd)
 {
     struct deflate *ctx;
     int ret;
@@ -320,11 +323,12 @@
 
 
 
-static ssize_t
-deflate_decompress(void *ud, void *data, size_t len, enum zip_source_cmd cmd)
+static zip_int64_t
+deflate_decompress(void *ud, void *data, zip_uint64_t len,
+		   enum zip_source_cmd cmd)
 {
     struct deflate *ctx;
-    ssize_t n;
+    zip_int64_t n;
     int ret;
 
     ctx = (struct deflate *)ud;
diff --git a/lib/zip_source_filep.c b/lib/zip_source_filep.c
index 7ca0704..7020dd6 100644
--- a/lib/zip_source_filep.c
+++ b/lib/zip_source_filep.c
@@ -53,7 +53,7 @@
     int e[2];		/* error codes */
 };
 
-static ssize_t read_file(void *state, void *data, size_t len,
+static zip_int64_t read_file(void *state, void *data, zip_uint64_t len,
 		     enum zip_source_cmd cmd);
 
 
@@ -120,8 +120,8 @@
 
 
 
-static ssize_t
-read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd)
+static zip_int64_t
+read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd)
 {
     struct read_file *z;
     char *buf;
@@ -151,6 +151,7 @@
 	return 0;
 	
     case ZIP_SOURCE_READ:
+	/* XXX: return INVAL if len > size_t max */
 	if (z->remain != -1)
 	    n = len > z->remain ? z->remain : len;
 	else
diff --git a/lib/zip_source_pkware.c b/lib/zip_source_pkware.c
index 136f08c..8b1c749 100644
--- a/lib/zip_source_pkware.c
+++ b/lib/zip_source_pkware.c
@@ -53,9 +53,9 @@
 
 
 static void decrypt(struct trad_pkware *, zip_uint8_t *,
-		    const zip_uint8_t *, size_t);
+		    const zip_uint8_t *, zip_uint64_t);
 static int decrypt_header(struct trad_pkware *);
-static ssize_t pkware_decrypt(void *, void *, size_t, enum zip_source_cmd);
+static zip_int64_t pkware_decrypt(void *, void *, zip_uint64_t, enum zip_source_cmd);
 
 
 
@@ -91,10 +91,10 @@
 
 static void
 decrypt(struct trad_pkware *ctx, zip_uint8_t *out, const zip_uint8_t *in,
-	size_t len)
+	zip_uint64_t len)
 {
     zip_uint16_t clr;
-    size_t i;
+    zip_uint64_t i;
     Bytef b;
 
     for (i=0; i<len; i++) {
@@ -123,7 +123,7 @@
 {
     zip_uint8_t header[HEADERLEN];
     struct zip_stat st;
-    ssize_t n;
+    zip_int64_t n;
 
     if ((n=zip_source_call(ctx->src, header, HEADERLEN, ZIP_SOURCE_READ)) < 0) {
 	zip_source_call(ctx->src, ctx->e, sizeof(ctx->e), ZIP_SOURCE_ERROR);
@@ -154,11 +154,11 @@
 
 
 
-static ssize_t
-pkware_decrypt(void *ud, void *data, size_t len, enum zip_source_cmd cmd)
+static zip_int64_t
+pkware_decrypt(void *ud, void *data, zip_uint64_t len, enum zip_source_cmd cmd)
 {
     struct trad_pkware *ctx;
-    ssize_t n;
+    zip_int64_t n;
 
     ctx = (struct trad_pkware *)ud;
 
@@ -177,7 +177,7 @@
 	    zip_source_call(ctx->src, ctx->e, sizeof(ctx->e), ZIP_SOURCE_ERROR);
 	    return -1;
 	}
-	decrypt(ud, (zip_uint8_t *)data, (zip_uint8_t *)data, (size_t)n);
+	decrypt(ud, (zip_uint8_t *)data, (zip_uint8_t *)data, (zip_uint64_t)n);
 	return n;
 
     case ZIP_SOURCE_CLOSE:
diff --git a/lib/zip_source_zip.c b/lib/zip_source_zip.c
index 4d595be..2b9061f 100644
--- a/lib/zip_source_zip.c
+++ b/lib/zip_source_zip.c
@@ -1,6 +1,6 @@
 /*
   zip_source_zip.c -- create data source from zip file
-  Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -45,14 +45,14 @@
     zip_int64_t len;
 };
 
-static ssize_t read_zip(void *st, void *data, size_t len,
+static zip_int64_t read_zip(void *st, void *data, zip_uint64_t len,
 			enum zip_source_cmd cmd);
 
 
 
 ZIP_EXTERN struct zip_source *
-zip_source_zip(struct zip *za, struct zip *srcza, int srcidx, int flags,
-	       zip_uint64_t start, zip_int64_t len)
+zip_source_zip(struct zip *za, struct zip *srcza, zip_uint64_t srcidx,
+	       int flags, zip_uint64_t start, zip_int64_t len)
 {
     struct zip_error error;
     struct zip_source *zs;
@@ -116,8 +116,8 @@
 
 
 
-static ssize_t
-read_zip(void *state, void *data, size_t len, enum zip_source_cmd cmd)
+static zip_int64_t
+read_zip(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd)
 {
     struct read_zip *z;
     char b[8192], *buf;
diff --git a/lib/zip_stat_index.c b/lib/zip_stat_index.c
index 60558e4..17bc0a0 100644
--- a/lib/zip_stat_index.c
+++ b/lib/zip_stat_index.c
@@ -38,11 +38,12 @@
 
 
 ZIP_EXTERN int
-zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st)
+zip_stat_index(struct zip *za, zip_uint64_t index, int flags,
+	       struct zip_stat *st)
 {
     const char *name;
     
-    if (index < 0 || index >= za->nentry) {
+    if (index >= za->nentry) {
 	_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
 	return -1;
     }
diff --git a/lib/zip_stat_init.c b/lib/zip_stat_init.c
index 133ad30..50cc113 100644
--- a/lib/zip_stat_init.c
+++ b/lib/zip_stat_init.c
@@ -41,7 +41,7 @@
 zip_stat_init(struct zip_stat *st)
 {
     st->name = NULL;
-    st->index = -1;
+    st->index = ZIP_UINT64_MAX;
     st->crc = 0;
     st->mtime = (time_t)-1;
     st->size = -1;
diff --git a/lib/zip_unchange.c b/lib/zip_unchange.c
index ed0d4de..58ec54b 100644
--- a/lib/zip_unchange.c
+++ b/lib/zip_unchange.c
@@ -40,7 +40,7 @@
 
 
 ZIP_EXTERN int
-zip_unchange(struct zip *za, int idx)
+zip_unchange(struct zip *za, zip_uint64_t idx)
 {
     return _zip_unchange(za, idx, 0);
 }
@@ -48,11 +48,11 @@
 
 
 int
-_zip_unchange(struct zip *za, int idx, int allow_duplicates)
+_zip_unchange(struct zip *za, zip_uint64_t idx, int allow_duplicates)
 {
     int i;
     
-    if (idx < 0 || idx >= za->nentry) {
+    if (idx >= za->nentry) {
 	_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
 	return -1;
     }
diff --git a/lib/zipint.h b/lib/zipint.h
index a047bcd..3ccffa6 100644
--- a/lib/zipint.h
+++ b/lib/zipint.h
@@ -123,8 +123,8 @@
     char *ch_comment;		/* changed archive comment */
     int ch_comment_len;		/* length of changed zip archive
 				 * comment, -1 if unchanged */
-    int nentry;			/* number of entries */
-    int nentry_alloc;		/* number of entries allocated */
+    zip_uint64_t nentry;	/* number of entries */
+    zip_uint64_t nentry_alloc;	/* number of entries allocated */
     struct zip_entry *entry;	/* entries */
     int nfile;			/* number of opened files within archive */
     int nfile_alloc;		/* number of files allocated */
@@ -251,16 +251,17 @@
 
 int _zip_changed(struct zip *, int *);
 void _zip_free(struct zip *);
-const char *_zip_get_name(struct zip *, int, int, struct zip_error *);
+const char *_zip_get_name(struct zip *, zip_uint64_t, int, struct zip_error *);
 int _zip_local_header_read(struct zip *, int);
 void *_zip_memdup(const void *, size_t, struct zip_error *);
 int _zip_name_locate(struct zip *, const char *, int, struct zip_error *);
 struct zip *_zip_new(struct zip_error *);
 unsigned short _zip_read2(unsigned char **);
 unsigned int _zip_read4(unsigned char **);
-int _zip_replace(struct zip *, int, const char *, struct zip_source *);
-int _zip_set_name(struct zip *, int, const char *);
-int _zip_unchange(struct zip *, int, int);
+zip_int64_t _zip_replace(struct zip *, zip_uint64_t, const char *,
+			 struct zip_source *);
+int _zip_set_name(struct zip *, zip_uint64_t, const char *);
+int _zip_unchange(struct zip *, zip_uint64_t, int);
 void _zip_unchange_data(struct zip_entry *);
 
 #endif /* zipint.h */