Add some casts for gcc 4.8.3 with more-than-default warnings enabled.
diff --git a/lib/zip.h b/lib/zip.h
index 3b51208..88a44a4 100644
--- a/lib/zip.h
+++ b/lib/zip.h
@@ -236,6 +236,7 @@
     zip_int64_t offset;
     int whence;
 };
+
 typedef struct zip_source_args_seek zip_source_args_seek_t;
 #define ZIP_SOURCE_GET_ARGS(type, data, len, error) ((len) < sizeof(type) ? zip_error_set((error), ZIP_ER_INVAL, 0), NULL : (type *)(data))
 
diff --git a/lib/zip_close.c b/lib/zip_close.c
index 5047088..9502273 100644
--- a/lib/zip_close.c
+++ b/lib/zip_close.c
@@ -207,7 +207,7 @@
 	    zip_uint64_t offset;
 
 	    /* when copying data, all sizes are known -> no data descriptor needed */
-	    de->bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR;
+	    de->bitflags &= (zip_uint16_t)~ZIP_GPBF_DATA_DESCRIPTOR;
 	    if (_zip_dirent_write(za, de, ZIP_FL_LOCAL) < 0) {
 		error = 1;
 		break;
@@ -306,7 +306,7 @@
     }
 
     /* as long as we don't support non-seekable output, clear data descriptor bit */
-    de->bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR;
+    de->bitflags &= (zip_uint16_t)~ZIP_GPBF_DATA_DESCRIPTOR;
     if ((is_zip64=_zip_dirent_write(za, de, flags)) < 0)
 	return -1;
 
diff --git a/lib/zip_dirent.c b/lib/zip_dirent.c
index d26d54b..d95d07a 100644
--- a/lib/zip_dirent.c
+++ b/lib/zip_dirent.c
@@ -42,7 +42,7 @@
 #include "zipint.h"
 
 static time_t _zip_d2u_time(zip_uint16_t, zip_uint16_t);
-static struct zip_string *_zip_dirent_process_ef_utf_8(const struct zip_dirent *, zip_uint16_t, struct zip_string *);
+static struct zip_string *_zip_dirent_process_ef_utf_8(const struct zip_dirent *de, zip_uint16_t id, struct zip_string *str);
 static struct zip_extra_field *_zip_ef_utf8(zip_uint16_t, struct zip_string *, struct zip_error *);
 
 
@@ -399,7 +399,7 @@
     zde->extra_fields = NULL;
     zde->comment = NULL;
 
-    size += filename_len+ef_len+comment_len;
+    size += (zip_uint32_t)filename_len+ef_len+comment_len;
 
     if (leftp && (*leftp < size)) {
 	zip_error_set(error, ZIP_ER_INCONS, 0);
@@ -456,7 +456,8 @@
     /* Zip64 */
 
     if (zde->uncomp_size == ZIP_UINT32_MAX || zde->comp_size == ZIP_UINT32_MAX || zde->offset == ZIP_UINT32_MAX) {
-	zip_uint16_t got_len, needed_len;
+	zip_uint32_t needed_len;
+	zip_uint16_t got_len;
 	const zip_uint8_t *ef = _zip_ef_get_by_id(zde->extra_fields, &got_len, ZIP_EF_ZIP64, 0, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, error);
 	/* TODO: if got_len == 0 && !ZIP64_EOCD: no error, 0xffffffff is valid value */
 	if (ef == NULL)
@@ -465,9 +466,17 @@
 
 	if (local)
 	    needed_len = 16;
-	else
-	    needed_len = ((zde->uncomp_size == ZIP_UINT32_MAX) + (zde->comp_size == ZIP_UINT32_MAX) + (zde->offset == ZIP_UINT32_MAX)) * 8
-		+ (zde->disk_number == ZIP_UINT16_MAX) * 4;
+	else {
+	    needed_len = 0;
+	    if (zde->uncomp_size == ZIP_UINT32_MAX)
+		needed_len += 8;
+	    if (zde->comp_size == ZIP_UINT32_MAX)
+		needed_len += 8;
+	    if (zde->offset == ZIP_UINT32_MAX)
+		needed_len += 8;
+	    if (zde->disk_number == ZIP_UINT16_MAX)
+		needed_len += 4;
+	}
 
 	if (got_len != needed_len) {
 	    zip_error_set(error, ZIP_ER_INCONS, 0);
@@ -520,7 +529,7 @@
     ef_crc = _zip_get_32(&ef);
 
     if (_zip_string_crc32(str) == ef_crc) {
-	struct zip_string *ef_str = _zip_string_new(ef, ef_len-5, ZIP_FL_ENC_UTF_8, NULL);
+	struct zip_string *ef_str = _zip_string_new(ef, (zip_uint16_t)(ef_len-5), ZIP_FL_ENC_UTF_8, NULL);
 
 	if (ef_str != NULL) {
 	    _zip_string_free(str);
@@ -651,7 +660,7 @@
 	(name_enc == ZIP_ENCODING_UTF8_KNOWN  && com_enc == ZIP_ENCODING_UTF8_KNOWN))
 	de->bitflags |= ZIP_GPBF_ENCODING_UTF_8;
     else {
-	de->bitflags &= ~ZIP_GPBF_ENCODING_UTF_8;
+	de->bitflags &= (zip_uint16_t)~ZIP_GPBF_ENCODING_UTF_8;
 	if (name_enc == ZIP_ENCODING_UTF8_KNOWN) {
 	    ef = _zip_ef_utf8(ZIP_EF_UTF_8_NAME, de->filename, &za->error);
 	    if (ef == NULL)
@@ -719,7 +728,7 @@
 	_zip_put_32(&p, ZIP_UINT32_MAX);
 
     _zip_put_16(&p, _zip_string_length(de->filename));
-    _zip_put_16(&p, _zip_ef_size(de->extra_fields, flags) + _zip_ef_size(ef, ZIP_EF_BOTH));
+    _zip_put_16(&p, (zip_uint16_t)(_zip_ef_size(de->extra_fields, flags) + _zip_ef_size(ef, ZIP_EF_BOTH)));
     
     if ((flags & ZIP_FL_LOCAL) == 0) {
 	_zip_put_16(&p, _zip_string_length(de->comment));
diff --git a/lib/zip_extra_field.c b/lib/zip_extra_field.c
index 85cab50..74cf2be 100644
--- a/lib/zip_extra_field.c
+++ b/lib/zip_extra_field.c
@@ -287,7 +287,7 @@
     size = 0;
     for (; ef; ef=ef->next) {
 	if (ef->flags & flags & ZIP_EF_BOTH)
-	    size += 4+ef->size;
+	    size = (zip_uint16_t)(size+4+ef->size);
     }
 
     return size;
diff --git a/lib/zip_file_get_external_attributes.c b/lib/zip_file_get_external_attributes.c
index bf8bf02..a7c6455 100644
--- a/lib/zip_file_get_external_attributes.c
+++ b/lib/zip_file_get_external_attributes.c
@@ -42,7 +42,7 @@
 	return -1;
 
     if (opsys)
-	*opsys = (de->version_madeby >> 8) & 0xff;
+	*opsys = (zip_uint8_t)((de->version_madeby >> 8) & 0xff);
 
     if (attributes)
 	*attributes = de->ext_attrib;
diff --git a/lib/zip_file_set_external_attributes.c b/lib/zip_file_set_external_attributes.c
index 61623d2..c06891f 100644
--- a/lib/zip_file_set_external_attributes.c
+++ b/lib/zip_file_set_external_attributes.c
@@ -51,7 +51,7 @@
 
     e = za->entry+idx;
 
-    unchanged_opsys = e->orig ? e->orig->version_madeby>>8 : ZIP_OPSYS_DEFAULT;
+    unchanged_opsys = e->orig ? (zip_uint8_t)(e->orig->version_madeby>>8) : ZIP_OPSYS_DEFAULT;
     unchanged_attributes = e->orig ? e->orig->ext_attrib : ZIP_EXT_ATTRIB_DEFAULT;
 
     changed = (opsys != unchanged_opsys || attributes != unchanged_attributes);
@@ -63,7 +63,7 @@
                 return -1;
             }
         }
-        e->changes->version_madeby = (zip_uint16_t)(opsys << 8) | (e->changes->version_madeby & 0xff);
+        e->changes->version_madeby = (zip_uint16_t)((opsys << 8) | (e->changes->version_madeby & 0xff));
 	e->changes->ext_attrib = attributes;
         e->changes->changed |= ZIP_DIRENT_ATTRIBUTES;
     }
@@ -74,7 +74,8 @@
 	    e->changes = NULL;
 	}
 	else {
-	    e->changes->version_madeby = (zip_uint16_t)(unchanged_opsys << 8) | (e->changes->version_madeby & 0xff);
+	    e->changes->version_madeby = (zip_uint16_t)((unchanged_opsys << 8) | (e->changes->version_madeby & 0xff))
+;
 	    e->changes->ext_attrib = unchanged_attributes;
 	}
     }
diff --git a/lib/zip_io_util.c b/lib/zip_io_util.c
index 08d498e..6664ecd 100644
--- a/lib/zip_io_util.c
+++ b/lib/zip_io_util.c
@@ -156,32 +156,32 @@
 void
 _zip_put_16(zip_uint8_t **p, zip_uint16_t i)
 {
-    *((*p)++) = i&0xff;
-    *((*p)++) = (i>>8)&0xff;
+    *((*p)++) = (zip_uint8_t)(i&0xff);
+    *((*p)++) = (zip_uint8_t)((i>>8)&0xff);
 }
 
 
 void
 _zip_put_32(zip_uint8_t **p, zip_uint32_t i)
 {
-    *((*p)++) = i&0xff;
-    *((*p)++) = (i>>8)&0xff;
-    *((*p)++) = (i>>16)&0xff;
-    *((*p)++) = (i>>24)&0xff;
+    *((*p)++) = (zip_uint8_t)(i&0xff);
+    *((*p)++) = (zip_uint8_t)((i>>8)&0xff);
+    *((*p)++) = (zip_uint8_t)((i>>16)&0xff);
+    *((*p)++) = (zip_uint8_t)((i>>24)&0xff);
 }
 
 
 void
 _zip_put_64(zip_uint8_t **p, zip_uint64_t i)
 {
-    *((*p)++) = i&0xff;
-    *((*p)++) = (i>>8)&0xff;
-    *((*p)++) = (i>>16)&0xff;
-    *((*p)++) = (i>>24)&0xff;
-    *((*p)++) = (i>>32)&0xff;
-    *((*p)++) = (i>>40)&0xff;
-    *((*p)++) = (i>>48)&0xff;
-    *((*p)++) = (i>>56)&0xff;
+    *((*p)++) = (zip_uint8_t)(i&0xff);
+    *((*p)++) = (zip_uint8_t)((i>>8)&0xff);
+    *((*p)++) = (zip_uint8_t)((i>>16)&0xff);
+    *((*p)++) = (zip_uint8_t)((i>>24)&0xff);
+    *((*p)++) = (zip_uint8_t)((i>>32)&0xff);
+    *((*p)++) = (zip_uint8_t)((i>>40)&0xff);
+    *((*p)++) = (zip_uint8_t)((i>>48)&0xff);
+    *((*p)++) = (zip_uint8_t)((i>>56)&0xff);
 }
 
 
diff --git a/lib/zip_source_buffer.c b/lib/zip_source_buffer.c
index 85631ad..d3e1301 100644
--- a/lib/zip_source_buffer.c
+++ b/lib/zip_source_buffer.c
@@ -31,7 +31,7 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-
+#include <errno.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -122,8 +122,6 @@
 read_data(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd)
 {
     struct read_data *ctx = (struct read_data *)state;
-    char *buf;
-    zip_uint64_t n;
 
     switch (cmd) {
         case ZIP_SOURCE_BEGIN_WRITE:
@@ -156,6 +154,10 @@
             return 0;
 	
         case ZIP_SOURCE_READ:
+	    if (len > ZIP_INT64_MAX) {
+		zip_error_set(&ctx->error, ZIP_ER_INVAL, 0);
+		return -1;
+	    }
             return buffer_read(ctx->in, data, len);
 	
         case ZIP_SOURCE_REMOVE:
@@ -208,12 +210,25 @@
 	    return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_SEEK, ZIP_SOURCE_TELL, ZIP_SOURCE_BEGIN_WRITE, ZIP_SOURCE_COMMIT_WRITE, ZIP_SOURCE_REMOVE, ZIP_SOURCE_ROLLBACK_WRITE, ZIP_SOURCE_SEEK_WRITE, ZIP_SOURCE_TELL_WRITE, ZIP_SOURCE_WRITE, -1);
             
         case ZIP_SOURCE_TELL:
-            return ctx->in->offset;
+            if (ctx->in->offset > ZIP_INT64_MAX) {
+		zip_error_set(&ctx->error, ZIP_ER_TELL, EOVERFLOW);
+		return -1;
+	    }
+	    return (zip_int64_t)ctx->in->offset;
+		
             
         case ZIP_SOURCE_TELL_WRITE:
-            return ctx->out->offset;
+            if (ctx->out->offset > ZIP_INT64_MAX) {
+		zip_error_set(&ctx->error, ZIP_ER_TELL, EOVERFLOW);
+		return -1;
+	    }
+	    return (zip_int64_t)ctx->out->offset;
 
         case ZIP_SOURCE_WRITE:
+	    if (len > ZIP_INT64_MAX) {
+		zip_error_set(&ctx->error, ZIP_ER_INVAL, 0);
+		return -1;
+	    }
 	    return buffer_write(ctx->out, data, len, &ctx->error);
 
         default:
@@ -321,6 +336,9 @@
     if (length == 0) {
 	return 0;
     }
+    if (length > ZIP_INT64_MAX) {
+	return -1;
+    }
 
     i = buffer->offset / buffer->fragment_size;
     fragment_offset = buffer->offset % buffer->fragment_size;
@@ -336,30 +354,30 @@
     }
 
     buffer->offset += n;
-    return n;
+    return (zip_int64_t)n;
 }
 
 
 static int
 buffer_seek(buffer_t *buffer, void *data, zip_uint64_t len, zip_error_t *error)
 {
-    zip_uint64_t offset;
+    zip_int64_t offset;
     zip_source_args_seek_t *args = ZIP_SOURCE_GET_ARGS(zip_source_args_seek_t, data, len, error);
 
     if (args == NULL)
 	return -1;
-            
+
     switch (args->whence) {
     case SEEK_CUR:
-	offset = buffer->offset + args->offset;
+	offset = (zip_int64_t)buffer->offset + args->offset;
 	break;
                     
     case SEEK_END:
-	offset = buffer->size + args->offset;
+	offset = (zip_int64_t)buffer->size + args->offset;
 	break;
 
     case SEEK_SET:
-	offset = args->offset;
+	offset = (zip_int64_t)args->offset;
 	break;
     }
 
@@ -368,7 +386,7 @@
 	return -1;
     }
 
-    buffer->offset = offset;
+    buffer->offset = (zip_uint64_t)offset;
     return 0;
 }
 
@@ -432,5 +450,5 @@
 	buffer->size = buffer->offset;
     }
 
-    return n;
+    return (zip_int64_t)n;
 }
diff --git a/lib/zip_source_crc.c b/lib/zip_source_crc.c
index f96cb3e..8e2edc2 100644
--- a/lib/zip_source_crc.c
+++ b/lib/zip_source_crc.c
@@ -122,8 +122,8 @@
             else {
 		zip_uint64_t i, nn;
 
-		for (i=0; i < n; i += nn) {
-		    nn = ZIP_MIN(UINT_MAX, n-i);
+		for (i=0; i < (zip_uint64_t)n; i += nn) {
+		    nn = ZIP_MIN(UINT_MAX, (zip_uint64_t)n-i);
 
 		    ctx->crc = (zip_uint32_t)crc32(ctx->crc, (const Bytef *)data+i, (uInt)nn);
 		}
diff --git a/lib/zip_source_deflate.c b/lib/zip_source_deflate.c
index a3a9cef..42d0155 100644
--- a/lib/zip_source_deflate.c
+++ b/lib/zip_source_deflate.c
@@ -192,7 +192,7 @@
 	return 0;
 
     out_offset = 0;
-    out_len = ZIP_MIN(UINT_MAX, len);
+    out_len = (uInt)ZIP_MIN(UINT_MAX, len);
     ctx->zstr.next_out = (Bytef *)data;
     ctx->zstr.avail_out = out_len;
 
diff --git a/lib/zip_source_pkware.c b/lib/zip_source_pkware.c
index c88ae02..21a826e 100644
--- a/lib/zip_source_pkware.c
+++ b/lib/zip_source_pkware.c
@@ -107,8 +107,8 @@
 	if (!update_only) {
 	    /* decrypt next byte */
 	    tmp = (zip_uint16_t)(ctx->key[2] | 2);
-	    tmp = (tmp * (tmp ^ 1)) >> 8;
-	    b ^= tmp;
+	    tmp = (zip_uint16_t)((tmp * (tmp ^ 1)) >> 8);
+	    b ^= (Bytef)tmp;
 	}
 
 	/* store cleartext */
@@ -118,7 +118,7 @@
 	/* update keys */
 	ctx->key[0] = (zip_uint32_t)crc32(ctx->key[0] ^ 0xffffffffUL, &b, 1) ^ 0xffffffffUL;
 	ctx->key[1] = (ctx->key[1] + (ctx->key[0] & 0xff)) * 134775813 + 1;
-	b = ctx->key[1] >> 24;
+	b = (Bytef)(ctx->key[1] >> 24);
 	ctx->key[2] = (zip_uint32_t)crc32(ctx->key[2] ^ 0xffffffffUL, &b, 1) ^ 0xffffffffUL;
     }
 }
diff --git a/lib/zip_source_window.c b/lib/zip_source_window.c
index 5bbfdfe..ca5359c 100644
--- a/lib/zip_source_window.c
+++ b/lib/zip_source_window.c
@@ -77,7 +77,7 @@
     zip_stat_init(&ctx->stat);
     zip_error_init(&ctx->error);
     ctx->supports = (zip_source_supports(src) & zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_SEEK, ZIP_SOURCE_TELL, -1)) | (zip_source_make_command_bitmap(ZIP_SOURCE_TELL, -1));
-    ctx->needs_seek = ctx->supports & zip_source_make_command_bitmap(ZIP_SOURCE_SEEK, -1);
+    ctx->needs_seek = (zip_int16_t)(ctx->supports & zip_source_make_command_bitmap(ZIP_SOURCE_SEEK, -1));
     
     if (st) {
         if (_zip_stat_merge(&ctx->stat, st, error) < 0) {
diff --git a/lib/zip_string.c b/lib/zip_string.c
index a731ebb..d00e3aa 100644
--- a/lib/zip_string.c
+++ b/lib/zip_string.c
@@ -154,7 +154,7 @@
 	return NULL;
     }
 
-    if ((s->raw=(zip_uint8_t *)malloc(length+1)) == NULL) {
+    if ((s->raw=(zip_uint8_t *)malloc((size_t)(length+1))) == NULL) {
 	free(s);
 	return NULL;
     }
diff --git a/lib/zip_utf-8.c b/lib/zip_utf-8.c
index 58c4195..4321412 100644
--- a/lib/zip_utf-8.c
+++ b/lib/zip_utf-8.c
@@ -196,20 +196,20 @@
 	return 1;
     }
     if (codepoint < 0x0800) {
-	buf[0] = UTF_8_LEN_2_MATCH | ((codepoint >> 6) & 0x1f);
-	buf[1] = UTF_8_CONTINUE_MATCH | (codepoint & 0x3f);
+	buf[0] = (zip_uint8_t)(UTF_8_LEN_2_MATCH | ((codepoint >> 6) & 0x1f));
+	buf[1] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | (codepoint & 0x3f));
 	return 2;
     }
     if (codepoint < 0x10000) {
-	buf[0] = UTF_8_LEN_3_MATCH | ((codepoint >> 12) & 0x0f);
-	buf[1] = UTF_8_CONTINUE_MATCH | ((codepoint >> 6) & 0x3f);
-	buf[2] = UTF_8_CONTINUE_MATCH | (codepoint & 0x3f);
+	buf[0] = (zip_uint8_t)(UTF_8_LEN_3_MATCH | ((codepoint >> 12) & 0x0f));
+	buf[1] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | ((codepoint >> 6) & 0x3f));
+	buf[2] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | (codepoint & 0x3f));
 	return 3;
     }
-    buf[0] = UTF_8_LEN_4_MATCH | ((codepoint >> 18) & 0x07);
-    buf[1] = UTF_8_CONTINUE_MATCH | ((codepoint >> 12) & 0x3f);
-    buf[2] = UTF_8_CONTINUE_MATCH | ((codepoint >> 6) & 0x3f);
-    buf[3] = UTF_8_CONTINUE_MATCH | (codepoint & 0x3f);
+    buf[0] = (zip_uint8_t)(UTF_8_LEN_4_MATCH | ((codepoint >> 18) & 0x07));
+    buf[1] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | ((codepoint >> 12) & 0x3f));
+    buf[2] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | ((codepoint >> 6) & 0x3f));
+    buf[3] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | (codepoint & 0x3f));
     return 4;
 }
 
diff --git a/regress/modify.c b/regress/modify.c
index c5df6cf..9debe2a 100644
--- a/regress/modify.c
+++ b/regress/modify.c
@@ -55,7 +55,6 @@
     int (*function)(int argc, char *argv[]);
 } dispatch_table_t;
 
-const char *prg;
 static zip_flags_t get_flags(const char *arg);
 static zip_int32_t get_compression_method(const char *arg);
 static void hexdump(const zip_uint8_t *data, zip_uint16_t len);
@@ -133,7 +132,7 @@
 	return -1;
     }
     if ((zs=zip_source_zip(za, z_in, idx, 0, start, len)) == NULL) {
-	fprintf(stderr, "error creating file source from '%s' index '%d': %s\n", argv[1], idx, zip_strerror(za));
+	fprintf(stderr, "error creating file source from '%s' index '%" PRIu64 "': %s\n", argv[1], idx, zip_strerror(za));
 	zip_close(z_in);
 	return -1;
     }
@@ -154,7 +153,7 @@
     idx = strtoull(argv[0], NULL, 10);
     ceflags = get_flags(argv[1]);
     if ((count=zip_file_extra_fields_count(za, idx, ceflags)) < 0) {
-	fprintf(stderr, "can't get extra field count for file at index '%d': %s\n", idx, zip_strerror(za));
+	fprintf(stderr, "can't get extra field count for file at index '%" PRIu64 "': %s\n", idx, zip_strerror(za));
 	return -1;
     } else {
 	printf("Extra field count: %d\n", count);
@@ -164,14 +163,15 @@
 
 static int
 count_extra_by_id(int argc, char *argv[]) {
-    zip_int16_t count, eid;
+    zip_int16_t count;
+    zip_uint16_t eid;
     zip_flags_t ceflags = 0;
     zip_uint64_t idx;
     idx = strtoull(argv[0], NULL, 10);
-    eid = strtoull(argv[1], NULL, 10);
+    eid = (zip_uint16_t)strtoull(argv[1], NULL, 10);
     ceflags = get_flags(argv[2]);
     if ((count=zip_file_extra_fields_count_by_id(za, idx, eid, ceflags)) < 0) {
-	fprintf(stderr, "can't get extra field count for file at index '%d' and for id `%d': %s\n", idx, eid, zip_strerror(za));
+	fprintf(stderr, "can't get extra field count for file at index '%" PRIu64 "' and for id `%d': %s\n", idx, eid, zip_strerror(za));
 	return -1;
     } else {
 	printf("Extra field count: %d\n", count);
@@ -184,7 +184,7 @@
     zip_uint64_t idx;
     idx = strtoull(argv[0], NULL, 10);
     if (zip_delete(za, idx) < 0) {
-	fprintf(stderr, "can't delete file at index '%d': %s\n", idx, zip_strerror(za));
+	fprintf(stderr, "can't delete file at index '%" PRIu64 "': %s\n", idx, zip_strerror(za));
 	return -1;
     }
     return 0;
@@ -196,10 +196,10 @@
     zip_uint16_t eid;
     zip_uint64_t idx;
     idx = strtoull(argv[0], NULL, 10);
-    eid = strtoull(argv[1], NULL, 10);
+    eid = (zip_uint16_t)strtoull(argv[1], NULL, 10);
     geflags = get_flags(argv[2]);
     if ((zip_file_extra_field_delete(za, idx, eid, geflags)) < 0) {
-	fprintf(stderr, "can't delete extra field data for file at index '%d', extra field id `%d': %s\n", idx, eid, zip_strerror(za));
+	fprintf(stderr, "can't delete extra field data for file at index '%" PRIu64 "', extra field id `%d': %s\n", idx, eid, zip_strerror(za));
 	return -1;
     }
     return 0;
@@ -211,11 +211,11 @@
     zip_uint16_t eid, eidx;
     zip_uint64_t idx;
     idx = strtoull(argv[0], NULL, 10);
-    eid = strtoull(argv[1], NULL, 10);
-    eidx = strtoull(argv[2], NULL, 10);
+    eid = (zip_uint16_t)strtoull(argv[1], NULL, 10);
+    eidx = (zip_uint16_t)strtoull(argv[2], NULL, 10);
     geflags = get_flags(argv[3]);
     if ((zip_file_extra_field_delete_by_id(za, idx, eid, eidx, geflags)) < 0) {
-	fprintf(stderr, "can't delete extra field data for file at index '%d', extra field id `%d', extra field idx `%d': %s\n", idx, eid, eidx, zip_strerror(za));
+	fprintf(stderr, "can't delete extra field data for file at index '%" PRIu64 "', extra field id `%d', extra field idx `%d': %s\n", idx, eid, eidx, zip_strerror(za));
 	return -1;
     }
     return 0;
@@ -241,10 +241,10 @@
     zip_uint64_t idx;
     /* get extra field data */
     idx = strtoull(argv[0], NULL, 10);
-    eidx = strtoull(argv[1], NULL, 10);
+    eidx = (zip_uint16_t)strtoull(argv[1], NULL, 10);
     geflags = get_flags(argv[2]);
     if ((efdata=zip_file_extra_field_get(za, idx, eidx, &id, &eflen, geflags)) == NULL) {
-	fprintf(stderr, "can't get extra field data for file at index %d, extra field %d, flags %u: %s\n", idx, eidx, geflags, zip_strerror(za));
+	fprintf(stderr, "can't get extra field data for file at index %" PRIu64 ", extra field %d, flags %u: %s\n", idx, eidx, geflags, zip_strerror(za));
 	return -1;
     }
     printf("Extra field 0x%04x: len %d", id, eflen);
@@ -263,11 +263,11 @@
     const zip_uint8_t *efdata;
     zip_uint64_t idx;
     idx = strtoull(argv[0], NULL, 10);
-    eid = strtoull(argv[1], NULL, 10);
-    eidx = strtoull(argv[2], NULL, 10);
+    eid = (zip_uint16_t)strtoull(argv[1], NULL, 10);
+    eidx = (zip_uint16_t)strtoull(argv[2], NULL, 10);
     geflags = get_flags(argv[3]);
     if ((efdata=zip_file_extra_field_get_by_id(za, idx, eid, eidx, &eflen, geflags)) == NULL) {
-	fprintf(stderr, "can't get extra field data for file at index %d, extra field id %d, ef index %d, flags %u: %s\n", idx, eid, eidx, geflags, zip_strerror(za));
+	fprintf(stderr, "can't get extra field data for file at index %" PRIu64 ", extra field id %d, ef index %d, flags %u: %s\n", idx, eid, eidx, geflags, zip_strerror(za));
 	return -1;
     }
     printf("Extra field 0x%04x: len %d", eid, eflen);
@@ -301,7 +301,7 @@
     zip_uint64_t idx;
     idx = strtoull(argv[0], NULL, 10);
     if (zip_rename(za, idx, argv[1]) < 0) {
-	fprintf(stderr, "can't rename file at index '%d' to `%s': %s\n", idx, argv[1], zip_strerror(za));
+	fprintf(stderr, "can't rename file at index '%" PRIu64 "' to `%s': %s\n", idx, argv[1], zip_strerror(za));
 	return -1;
     }
     return 0;
@@ -331,12 +331,12 @@
     const zip_uint8_t *efdata;
     zip_uint64_t idx;
     idx = strtoull(argv[0], NULL, 10);
-    eid = strtoull(argv[1], NULL, 10);
-    eidx = strtoull(argv[2], NULL, 10);
+    eid = (zip_uint16_t)strtoull(argv[1], NULL, 10);
+    eidx = (zip_uint16_t)strtoull(argv[2], NULL, 10);
     geflags = get_flags(argv[3]);
     efdata = (zip_uint8_t *)argv[4];
     if ((zip_file_extra_field_set(za, idx, eid, eidx, efdata, (zip_uint16_t)strlen((const char *)efdata), geflags)) < 0) {
-	fprintf(stderr, "can't set extra field data for file at index '%d', extra field id `%d', index `%d': %s\n", idx, eid, eidx, zip_strerror(za));
+	fprintf(stderr, "can't set extra field data for file at index '%" PRIu64 "', extra field id `%d', index `%d': %s\n", idx, eid, eidx, zip_strerror(za));
 	return -1;
     }
     return 0;
@@ -347,7 +347,7 @@
     zip_uint64_t idx;
     idx = strtoull(argv[0], NULL, 10);
     if (zip_file_set_comment(za, idx, argv[1], (zip_uint16_t)strlen(argv[1]), 0) < 0) {
-	fprintf(stderr, "can't set file comment at index '%d' to `%s': %s\n", idx, argv[1], zip_strerror(za));
+	fprintf(stderr, "can't set file comment at index '%" PRIu64 "' to `%s': %s\n", idx, argv[1], zip_strerror(za));
 	return -1;
     }
     return 0;
@@ -360,9 +360,9 @@
     zip_uint64_t idx;
     idx = strtoull(argv[0], NULL, 10);
     method = get_compression_method(argv[1]);
-    flags = strtoull(argv[2], NULL, 10);
+    flags = (zip_uint32_t)strtoull(argv[2], NULL, 10);
     if (zip_set_file_compression(za, idx, method, flags) < 0) {
-	fprintf(stderr, "can't set file compression method at index '%d' to `%s', flags `%d': %s\n", idx, argv[1], flags, zip_strerror(za));
+	fprintf(stderr, "can't set file compression method at index '%" PRIu64 "' to `%s', flags `%d': %s\n", idx, argv[1], flags, zip_strerror(za));
 	return -1;
     }
     return 0;
@@ -374,9 +374,9 @@
     time_t mtime;
     zip_uint64_t idx;
     idx = strtoull(argv[0], NULL, 10);
-    mtime = strtoull(argv[1], NULL, 10);
+    mtime = (time_t)strtoull(argv[1], NULL, 10);
     if (zip_file_set_mtime(za, idx, mtime, 0) < 0) {
-	fprintf(stderr, "can't set file mtime at index '%d' to `%ld': %s\n", idx, mtime, zip_strerror(za));
+	fprintf(stderr, "can't set file mtime at index '%" PRIu64 "' to `%ld': %s\n", idx, mtime, zip_strerror(za));
 	return -1;
     }
     return 0;
@@ -384,7 +384,7 @@
 
 static int
 zstat(int argc, char *argv[]) {
-    int index;
+    zip_uint64_t index;
     char buf[100];
     struct zip_stat sb;
     index = strtoull(argv[0], NULL, 10);
@@ -476,7 +476,7 @@
 {
     struct stat st;
     zip_source_t *src;
-    zip_t *za;
+    zip_t *zb;
     zip_error_t error;
 
     if (stat(archive, &st) < 0) {
@@ -491,7 +491,7 @@
     else {
 	char *buf;
 	FILE *fp;
-	if ((buf=malloc(st.st_size)) == NULL) {
+	if ((buf=malloc((size_t)st.st_size)) == NULL) {
 	    *err = ZIP_ER_MEMORY;
 	    return NULL;
 	}
@@ -500,13 +500,13 @@
 	    *err = ZIP_ER_READ;
 	    return NULL;
 	}
-	if (fread(buf, st.st_size, 1, fp) < 1) {
+	if (fread(buf, (size_t)st.st_size, 1, fp) < 1) {
 	    free(buf);
 	    *err = ZIP_ER_READ;
 	    return NULL;
 	}
 	fclose(fp);
-	src = zip_source_buffer_create(buf, st.st_size, 1, &error);
+	src = zip_source_buffer_create(buf, (zip_uint64_t)st.st_size, 1, &error);
 	if (src == NULL) {
 	    free(buf);
 	}
@@ -516,8 +516,8 @@
 	errno = zip_error_code_system(&error);
 	return NULL;
     }
-    za = zip_open_from_source(src, flags, &error);
-    if (za == NULL) {
+    zb = zip_open_from_source(src, flags, &error);
+    if (zb == NULL) {
 	*err = zip_error_code_zip(&error);
 	errno = zip_error_code_system(&error);
 	zip_source_free(src);
@@ -525,7 +525,7 @@
     }
     zip_source_keep(src);
     *srcp = src;
-    return za;
+    return zb;
 }
 
 static int
@@ -555,7 +555,7 @@
 	zip_source_close(src);
 	return -1;
     }
-    if (zip_source_read(src, buf, zst.size) < zst.size) {
+    if (zip_source_read(src, buf, zst.size) < (zip_int64_t)zst.size) {
 	fprintf(stderr, "zip_source_read on buffer failed: %s\n", zip_error_strerror(zip_source_error(src)));
 	zip_source_close(src);
 	free(buf);
@@ -607,7 +607,7 @@
 int
 dispatch(int argc, char *argv[])
 {
-    int i;
+    unsigned int i;
     for (i=0; i<sizeof(dispatch_table)/sizeof(dispatch_table_t); i++) {
 	if (strcmp(dispatch_table[i].cmdline_name, argv[0]) == 0) {
 	    argc--;
@@ -629,9 +629,9 @@
 
 
 void
-usage(const char *prg)
+usage(const char *progname)
 {
-    int i;
+    unsigned int i;
     fprintf(stderr, "usage: %s [-cemnt] archive command1 [args] [command2 [args] ...]\n\n"
 	    "Supported options are:\n"
 	    "\t-c\tcheck consistency\n"
@@ -641,7 +641,7 @@
 	    "\t-n\tcreate archive if it doesn't exist (default)\n"
 	    "\t-r\tprint raw file name encoding without translation (for stat)\n"
 	    "\t-s\tfollow file name convention strictly (for stat)\n"
-	    "\t-t\tdisregard current archive contents, if any\n", prg);
+	    "\t-t\tdisregard current archive contents, if any\n", progname);
     fprintf(stderr, "\nSupported commands and arguments are:\n");
     for (i=0; i<sizeof(dispatch_table)/sizeof(dispatch_table_t); i++) {
 	fprintf(stderr, "\t%s %s -- %s\n", dispatch_table[i].cmdline_name, dispatch_table[i].arg_names, dispatch_table[i].description);
@@ -654,9 +654,10 @@
 main(int argc, char *argv[])
 {
     const char *archive;
-    struct zip_source *zs, *memory_src;
+    struct zip_source *memory_src;
     char buf[100];
-    int c, arg, err, flags, idx, in_memory;
+    int c, arg, err, flags, in_memory;
+    const char *prg;
 
     flags = 0;
     in_memory = 0;
diff --git a/src/zipcmp.c b/src/zipcmp.c
index cba5f75..2d67eed 100644
--- a/src/zipcmp.c
+++ b/src/zipcmp.c
@@ -359,7 +359,7 @@
 	    }
 	    
 	    a->entry[a->nentry].name = strdup(ent->fts_path+prefix_length);
-	    a->entry[a->nentry].size = ent->fts_statp->st_size;
+	    a->entry[a->nentry].size = (zip_uint64_t)ent->fts_statp->st_size;
 	    if ((crc = compute_crc(ent->fts_accpath)) < 0) {
 		fts_close(fts);
 		return -1;
@@ -515,27 +515,29 @@
 ef_read(struct zip *za, zip_uint64_t idx, struct entry *e)
 {
     zip_int16_t n_local, n_central;
-    int i;
+    zip_uint16_t i;
 
     if ((n_local = zip_file_extra_fields_count(za, idx, ZIP_FL_LOCAL)) < 0
         || (n_central = zip_file_extra_fields_count(za, idx, ZIP_FL_CENTRAL)) < 0) {
         return -1;
     }
     
-    e->n_extra_fields = (zip_uint16_t)n_local + (zip_uint16_t)n_central;
+    e->n_extra_fields = (zip_uint16_t)(n_local + n_central);
     
     if ((e->extra_fields=(struct ef *)malloc(sizeof(e->extra_fields[0])*e->n_extra_fields)) == NULL)
 	return -1;
 
     for (i=0; i<n_local; i++) {
 	e->extra_fields[i].name = e->name;
-	if ((e->extra_fields[i].data=zip_file_extra_field_get(za, idx, i, &e->extra_fields[i].id, &e->extra_fields[i].size, ZIP_FL_LOCAL)) == NULL)
+	e->extra_fields[i].data = zip_file_extra_field_get(za, idx, i, &e->extra_fields[i].id, &e->extra_fields[i].size, ZIP_FL_LOCAL);
+	if (e->extra_fields[i].data == NULL)
 	    return -1;
 	e->extra_fields[i].flags = ZIP_FL_LOCAL;
     }
     for (; i<e->n_extra_fields; i++) {
 	e->extra_fields[i].name = e->name;
-	if ((e->extra_fields[i].data=zip_file_extra_field_get(za, idx, i-n_local, &e->extra_fields[i].id, &e->extra_fields[i].size, ZIP_FL_CENTRAL)) == NULL)
+	e->extra_fields[i].data=zip_file_extra_field_get(za, idx, (zip_uint16_t)(i-n_local), &e->extra_fields[i].id, &e->extra_fields[i].size, ZIP_FL_CENTRAL);
+	if (e->extra_fields[i].data == NULL)
 	    return -1;
 	e->extra_fields[i].flags = ZIP_FL_CENTRAL;
     }