! [compat] test calls against old API
+ [portability] use _setmode(_fileno(fp), _O_BINARY); where present
+ [bug] _zip_checkcons return value can overflow
+ [bug] _zip_u2d_time: handle localtime(3) failure
+ [bug] missing -Wl,-R in pkg-config file
+ [bug] check/cleanup flags bit 3 (streaming) support
+ [cleanup] use zip_*int*_t internally
- [feature] zip_fdopen (read zip from file descriptor), ZIP_AFL_RDONLY
- [feature] Windows support: (paritally fixed?)
  . better mkstemp replacement function (no getpid; other problems?)
  . snprintf replacement
  . strcasecmp replacement
  . ssize_t define
  . mode_t define
  . dll_export/dll_import support (to clarify)
- [cleanup] remove now useless check of fseek 
- [consistency check] check that local headers come before central dir
- [bug] zip_open: consistency check: check data descriptor
- [bug] do not compress if storing is smaller
- [bug] zip_open: check whether file can be created and fail if not
- [bug] check for limits imposed by format (central dir size, file size, ...)
- [feature] handle zip_open/zip_close "race" for new files
- [feature] support streaming output (creating new archive to e.g. stdout)
- [feature] add functions to:
  . set compression method for new/changed entry
  . set last modification time for entry
  . read/set EAs
  . parse/create some EAs?
  . read/set ASCII file flag
- [test] rename deleted (fails)
- [test] rename file to dir/ and vice versa (fails)
------------------------------------------------ API ideas
struct zip *zip_open_encrypted(const char *path, int flags,
                               const char *password, int *errorp);
void zip_set_default_password(struct zip *archive, const char *password);
(NULL for unsetting)

struct zip_file *zip_fopen_encrypted(struct zip *archive,
                                     const char *fname, int flags,
                                     const char *password);
struct zip_file *zip_fopen_index_encrypted(struct zip *archive,
                                           int index, int flags,
                                           const char *password);

int zip_set_encryption(struct zip *archive, int idx, int method,
                       const char *password);
void zip_set_archive_encryption(struct zip *archive, int encryption_method,
                                const char *password);

struct zip_source *zip_source_writable(struct zip *archive);
zip_source_write(struct zip_source *, const void *data, size_t len);
zip_source_printf(struct zip_source *, const char *fmt, ...);
/* maybe
zip_source_vprintf(struct zip_source *, const char *fmt, va_list ap);
*/
------------------------------------------------ others
* regression tests (duplicate file names, unchange, .{200})
* zip_commit
* zip_replace_zip: allow rewinding
* API for extracting and setting extra fields
* zipcmp: add option for file content comparison
* support for zip64 (large file)

* append to files (for self-extracting files)
* add custom compression function support
* zip_replace_zip: remember compression method, recompress if different speced
* close even if error...
* support for old compression methods?????
------------------------------------------------ regression tests
* (add, replace)
	add to empty zip
	add to existing zip
	add w/ existing file name [E]
	replace ok
	replace w/ illegal index [E]
	replace w/ deleted name [E]
	unchange added/replaced file
* (close)
	copy zip file
	open copy
	rename, delete, replace, add w/ new name, add w/ deleted name
	close
	zipcmp copy expected
	remove copy
* (delete)
* (error_get)
* (error_get_sys_type)
* (error_to_str)
* (file_error_get)
* (file_strerror)
* (fopen_index)
	illegal index
* (get_name)
* (get_num_files)
* (rename)
* (replace)
* (source_buffer)
* (source_file)
* (source_filep)
* (source_free)
* (source_function)
* (source_zip)
* (stat)
* (stat_index)
* (strerror)
* (unchange)
* (unchange_all)
