Replaced the shell script "make_zip_err_str.sh" with CMake

Shell sh is not available at Windows without MinGW/Cygwin.
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index b61a4a1..e409940 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -64,7 +64,6 @@
   zip_dirent.c
   zip_discard.c
   zip_entry.c
-  zip_err_str.c
   zip_error.c
   zip_error_clear.c
   zip_error_get.c
@@ -192,10 +191,40 @@
 
 INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/..)
 
-ADD_CUSTOM_TARGET(update_zip_err_str
-  COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/make_zip_err_str.sh ${CMAKE_CURRENT_SOURCE_DIR}/zip.h ${CMAKE_CURRENT_SOURCE_DIR}/zip_err_str.c
-  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/zip.h ${CMAKE_CURRENT_SOURCE_DIR}/make_zip_err_str.sh
-)
+file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zip.h zip_h)
+string(REGEX MATCHALL "#define ZIP_ER_([A-Z_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z ']*)/" zip_h_err ${zip_h})
+set(zip_err_str [=[
+/*
+   This file was generated automatically by CMake
+   from zip.h; make changes there.
+ */
+
+#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-Z_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z ']*)/" err_t_tt ${errln})
+  string(REGEX MATCH "([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 N ZIP_ET_NONE
+#define S ZIP_ET_SYS
+#define Z ZIP_ET_ZLIB
+
+const int _zip_err_type[] = {
+]=])
+string(APPEND zip_err_str "${zip_err_type}}\;\n")
+file(WRITE ${CMAKE_BINARY_DIR}/zip_err_str.c ${zip_err_str})
+list(APPEND LIBZIP_SOURCES ${CMAKE_BINARY_DIR}/zip_err_str.c)
+
 IF(HAVE_LIBBZ2)
   SET(LIBZIP_OPTIONAL_FILES zip_algorithm_bzip2.c)
 ENDIF()