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_get_file_comment.c b/lib/zip_get_file_comment.c
index ee71609..a7a586a 100644
--- a/lib/zip_get_file_comment.c
+++ b/lib/zip_get_file_comment.c
@@ -33,8 +33,6 @@
 
 
 
-#include <string.h>
-
 #include "zipint.h"
 
 
@@ -42,53 +40,18 @@
 ZIP_EXTERN const char *
 zip_get_file_comment(struct zip *za, zip_uint64_t idx, int *lenp, int flags)
 {
-    const char *ret;
+    struct zip_dirent *de;
+    zip_uint32_t len;
+    const zip_uint8_t *str;
 
-    if (idx >= za->nentry) {
-	_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+    if ((de=_zip_get_dirent(za, idx, flags, NULL)) == NULL)
 	return NULL;
-    }
 
-    if ((flags & ZIP_FL_UNCHANGED) || (za->entry[idx].changes.valid & ZIP_DIRENT_COMMENT) == 0) {
-	if (za->cdir == NULL) {
-	    _zip_error_set(&za->error, ZIP_ER_NOENT, 0);
-	    return NULL;
-	}
-	if (idx >= za->cdir->nentry) {
-	    _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-	    return NULL;
-	}
-	    
-	if (lenp != NULL)
-	    *lenp = za->cdir->entry[idx].settable.comment_len;
-	ret = za->cdir->entry[idx].settable.comment;
+    if ((str=_zip_string_get(de->comment, &len, flags, &za->error)) == NULL)
+	return NULL;
 
-	if (flags & ZIP_FL_NAME_RAW)
-	    return ret;
+    if (lenp)
+	*lenp = len;
 
-	/* file comment already is UTF-8? */
-	if (za->cdir->entry[idx].bitflags & ZIP_GPBF_ENCODING_UTF_8)
-	    return ret;
-	
-	/* undeclared, start guessing */
-	if (za->cdir->entry[idx].fc_type == ZIP_ENCODING_UNKNOWN)
-	    za->cdir->entry[idx].fc_type = _zip_guess_encoding(ret, za->cdir->entry[idx].settable.comment_len);
-
-	if (((flags & ZIP_FL_NAME_STRICT) && (za->cdir->entry[idx].fc_type != ZIP_ENCODING_ASCII))
-	    || (za->cdir->entry[idx].fc_type == ZIP_ENCODING_CP437)) {
-	    if (za->cdir->entry[idx].comment_converted == NULL)
-		za->cdir->entry[idx].comment_converted = _zip_cp437_to_utf8(ret, za->cdir->entry[idx].settable.comment_len,
-									    &za->cdir->entry[idx].comment_converted_len, &za->error);
-	    ret = za->cdir->entry[idx].comment_converted;
-	    if (lenp != NULL)
-		*lenp = za->cdir->entry[idx].comment_converted_len;
-	}
-
-	return ret;
-    }
-
-    /* already UTF-8, no conversion necessary */
-    if (lenp != NULL)
-	*lenp = za->entry[idx].changes.comment_len;
-    return za->entry[idx].changes.comment;
+    return (const char *)str;
 }