Improve error string structure.
diff --git a/developer-xcode/zip_err_str.c b/developer-xcode/zip_err_str.c index 09440b8..c9b1504 100644 --- a/developer-xcode/zip_err_str.c +++ b/developer-xcode/zip_err_str.c
@@ -5,89 +5,53 @@ #include "zipint.h" -const char * const _zip_err_str[] = { - "No error", - "Multi-disk zip archives not supported", - "Renaming temporary file failed", - "Closing zip archive failed", - "Seek error", - "Read error", - "Write error", - "CRC error", - "Containing zip archive was 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", - "Premature end of file", - "Invalid argument", - "Not a zip archive", - "Internal error", - "Zip archive inconsistent", - "Can't remove file", - "Entry has been deleted", - "Encryption method not supported", - "Read-only archive", - "No password provided", - "Wrong password provided", - "Operation not supported", - "Resource still in use", - "Tell error", - "Compressed data invalid", - "Operation cancelled", -}; - -const int _zip_nerr_str = sizeof(_zip_err_str)/sizeof(_zip_err_str[0]); - #define L ZIP_ET_LIBZIP #define N ZIP_ET_NONE #define S ZIP_ET_SYS #define Z ZIP_ET_ZLIB -#define E true -#define G false +#define E ZIP_DETAIL_ET_ENTRY +#define G ZIP_DETAIL_ET_GLOBAL -const int _zip_err_type[] = { - N, - N, - S, - S, - S, - S, - S, - N, - N, - N, - N, - S, - S, - Z, - N, - N, - N, - N, - N, - N, - N, - L, - S, - N, - N, - N, - N, - N, - N, - N, - S, - N, - N, +const struct _zip_err_info _zip_err_str[] = { + { N, "No error" }, + { N, "Multi-disk zip archives not supported" }, + { S, "Renaming temporary file failed" }, + { S, "Closing zip archive failed" }, + { S, "Seek error" }, + { S, "Read error" }, + { S, "Write error" }, + { N, "CRC error" }, + { N, "Containing zip archive was closed" }, + { N, "No such file" }, + { N, "File already exists" }, + { S, "Can't open file" }, + { S, "Failure to create temporary file" }, + { Z, "Zlib error" }, + { N, "Malloc failure" }, + { N, "Entry has been changed" }, + { N, "Compression method not supported" }, + { N, "Premature end of file" }, + { N, "Invalid argument" }, + { N, "Not a zip archive" }, + { N, "Internal error" }, + { L, "Zip archive inconsistent" }, + { S, "Can't remove file" }, + { N, "Entry has been deleted" }, + { N, "Encryption method not supported" }, + { N, "Read-only archive" }, + { N, "No password provided" }, + { N, "Wrong password provided" }, + { N, "Operation not supported" }, + { N, "Resource still in use" }, + { S, "Tell error" }, + { N, "Compressed data invalid" }, + { N, "Operation cancelled" }, }; -const struct _zip_err_detail _zip_err_details[] = { +const int _zip_err_str_count = sizeof(_zip_err_str)/sizeof(_zip_err_str[0]); + +const struct _zip_err_info _zip_err_details[] = { { G, "no detail" }, { G, "central directory overlaps EOCD, or there is space between them" }, { G, "archive comment length incorrect" }, @@ -100,6 +64,14 @@ { G, "EOCD64 magic incorrect" }, { G, "EOCD64 and EOCD do not match" }, { G, "invalid value in central directory" }, + { E, "variable size fields overflow header" }, + { E, "invalid UTF-8 in filename" }, + { E, "invalid UTF-8 in comment" }, + { E, "invalid Zip64 extra field" }, + { E, "invalid WinZip AES extra field" }, + { E, "garbage at end of extra fields" }, + { E, "extra field length is invalid" }, + { E, "file length in header doesn't match actual file length" }, }; const int _zip_err_details_count = sizeof(_zip_err_details)/sizeof(_zip_err_details[0]);
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 3d0aa70..4db84f8 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt
@@ -206,34 +206,28 @@ #include "zipint.h" -const char * const _zip_err_str[] = { -]=]) -set(zip_err_type) -foreach(errln ${zip_h_err}) - string(REGEX MATCH "#define ZIP_ER_([A-Z0-9_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z, ']*)/" err_t_tt ${errln}) - string(REGEX MATCH "([L|N|S|Z]+) ([-0-9a-zA-Z,, ']*)" err_t_tt "${CMAKE_MATCH_3}") - string(APPEND zip_err_type " ${CMAKE_MATCH_1},\n") - string(STRIP "${CMAKE_MATCH_2}" err_t_tt) - string(APPEND zip_err_str " \"${err_t_tt}\",\n") -endforeach() -string(APPEND zip_err_str [=[}\; - -const int _zip_nerr_str = sizeof(_zip_err_str)/sizeof(_zip_err_str[0])\; - #define L ZIP_ET_LIBZIP #define N ZIP_ET_NONE #define S ZIP_ET_SYS #define Z ZIP_ET_ZLIB -#define E true -#define G false +#define E ZIP_DETAIL_ET_ENTRY +#define G ZIP_DETAIL_ET_GLOBAL -const int _zip_err_type[] = { +const struct _zip_err_info _zip_err_str[] = { ]=]) -string(APPEND zip_err_str "${zip_err_type}}\;\n") -string(APPEND zip_err_str [=[ +set(zip_err_type) +foreach(errln ${zip_h_err}) + string(REGEX MATCH "#define ZIP_ER_([A-Z0-9_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z, ']*)/" err_t_tt ${errln}) + string(REGEX MATCH "([L|N|S|Z]+) ([-0-9a-zA-Z,, ']*)" err_t_tt "${CMAKE_MATCH_3}") + string(STRIP "${CMAKE_MATCH_2}" err_t_tt) + string(APPEND zip_err_str " { ${CMAKE_MATCH_1}, \"${err_t_tt}\" },\n") +endforeach() +string(APPEND zip_err_str [=[}\; -const struct _zip_err_detail _zip_err_details[] = { +const int _zip_err_str_count = sizeof(_zip_err_str)/sizeof(_zip_err_str[0])\; + +const struct _zip_err_info _zip_err_details[] = { ]=]) foreach(errln ${zipint_h_err}) string(REGEX MATCH "#define ZIP_ER_DETAIL_([A-Z0-9_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z, ']*)/" err_t_tt ${errln})
diff --git a/lib/zip_error.c b/lib/zip_error.c index f639f00..adaa40b 100644 --- a/lib/zip_error.c +++ b/lib/zip_error.c
@@ -81,10 +81,10 @@ ZIP_EXTERN int zip_error_system_type(const zip_error_t *error) { - if (error->zip_err < 0 || error->zip_err >= _zip_nerr_str) + if (error->zip_err < 0 || error->zip_err >= _zip_err_str_count) return ZIP_ET_NONE; - return _zip_err_type[error->zip_err]; + return _zip_err_str[error->zip_err].type; }
diff --git a/lib/zip_error_get_sys_type.c b/lib/zip_error_get_sys_type.c index 3c9998c..86d03cf 100644 --- a/lib/zip_error_get_sys_type.c +++ b/lib/zip_error_get_sys_type.c
@@ -37,8 +37,9 @@ ZIP_EXTERN int zip_error_get_sys_type(int ze) { - if (ze < 0 || ze >= _zip_nerr_str) + if (ze < 0 || ze >= _zip_err_str_count) { return 0; + } - return _zip_err_type[ze]; + return _zip_err_str[ze].type; }
diff --git a/lib/zip_error_strerror.c b/lib/zip_error_strerror.c index 8b07131..7570aaf 100644 --- a/lib/zip_error_strerror.c +++ b/lib/zip_error_strerror.c
@@ -46,16 +46,16 @@ zip_error_fini(err); - if (err->zip_err < 0 || err->zip_err >= _zip_nerr_str) { + if (err->zip_err < 0 || err->zip_err >= _zip_err_str_count) { snprintf(buf, sizeof(buf), "Unknown error %d", err->zip_err); buf[sizeof(buf) - 1] = '\0'; /* make sure string is NUL-terminated */ zip_error_string = NULL; system_error_string = buf; } else { - zip_error_string = _zip_err_str[err->zip_err]; + zip_error_string = _zip_err_str[err->zip_err].description; - switch (_zip_err_type[err->zip_err]) { + switch (_zip_err_str[err->zip_err].type) { case ZIP_ET_SYS: system_error_string = strerror(err->sys_err); break; @@ -76,7 +76,7 @@ buf[sizeof(buf) - 1] = '\0'; /* make sure string is NUL-terminated */ system_error_string = buf; } - else if (_zip_err_details[error].has_index && index < MAX_DETAIL_INDEX) { + else if (_zip_err_details[error].type == ZIP_DETAIL_ET_ENTRY && index < MAX_DETAIL_INDEX) { snprintf(buf, sizeof(buf), "entry %d: %s", index, _zip_err_details[error].description); buf[sizeof(buf) - 1] = '\0'; /* make sure string is NUL-terminated */ system_error_string = buf; @@ -97,7 +97,7 @@ } else { if ((s = (char *)malloc(strlen(system_error_string) + (zip_error_string ? strlen(zip_error_string) + 2 : 0) + 1)) == NULL) { - return _zip_err_str[ZIP_ER_MEMORY]; + return _zip_err_str[ZIP_ER_MEMORY].description; } sprintf(s, "%s%s%s", (zip_error_string ? zip_error_string : ""), (zip_error_string ? ": " : ""), system_error_string);
diff --git a/lib/zip_error_to_str.c b/lib/zip_error_to_str.c index d315b19..70756c0 100644 --- a/lib/zip_error_to_str.c +++ b/lib/zip_error_to_str.c
@@ -44,22 +44,23 @@ zip_error_to_str(char *buf, zip_uint64_t len, int ze, int se) { const char *zs, *ss; - if (ze < 0 || ze >= _zip_nerr_str) + if (ze < 0 || ze >= _zip_err_str_count) { return snprintf(buf, len, "Unknown error %d", ze); + } - zs = _zip_err_str[ze]; + zs = _zip_err_str[ze].description; - switch (_zip_err_type[ze]) { - case ZIP_ET_SYS: - ss = strerror(se); - break; - - case ZIP_ET_ZLIB: - ss = zError(se); - break; - - default: - ss = NULL; + switch (_zip_err_str[ze].type) { + case ZIP_ET_SYS: + ss = strerror(se); + break; + + case ZIP_ET_ZLIB: + ss = zError(se); + break; + + default: + ss = NULL; } return snprintf(buf, len, "%s%s%s", zs, (ss ? ": " : ""), (ss ? ss : ""));
diff --git a/lib/zipint.h b/lib/zipint.h index df7dfa3..ee2a50d 100644 --- a/lib/zipint.h +++ b/lib/zipint.h
@@ -189,12 +189,17 @@ enum zip_les { ZIP_LES_NONE, ZIP_LES_UPPER, ZIP_LES_LOWER, ZIP_LES_INVAL }; -struct _zip_err_detail { - bool has_index; +#define ZIP_DETAIL_ET_GLOBAL 0 +#define ZIP_DETAIL_ET_ENTRY 1 + +struct _zip_err_info { + int type; const char *description; }; -extern const struct _zip_err_detail _zip_err_details[]; +extern const struct _zip_err_info _zip_err_str[]; +extern const int _zip_err_str_count; +extern const struct _zip_err_info _zip_err_details[]; extern const int _zip_err_details_count; /* macros for libzip-internal errors */ @@ -464,10 +469,6 @@ }; typedef struct _zip_pkware_keys zip_pkware_keys_t; -extern const char *const _zip_err_str[]; -extern const int _zip_nerr_str; -extern const int _zip_err_type[]; - #define ZIP_MAX(a, b) ((a) > (b) ? (a) : (b)) #define ZIP_MIN(a, b) ((a) < (b) ? (a) : (b))