Improve internal data structures.  New extra field API (read only).
Added paranoid mode to zipcmp (compare more meta data).

Keep up-to-date metadata for changed entries, avoid parallel arrays.
XXX: Modifying extra fields API functions are stubs.  Old API removed.
diff --git a/lib/zip.h b/lib/zip.h
index 10e2f36..2edec7b 100644
--- a/lib/zip.h
+++ b/lib/zip.h
@@ -71,11 +71,12 @@
 #define ZIP_FL_COMPRESSED	4 /* read compressed data */
 #define ZIP_FL_UNCHANGED	8 /* use original data, ignoring changes */
 #define ZIP_FL_RECOMPRESS      16 /* force recompression of data */
-#define ZIP_FL_ENCRYPTED       32 /* read encrypted data
-				     (implies ZIP_FL_COMPRESSED) */
+#define ZIP_FL_ENCRYPTED       32 /* read encrypted data (implies ZIP_FL_COMPRESSED) */
 #define ZIP_FL_NAME_GUESS       0 /* guess name encoding (is default) */
 #define ZIP_FL_NAME_RAW        64 /* get unmodified name */
 #define ZIP_FL_NAME_STRICT    128 /* follow specification strictly */
+#define ZIP_FL_LOCAL	      256 /* in local header */
+#define ZIP_FL_CENTRAL	      512 /* in central directory */
 
 /* archive global flags flags */
 
@@ -83,6 +84,10 @@
 #define ZIP_AFL_RDONLY		2 /* read only -- cannot be cleared */
 
 
+/* create a new extra field */
+
+#define ZIP_EXTRA_FIELD_NEW	ZIP_UINT16_MAX
+
 /* flags for compression and encryption sources */
 
 #define ZIP_CODEC_DECODE	0 /* decompress/decrypt (encode flag not set) */
@@ -218,6 +223,8 @@
 ZIP_EXTERN int zip_close(struct zip *);
 ZIP_EXTERN void zip_discard(struct zip *);
 ZIP_EXTERN int zip_delete(struct zip *, zip_uint64_t);
+ZIP_EXTERN int zip_delete_file_extra_field(struct zip *, zip_uint64_t, zip_uint32_t, zip_uint16_t);
+ZIP_EXTERN int zip_delete_file_extra_field_by_id(struct zip *, zip_uint64_t, zip_uint32_t, zip_uint16_t, zip_uint16_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);
@@ -239,8 +246,10 @@
 ZIP_EXTERN int zip_get_archive_flag(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_file_extra(struct zip *, zip_uint64_t,
-					  int *, int);
+ZIP_EXTERN const zip_uint8_t *zip_get_file_extra_field(struct zip *, zip_uint64_t, zip_uint32_t, zip_uint16_t, zip_uint16_t *, zip_uint16_t *);
+ZIP_EXTERN const zip_uint8_t *zip_get_file_extra_field_by_id(struct zip *, zip_uint64_t, zip_uint32_t, zip_uint16_t, zip_uint16_t, zip_uint16_t *);
+ZIP_EXTERN zip_int16_t zip_get_file_num_extra_fields(struct zip *, zip_uint64_t, zip_uint32_t);
+ZIP_EXTERN zip_int16_t zip_get_file_num_extra_fields_by_id(struct zip *, zip_uint64_t, zip_uint32_t, zip_uint16_t);
 ZIP_EXTERN const char *zip_get_name(struct zip *, zip_uint64_t, int);
 ZIP_EXTERN zip_uint64_t zip_get_num_entries(struct zip *, int);
 ZIP_EXTERN int zip_get_num_files(struct zip *);  /* deprecated, use zip_get_num_entries instead */
@@ -255,8 +264,7 @@
 				    const char *, int);
 ZIP_EXTERN int zip_set_file_compression(struct zip *, zip_uint64_t,
 					zip_int32_t, zip_uint32_t);
-ZIP_EXTERN int zip_set_file_extra(struct zip *, zip_uint64_t,
-				  const char *, int);
+ZIP_EXTERN int zip_set_file_extra_field(struct zip *, zip_uint64_t, zip_uint32_t, zip_uint16_t, zip_uint16_t, const zip_uint8_t *, zip_uint16_t);
 ZIP_EXTERN struct zip_source *zip_source_buffer(struct zip *, const void *,
 						zip_uint64_t, int);
 ZIP_EXTERN struct zip_source *zip_source_file(struct zip *, const char *,