Imported Upstream version 1.0.1 32/94132/1
authorDongHun Kwak <dh0128.kwak@samsung.com>
Thu, 27 Oct 2016 06:25:35 +0000 (15:25 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Thu, 27 Oct 2016 06:25:54 +0000 (15:25 +0900)
Change-Id: I9eb1a5574c4318c7ac05ca633d6ff2a3142721f8
Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
541 files changed:
API-CHANGES [new file with mode: 0644]
AUTHORS
CMakeLists.txt [changed mode: 0755->0644]
LICENSE
Makefile.am
Makefile.in
NEWS
README
THANKS
TODO
aclocal.m4
cmake-config.h.in
cmake-zipconf.h.in
compile
config.guess
config.h.in
config.sub
configure
configure.ac
depcomp
examples/CMakeLists.txt [new file with mode: 0644]
examples/Makefile.am [new file with mode: 0644]
examples/Makefile.in [new file with mode: 0644]
examples/in-memory.c [new file with mode: 0644]
examples/windows-open.c [new file with mode: 0644]
install-sh
lib/CMakeLists.txt
lib/Makefile.am
lib/Makefile.in
lib/make_zip_err_str.sh
lib/make_zipconf.sh
lib/mkstemp.c
lib/zip.h
lib/zip_add.c
lib/zip_add_dir.c
lib/zip_add_entry.c [new file with mode: 0644]
lib/zip_buffer.c [new file with mode: 0644]
lib/zip_close.c
lib/zip_delete.c
lib/zip_dir_add.c [moved from regress/add_dir.c with 57% similarity]
lib/zip_dirent.c
lib/zip_discard.c [moved from lib/zip_free.c with 77% similarity]
lib/zip_entry.c [moved from lib/zip_entry_free.c with 79% similarity]
lib/zip_err_str.c
lib/zip_error.c
lib/zip_error_clear.c
lib/zip_error_get.c
lib/zip_error_get_sys_type.c
lib/zip_error_strerror.c
lib/zip_error_to_str.c
lib/zip_extra_field.c [new file with mode: 0644]
lib/zip_extra_field_api.c [new file with mode: 0644]
lib/zip_fclose.c
lib/zip_fdopen.c
lib/zip_file_add.c [new file with mode: 0644]
lib/zip_file_error_clear.c
lib/zip_file_error_get.c
lib/zip_file_get_comment.c [moved from lib/zip_get_file_extra.c with 74% similarity]
lib/zip_file_get_external_attributes.c [new file with mode: 0644]
lib/zip_file_get_offset.c
lib/zip_file_rename.c [new file with mode: 0644]
lib/zip_file_replace.c [new file with mode: 0644]
lib/zip_file_set_comment.c [new file with mode: 0644]
lib/zip_file_set_external_attributes.c [new file with mode: 0644]
lib/zip_file_set_mtime.c [new file with mode: 0644]
lib/zip_file_strerror.c
lib/zip_filerange_crc.c
lib/zip_fopen.c
lib/zip_fopen_encrypted.c
lib/zip_fopen_index.c
lib/zip_fopen_index_encrypted.c
lib/zip_fread.c
lib/zip_get_archive_comment.c
lib/zip_get_archive_flag.c
lib/zip_get_compression_implementation.c
lib/zip_get_encryption_implementation.c
lib/zip_get_file_comment.c
lib/zip_get_name.c
lib/zip_get_num_entries.c
lib/zip_get_num_files.c
lib/zip_io_util.c [new file with mode: 0644]
lib/zip_memdup.c
lib/zip_name_locate.c
lib/zip_new.c
lib/zip_open.c
lib/zip_rename.c
lib/zip_replace.c
lib/zip_set_archive_comment.c
lib/zip_set_archive_flag.c
lib/zip_set_default_password.c
lib/zip_set_file_comment.c
lib/zip_set_file_compression.c [moved from lib/zip_entry_new.c with 53% similarity]
lib/zip_set_name.c
lib/zip_source_begin_write.c [moved from lib/zip_source_pop.c with 74% similarity]
lib/zip_source_buffer.c
lib/zip_source_call.c [new file with mode: 0644]
lib/zip_source_close.c
lib/zip_source_commit_write.c [moved from lib/zip_set_file_extra.c with 69% similarity]
lib/zip_source_crc.c
lib/zip_source_deflate.c
lib/zip_source_error.c
lib/zip_source_file.c
lib/zip_source_filep.c
lib/zip_source_free.c
lib/zip_source_function.c
lib/zip_source_is_deleted.c [new file with mode: 0644]
lib/zip_source_layered.c
lib/zip_source_open.c
lib/zip_source_pkware.c
lib/zip_source_read.c
lib/zip_source_remove.c [new file with mode: 0644]
lib/zip_source_rollback_write.c [new file with mode: 0644]
lib/zip_source_seek.c [moved from regress/add_from_file.c with 50% similarity]
lib/zip_source_seek_write.c [new file with mode: 0644]
lib/zip_source_stat.c
lib/zip_source_supports.c [new file with mode: 0644]
lib/zip_source_tell.c [new file with mode: 0644]
lib/zip_source_tell_write.c [new file with mode: 0644]
lib/zip_source_win32a.c [new file with mode: 0644]
lib/zip_source_win32handle.c [new file with mode: 0644]
lib/zip_source_win32utf8.c [new file with mode: 0644]
lib/zip_source_win32w.c [new file with mode: 0644]
lib/zip_source_window.c [new file with mode: 0644]
lib/zip_source_write.c [new file with mode: 0644]
lib/zip_source_zip.c
lib/zip_source_zip_new.c [new file with mode: 0644]
lib/zip_stat.c
lib/zip_stat_index.c
lib/zip_stat_init.c
lib/zip_strerror.c
lib/zip_string.c [new file with mode: 0644]
lib/zip_unchange.c
lib/zip_unchange_all.c
lib/zip_unchange_archive.c
lib/zip_unchange_data.c
lib/zip_utf-8.c [new file with mode: 0644]
lib/zipint.h
lib/zipwin32.h [new file with mode: 0644]
libzip.pc.in
ltmain.sh [changed mode: 0755->0644]
m4/.empty [new file with mode: 0644]
m4/libtool.m4
m4/ltoptions.m4
m4/ltversion.m4
m4/lt~obsolete.m4
m4/visibility.m4 [new file with mode: 0644]
man/CMakeLists.txt
man/Makefile.am
man/Makefile.in
man/ZIP_SOURCE_GET_ARGS.man [new file with mode: 0644]
man/ZIP_SOURCE_GET_ARGS.mdoc [new file with mode: 0644]
man/handle_links [new file with mode: 0755]
man/libzip.man
man/libzip.mdoc
man/links [new file with mode: 0644]
man/zip_add.man
man/zip_add.mdoc
man/zip_add_dir.man
man/zip_add_dir.mdoc
man/zip_close.man
man/zip_close.mdoc
man/zip_delete.man
man/zip_delete.mdoc
man/zip_dir_add.man [new file with mode: 0644]
man/zip_dir_add.mdoc [new file with mode: 0644]
man/zip_discard.man [new file with mode: 0644]
man/zip_discard.mdoc [new file with mode: 0644]
man/zip_error_clear.man
man/zip_error_clear.mdoc
man/zip_error_code_system.man [new file with mode: 0644]
man/zip_error_code_system.mdoc [new file with mode: 0644]
man/zip_error_code_zip.man [new file with mode: 0644]
man/zip_error_code_zip.mdoc [new file with mode: 0644]
man/zip_error_fini.man [new file with mode: 0644]
man/zip_error_fini.mdoc [new file with mode: 0644]
man/zip_error_get.man
man/zip_error_get.mdoc
man/zip_error_get_sys_type.man
man/zip_error_get_sys_type.mdoc
man/zip_error_init.man [new file with mode: 0644]
man/zip_error_init.mdoc [moved from man/ziptorrent.man with 61% similarity]
man/zip_error_set.man [new file with mode: 0644]
man/zip_error_set.mdoc [new file with mode: 0644]
man/zip_error_strerror.man [new file with mode: 0644]
man/zip_error_strerror.mdoc [new file with mode: 0644]
man/zip_error_system_type.man [new file with mode: 0644]
man/zip_error_system_type.mdoc [new file with mode: 0644]
man/zip_error_to_data.man [new file with mode: 0644]
man/zip_error_to_data.mdoc [new file with mode: 0644]
man/zip_error_to_str.man
man/zip_error_to_str.mdoc
man/zip_errors.man
man/zip_errors.mdoc
man/zip_fclose.man
man/zip_fclose.mdoc
man/zip_fdopen.man
man/zip_fdopen.mdoc
man/zip_file_add.man [new file with mode: 0644]
man/zip_file_add.mdoc [new file with mode: 0644]
man/zip_file_extra_field_delete.man [new file with mode: 0644]
man/zip_file_extra_field_delete.mdoc [new file with mode: 0644]
man/zip_file_extra_field_get.man [new file with mode: 0644]
man/zip_file_extra_field_get.mdoc [new file with mode: 0644]
man/zip_file_extra_field_set.man [new file with mode: 0644]
man/zip_file_extra_field_set.mdoc [new file with mode: 0644]
man/zip_file_extra_fields_count.man [new file with mode: 0644]
man/zip_file_extra_fields_count.mdoc [new file with mode: 0644]
man/zip_file_get_comment.man [new file with mode: 0644]
man/zip_file_get_comment.mdoc [moved from man/zip_get_file_extra.man with 50% similarity]
man/zip_file_get_error.man [new file with mode: 0644]
man/zip_file_get_error.mdoc [new file with mode: 0644]
man/zip_file_get_external_attributes.man [new file with mode: 0644]
man/zip_file_get_external_attributes.mdoc [new file with mode: 0644]
man/zip_file_rename.man [new file with mode: 0644]
man/zip_file_rename.mdoc [new file with mode: 0644]
man/zip_file_set_comment.man [new file with mode: 0644]
man/zip_file_set_comment.mdoc [new file with mode: 0644]
man/zip_file_set_external_attributes.man [new file with mode: 0644]
man/zip_file_set_external_attributes.mdoc [moved from man/zip_get_file_extra.mdoc with 64% similarity]
man/zip_file_set_mtime.man [new file with mode: 0644]
man/zip_file_set_mtime.mdoc [moved from man/zip_set_file_extra.mdoc with 73% similarity]
man/zip_file_strerror.man
man/zip_file_strerror.mdoc
man/zip_fopen.man
man/zip_fopen.mdoc
man/zip_fopen_encrypted.man
man/zip_fopen_encrypted.mdoc
man/zip_fread.man
man/zip_fread.mdoc
man/zip_get_archive_comment.man
man/zip_get_archive_comment.mdoc
man/zip_get_archive_flag.man
man/zip_get_archive_flag.mdoc
man/zip_get_error.man [new file with mode: 0644]
man/zip_get_error.mdoc [moved from man/ziptorrent.mdoc with 64% similarity]
man/zip_get_file_comment.man
man/zip_get_file_comment.mdoc
man/zip_get_name.man
man/zip_get_name.mdoc
man/zip_get_num_entries.man
man/zip_get_num_entries.mdoc
man/zip_get_num_files.man
man/zip_get_num_files.mdoc
man/zip_name_locate.man
man/zip_name_locate.mdoc
man/zip_open.man
man/zip_open.mdoc
man/zip_rename.man
man/zip_rename.mdoc
man/zip_set_archive_comment.man
man/zip_set_archive_comment.mdoc
man/zip_set_archive_flag.man
man/zip_set_archive_flag.mdoc
man/zip_set_default_password.man
man/zip_set_default_password.mdoc
man/zip_set_file_comment.man
man/zip_set_file_comment.mdoc
man/zip_set_file_compression.man [new file with mode: 0644]
man/zip_set_file_compression.mdoc [new file with mode: 0644]
man/zip_source.man [new file with mode: 0644]
man/zip_source.mdoc [new file with mode: 0644]
man/zip_source_begin_write.man [new file with mode: 0644]
man/zip_source_begin_write.mdoc [new file with mode: 0644]
man/zip_source_buffer.man
man/zip_source_buffer.mdoc
man/zip_source_close.man [new file with mode: 0644]
man/zip_source_close.mdoc [moved from man/zip_set_file_extra.man with 59% similarity]
man/zip_source_commit_write.man [new file with mode: 0644]
man/zip_source_commit_write.mdoc [new file with mode: 0644]
man/zip_source_error.man [new file with mode: 0644]
man/zip_source_error.mdoc [new file with mode: 0644]
man/zip_source_file.man
man/zip_source_file.mdoc
man/zip_source_filep.man
man/zip_source_filep.mdoc
man/zip_source_free.man
man/zip_source_free.mdoc
man/zip_source_function.man
man/zip_source_function.mdoc
man/zip_source_is_deleted.man [new file with mode: 0644]
man/zip_source_is_deleted.mdoc [new file with mode: 0644]
man/zip_source_keep.man [new file with mode: 0644]
man/zip_source_keep.mdoc [new file with mode: 0644]
man/zip_source_make_command_bitmap.man [new file with mode: 0644]
man/zip_source_make_command_bitmap.mdoc [new file with mode: 0644]
man/zip_source_open.man [new file with mode: 0644]
man/zip_source_open.mdoc [new file with mode: 0644]
man/zip_source_read.man [new file with mode: 0644]
man/zip_source_read.mdoc [new file with mode: 0644]
man/zip_source_rollback_write.man [new file with mode: 0644]
man/zip_source_rollback_write.mdoc [new file with mode: 0644]
man/zip_source_seek.man [new file with mode: 0644]
man/zip_source_seek.mdoc [new file with mode: 0644]
man/zip_source_seek_compute_offset.man [new file with mode: 0644]
man/zip_source_seek_compute_offset.mdoc [new file with mode: 0644]
man/zip_source_seek_write.man [new file with mode: 0644]
man/zip_source_seek_write.mdoc [new file with mode: 0644]
man/zip_source_stat.man [new file with mode: 0644]
man/zip_source_stat.mdoc [new file with mode: 0644]
man/zip_source_tell.man [new file with mode: 0644]
man/zip_source_tell.mdoc [new file with mode: 0644]
man/zip_source_tell_write.man [new file with mode: 0644]
man/zip_source_tell_write.mdoc [new file with mode: 0644]
man/zip_source_win32a.man [new file with mode: 0644]
man/zip_source_win32a.mdoc [new file with mode: 0644]
man/zip_source_win32handle.man [new file with mode: 0644]
man/zip_source_win32handle.mdoc [new file with mode: 0644]
man/zip_source_win32w.man [new file with mode: 0644]
man/zip_source_win32w.mdoc [new file with mode: 0644]
man/zip_source_write.man [new file with mode: 0644]
man/zip_source_write.mdoc [new file with mode: 0644]
man/zip_source_zip.man
man/zip_source_zip.mdoc
man/zip_stat.man
man/zip_stat.mdoc
man/zip_stat_init.man
man/zip_stat_init.mdoc
man/zip_unchange.man
man/zip_unchange.mdoc
man/zip_unchange_all.man
man/zip_unchange_all.mdoc
man/zip_unchange_archive.man
man/zip_unchange_archive.mdoc
man/zipcmp.man
man/zipcmp.mdoc
man/zipmerge.man
man/zipmerge.mdoc
missing
mkinstalldirs [deleted file]
regress/CMakeLists.txt
regress/Makefile.am
regress/Makefile.in
regress/NiHTest.pm [new file with mode: 0644]
regress/add_dir.test
regress/add_from_buffer.test
regress/add_from_file.test
regress/add_from_file_duplicate.test [new file with mode: 0644]
regress/add_from_file_twice_duplicate.test [new file with mode: 0644]
regress/add_from_filep.c
regress/add_from_stdin.test [new file with mode: 0644]
regress/add_from_zip.c [deleted file]
regress/add_from_zip.test [deleted file]
regress/add_from_zip_closed.test [new file with mode: 0644]
regress/add_from_zip_deflated.test [new file with mode: 0644]
regress/add_from_zip_deflated2.test [new file with mode: 0644]
regress/add_from_zip_partial_deflated.test [new file with mode: 0644]
regress/add_from_zip_partial_stored.test [new file with mode: 0644]
regress/add_from_zip_stored.test [new file with mode: 0644]
regress/add_stored.test [new file with mode: 0644]
regress/add_stored_in_memory.test [new file with mode: 0644]
regress/bigstored.zh [new file with mode: 0644]
regress/bigzero-zip.zip [new file with mode: 0644]
regress/bogus.zip [new file with mode: 0644]
regress/cm-default.zip [new file with mode: 0644]
regress/delete_add_same.test [new file with mode: 0644]
regress/delete_invalid.test [new file with mode: 0644]
regress/delete_last.test [new file with mode: 0644]
regress/delete_multiple_last.test [new file with mode: 0644]
regress/delete_multiple_partial.test [new file with mode: 0644]
regress/delete_renamed_rename.test [new file with mode: 0644]
regress/deltest.c [deleted file]
regress/encrypt.c [deleted file]
regress/encrypt.test
regress/encrypt_plus_extra.zip [new file with mode: 0644]
regress/encrypt_plus_extra_modified_c.zip [new file with mode: 0644]
regress/encrypt_plus_extra_modified_l.zip [new file with mode: 0644]
regress/extra_add.test [new file with mode: 0644]
regress/extra_add_multiple.test [new file with mode: 0644]
regress/extra_count.test [new file with mode: 0644]
regress/extra_count_by_id.test [new file with mode: 0644]
regress/extra_count_ignore_zip64.test [new file with mode: 0644]
regress/extra_delete.test [new file with mode: 0644]
regress/extra_delete_by_id.test [new file with mode: 0644]
regress/extra_get.test [new file with mode: 0644]
regress/extra_get_by_id.test [new file with mode: 0644]
regress/extra_set.test [new file with mode: 0644]
regress/extra_set_modify_c.test [new file with mode: 0644]
regress/extra_set_modify_l.test [new file with mode: 0644]
regress/file_comment_encmismatch.test [new file with mode: 0644]
regress/filename_duplicate.zip [new file with mode: 0644]
regress/filename_duplicate_empty.zip [new file with mode: 0644]
regress/filename_empty.zip [new file with mode: 0644]
regress/fileorder.zip [new file with mode: 0644]
regress/firstsecond-split-deflated.zip [new file with mode: 0644]
regress/firstsecond-split-stored.zip [new file with mode: 0644]
regress/firstsecond.zip [new file with mode: 0644]
regress/foo-stored.zip [new file with mode: 0644]
regress/fopen_unchanged.c [moved from regress/add_from_buffer.c with 69% similarity]
regress/fopen_unchanged.test [new file with mode: 0644]
regress/fread.c
regress/get_comment.c [deleted file]
regress/get_comment.test
regress/hole.c [new file with mode: 0644]
regress/incons-archive-comment-longer.zip [new file with mode: 0644]
regress/incons-archive-comment-shorter.zip [new file with mode: 0644]
regress/incons-cdoffset.zip [new file with mode: 0644]
regress/incons-central-compression-method.zip [new file with mode: 0644]
regress/incons-central-compsize-larger-toolarge.zip [new file with mode: 0644]
regress/incons-central-compsize-larger.zip [new file with mode: 0644]
regress/incons-central-compsize-smaller.zip [new file with mode: 0644]
regress/incons-central-crc.zip [new file with mode: 0644]
regress/incons-central-date.zip [new file with mode: 0644]
regress/incons-central-file-comment-longer.zip [new file with mode: 0644]
regress/incons-central-file-comment-shorter.zip [new file with mode: 0644]
regress/incons-central-magic-bad.zip [new file with mode: 0644]
regress/incons-central-magic-bad2.zip [new file with mode: 0644]
regress/incons-central-size-larger.zip [new file with mode: 0644]
regress/incons-data.zip [new file with mode: 0644]
regress/incons-ef-central-size-wrong.zip [new file with mode: 0644]
regress/incons-ef-local-id-size.zip [new file with mode: 0644]
regress/incons-ef-local-id.zip [new file with mode: 0644]
regress/incons-ef-local-incomplete1.zip [new file with mode: 0644]
regress/incons-ef-local-incomplete2.zip [new file with mode: 0644]
regress/incons-ef-local-incomplete3.zip [new file with mode: 0644]
regress/incons-ef-local-incomplete4.zip [new file with mode: 0644]
regress/incons-ef-local-size.zip [new file with mode: 0644]
regress/incons-eocd-magic-bad.zip [new file with mode: 0644]
regress/incons-file-count-high.zip [new file with mode: 0644]
regress/incons-file-count-low.zip [new file with mode: 0644]
regress/incons-file-count-overflow.zip [new file with mode: 0644]
regress/incons-local-compression-method.zip [new file with mode: 0644]
regress/incons-local-compsize-larger.zip [new file with mode: 0644]
regress/incons-local-compsize-smaller.zip [new file with mode: 0644]
regress/incons-local-crc.zip [new file with mode: 0644]
regress/incons-local-filename-long.zip [new file with mode: 0644]
regress/incons-local-filename-missing.zip [new file with mode: 0644]
regress/incons-local-filename-short.zip [new file with mode: 0644]
regress/incons-local-filename.zip [new file with mode: 0644]
regress/incons-local-magic-bad.zip [new file with mode: 0644]
regress/incons-local-size-larger.zip [new file with mode: 0644]
regress/large-uncompressable [new file with mode: 0644]
regress/manyfiles-zip.zip [new file with mode: 0644]
regress/manyfiles.zip [deleted file]
regress/modify.c [new file with mode: 0644]
regress/name_locate.c [deleted file]
regress/name_locate.test
regress/open_cons_extrabytes.test [new file with mode: 0644]
regress/open_empty.test [new file with mode: 0644]
regress/open_empty_2.test [new file with mode: 0644]
regress/open_extrabytes.test [new file with mode: 0644]
regress/open_file_count.test [new file with mode: 0644]
regress/open_filename_duplicate.test [new file with mode: 0644]
regress/open_filename_duplicate_consistency.test [new file with mode: 0644]
regress/open_filename_duplicate_empty.test [new file with mode: 0644]
regress/open_filename_duplicate_empty_consistency.test [new file with mode: 0644]
regress/open_filename_empty.test [new file with mode: 0644]
regress/open_incons.test [new file with mode: 0644]
regress/open_many_ok.test
regress/open_new_but_exists.test
regress/open_new_ok.test
regress/open_nonarchive.test
regress/open_nosuchfile.test
regress/open_ok.test
regress/open_too_short.test [new file with mode: 0644]
regress/open_truncate.test [new file with mode: 0644]
regress/open_zip64_ok.test [new file with mode: 0644]
regress/rename_ascii.test [new file with mode: 0644]
regress/rename_cp437.test [new file with mode: 0644]
regress/rename_deleted.test [new file with mode: 0644]
regress/rename_fail.test [new file with mode: 0644]
regress/rename_ok.test [new file with mode: 0644]
regress/rename_ok.zip [new file with mode: 0644]
regress/rename_utf8.test [new file with mode: 0644]
regress/rename_utf8_encmismatch.test [new file with mode: 0644]
regress/runtest [deleted file]
regress/runtest.in [new file with mode: 0755]
regress/set_comment_all.c [deleted file]
regress/set_comment_all.test
regress/set_comment_localonly.c [deleted file]
regress/set_comment_localonly.test
regress/set_comment_removeglobal.c [deleted file]
regress/set_comment_removeglobal.test
regress/set_comment_revert.c [deleted file]
regress/set_comment_revert.test
regress/set_compression_deflate_to_deflate.test [new file with mode: 0644]
regress/set_compression_deflate_to_store.test [new file with mode: 0644]
regress/set_compression_store_to_deflate.test [new file with mode: 0644]
regress/set_compression_store_to_store.test [new file with mode: 0644]
regress/set_compression_unknown.test [new file with mode: 0644]
regress/source_hole.c [new file with mode: 0644]
regress/stat_index_cp437_guess.test [new file with mode: 0644]
regress/stat_index_cp437_raw.test [new file with mode: 0644]
regress/stat_index_cp437_strict.test [new file with mode: 0644]
regress/stat_index_fileorder.test [new file with mode: 0644]
regress/stat_index_streamed.test [new file with mode: 0644]
regress/stat_index_streamed_zip64.test [new file with mode: 0644]
regress/stat_index_utf8_guess.test [new file with mode: 0644]
regress/stat_index_utf8_raw.test [new file with mode: 0644]
regress/stat_index_utf8_strict.test [new file with mode: 0644]
regress/stat_index_utf8_unmarked_strict.test [new file with mode: 0644]
regress/stat_index_zip64.test [new file with mode: 0644]
regress/streamed-zip64.zip [new file with mode: 0644]
regress/streamed.zip [new file with mode: 0644]
regress/test-cp437-comment-utf-8.zip [new file with mode: 0644]
regress/test-cp437-fc-utf-8-filename.zip [new file with mode: 0644]
regress/test-cp437-fc.zip [new file with mode: 0644]
regress/test-cp437.zip [new file with mode: 0644]
regress/test-utf8-unmarked.zip [new file with mode: 0644]
regress/test-utf8.zip [new file with mode: 0644]
regress/test2.zip [new file with mode: 0644]
regress/testbuffer.zip
regress/testcomment13.zip [new file with mode: 0644]
regress/testdeflated.zip [new file with mode: 0644]
regress/testdeflated2.zip [new file with mode: 0644]
regress/testdir.zip
regress/testempty.zip [new file with mode: 0644]
regress/testextrabytes.zip [new file with mode: 0644]
regress/testfile-UTF8.zip [new file with mode: 0644]
regress/testfile-cp437.zip [new file with mode: 0644]
regress/testfile-plus-extra.zip [new file with mode: 0644]
regress/testfile.txt [changed mode: 0644->0755]
regress/testfile.zip
regress/testfile2014.zip [new file with mode: 0644]
regress/testnottorrent.zip [deleted file]
regress/teststdin.zip [new file with mode: 0644]
regress/teststored.zip
regress/testtorrent.tzip [deleted file]
regress/torrent-already.test [deleted file]
regress/torrent-new.test [deleted file]
regress/tryopen.c
regress/utf-8-standardization-input.zip [new file with mode: 0644]
regress/utf-8-standardization-output.zip [new file with mode: 0644]
regress/utf-8-standardization.test [new file with mode: 0644]
regress/zip64.zip [new file with mode: 0644]
regress/zip64_creation.test [new file with mode: 0644]
regress/zip64_stored_creation.test [new file with mode: 0644]
regress/ziptest.c [deleted file]
src/CMakeLists.txt
src/Makefile.am
src/Makefile.in
src/compat.h [new file with mode: 0644]
src/zipcmp.c
src/zipmerge.c
src/ziptorrent.c [deleted file]
test-driver [new file with mode: 0755]
xcode/Info.plist [new file with mode: 0644]
xcode/config.h [new file with mode: 0644]
xcode/extract-version.sh [new file with mode: 0755]
xcode/libzip.xcodeproj/project.pbxproj [new file with mode: 0644]
xcode/libzip.xcodeproj/project.xcworkspace/contents.xcworkspacedata [new file with mode: 0644]
xcode/zipconf.h [moved from lib/zipconf.h with 93% similarity]

diff --git a/API-CHANGES b/API-CHANGES
new file mode 100644 (file)
index 0000000..a83b183
--- /dev/null
@@ -0,0 +1,159 @@
+* libzip API changes
+
+This file describes changes in the libzip API and how to adapt your
+code for them.
+
+You can define ZIP_DISABLE_DEPRECATED before including <zip.h> to hide
+prototypes for deprecated functions, to find out about functions that
+might be removed at some point.
+
+* 1.0
+
+** new type zip_error_t
+
+Error information is stored in the newly public type zip_error_t. Use
+this to access information about an error, instead of the deprecated
+functions that operated on two ints.
+
+deprecated functions: zip_error_get_sys_type(), zip_error_get(),
+zip_error_to_str(), zip_file_error_get()
+
+See their man pages for instructions on how to replace them.
+
+The most common affected use is zip_open. The new recommended usage
+is:
+
+int err;
+if ((za = zip_open(archive, flags, &err)) == NULL) {
+       zip_error_t error;
+       zip_error_init_with_code(&error, err);
+       fprintf(stderr, "can't open zip archive '%s': %s\n", archive, zip_error_strerror(&error));
+       zip_error_fini(&error);
+}
+
+** more typedefs
+
+The following typedefs have been added for better readability:
+
+typedef struct zip zip_t;
+typedef struct zip_file zip_file_t;
+typedef struct zip_source zip_source_t;
+typedef struct zip_stat zip_stat_t;
+
+This means you can use "zip_t" instead of "struct zip", etc.
+
+
+** torrentzip support removed
+
+torrentzip depends on a particular zlib version which is by now quite
+old.
+
+* 0.11
+
+** new type zip_flags_t
+
+The functions which have flags now use the zip_flags_t type for this.
+All old flags fit; you need code only to adapt if you were saving flags in a
+local variable. Use zip_flags_t for such a variable.
+This affects:
+zip_fopen()
+zip_fopen_encrypted()
+zip_fopen_index()
+zip_fopen_index_encrypted()
+zip_get_archive_comment()
+zip_get_archive_flag()
+zip_get_num_entries()
+zip_get_name()
+zip_name_locate()
+zip_set_archive_flag()
+zip_source_zip()
+zip_stat()
+zip_stat_index()
+
+*** ZIP_FL_*, ZIP_AFL_*, ZIP_STAT_* are now unsigned constants
+
+To match the new zip_flags_t type.
+
+*** zip_add(), zip_add_dir()
+
+These functions were replaced with zip_file_add() and zip_dir_add(), respectively,
+to add a flags argument.
+
+*** zip_rename(), zip_replace()
+
+These functions were replaced with zip_file_rename() and zip_file_replace(),
+respectively, to add a flags argument.
+
+*** zip_get_file_comment()
+
+This function was replaced with zip_file_get_comment(); one argument was promoted from
+int to zip_uint32_t, the other is now a zip_flags_t.
+
+*** zip_set_file_comment()
+
+This function was replaced with zip_file_set_comment(); an argument was promoted from
+int to zip_uint16_t, and a zip_flags_t argument was added.
+
+** integer type size changes
+
+Some argument and return values were not the right size or sign.
+
+*** zip_name_locate()
+
+The return value was int, which can be too small. The function now returns zip_int64_t.
+
+
+*** zip_get_num_entries()
+
+The return type is now signed, to allow signaling errors.
+
+*** zip_set_archive_comment()
+
+The last argument changed from int to zip_uint16_t.
+
+** extra field handling rewritten
+
+The zip_get_file_extra() and zip_set_file_extra() functions were removed.
+They only worked on the whole extra field set.
+
+Instead, you can now set, get, count, and delete each extra field separately,
+using the functions:
+zip_file_extra_field_delete()
+zip_file_extra_field_delete_by_id()
+zip_file_extra_field_get()
+zip_file_extra_field_get_by_id()
+zip_file_extra_fields_count()
+zip_file_extra_fields_count_by_id()
+zip_file_extra_field_set()
+Please read the corresponding man pages for details.
+
+** new functions
+
+*** zip_discard()
+
+The new zip_discard() function closes an archive without committing the
+scheduled changes.
+
+*** zip_set_file_compression()
+
+The new zip_set_file_compression() function allows setting compression
+levels for files.
+
+** argument changes
+
+*** file names
+
+File names arguments are now allowed to be NULL to have an empty file name.
+This mostly affects zip_file_add(), zip_dir_add(), and zip_file_rename().
+
+For zip_get_name(), zip_file_get_comment(), and zip_get_archive_comment(), if
+the file name or comment is empty, a string of length 0 is returned.
+NULL is returned for errors only.
+
+Previously, NULL was returned for empty/unset file names and comments and
+errors, leaving no way to differentiate between the two.
+
+/* Local Variables:  */
+/* mode: org         */
+/* End:              */
+
diff --git a/AUTHORS b/AUTHORS
index ec415c1..a33707b 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,2 +1,2 @@
-Dieter Baron <dillo@giga.or.at>
-Thomas Klausner <tk@giga.or.at>
\ No newline at end of file
+Dieter Baron <dillo@nih.at>
+Thomas Klausner <tk@giga.or.at>
old mode 100755 (executable)
new mode 100644 (file)
index 50bc082..77ea634
@@ -1,9 +1,8 @@
-# XXX: TODO
+# TODO:
 # 1. pkgconfig file not yet built.
 # 2. installation not tested.
 # 3. Problems generating html pages.
-# 4. distribution tarball not checked for unwanted/missing content.
-# 5. create usable libtool .la file
+# 4. create usable libtool .la file
 
 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
 
@@ -15,21 +14,26 @@ INCLUDE(CheckSymbolExists)
 INCLUDE(CheckTypeSize)
 INCLUDE(CheckCSourceRuns)
 INCLUDE(CheckCSourceCompiles)
+INCLUDE(CheckStructHasMember)
 
 SET(PACKAGE "libzip")
 SET(PACKAGE_NAME ${PACKAGE})
-SET(PACKAGE_VERSION_MAJOR "0")
-SET(PACKAGE_VERSION_MINOR "10")
+SET(PACKAGE_VERSION_MAJOR "1")
+SET(PACKAGE_VERSION_MINOR "0")
 SET(PACKAGE_VERSION_PATCH "1")
+#SET(VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}")
 SET(VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}.${PACKAGE_VERSION_PATCH}")
 SET(PACKAGE_VERSION ${VERSION})
 SET(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
 
 # Checks
 
+CHECK_FUNCTION_EXISTS(_close HAVE__CLOSE)
+CHECK_FUNCTION_EXISTS(_dup HAVE__DUP)
+CHECK_FUNCTION_EXISTS(_fdopen HAVE__FDOPEN)
+CHECK_FUNCTION_EXISTS(_fileno HAVE__FILENO)
 CHECK_FUNCTION_EXISTS(_open HAVE__OPEN)
 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
-CHECK_FUNCTION_EXISTS(_strcmpi HAVE__STRCMPI)
 CHECK_FUNCTION_EXISTS(_strdup HAVE__STRDUP)
 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
 CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO)
@@ -39,88 +43,59 @@ CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP)
 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
 CHECK_FUNCTION_EXISTS(strdup HAVE_STRDUP)
+
 CHECK_SYMBOL_EXISTS(MoveFileExA windows.h HAVE_MOVEFILEEXA)
+
+CHECK_INCLUDE_FILES(fts.h HAVE_FTS_H)
+CHECK_INCLUDE_FILES(stdbool.h HAVE_STDBOOL_H)
+CHECK_INCLUDE_FILES(strings.h HAVE_STRINGS_H)
 CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H)
 
-CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H_LIBZIP)
 CHECK_INCLUDE_FILES(inttypes.h HAVE_INTTYPES_H_LIBZIP)
 CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H_LIBZIP)
+CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H_LIBZIP)
+
+CHECK_TYPE_SIZE(__int8 __INT8_LIBZIP)
 CHECK_TYPE_SIZE(int8_t INT8_T_LIBZIP)
 CHECK_TYPE_SIZE(uint8_t UINT8_T_LIBZIP)
+CHECK_TYPE_SIZE(__int16 __INT16_LIBZIP)
 CHECK_TYPE_SIZE(int16_t INT16_T_LIBZIP)
 CHECK_TYPE_SIZE(uint16_t UINT16_T_LIBZIP)
+CHECK_TYPE_SIZE(__int32 __INT32_LIBZIP)
 CHECK_TYPE_SIZE(int32_t INT32_T_LIBZIP)
 CHECK_TYPE_SIZE(uint32_t UINT32_T_LIBZIP)
+CHECK_TYPE_SIZE(__int64 __INT64_LIBZIP)
 CHECK_TYPE_SIZE(int64_t INT64_T_LIBZIP)
 CHECK_TYPE_SIZE(uint64_t UINT64_T_LIBZIP)
 CHECK_TYPE_SIZE("short" SHORT_LIBZIP)
 CHECK_TYPE_SIZE("int" INT_LIBZIP)
 CHECK_TYPE_SIZE("long" LONG_LIBZIP)
-CHECK_TYPE_SIZE("long long" LONGLONG_LIBZIP)
+CHECK_TYPE_SIZE("long long" LONG_LONG_LIBZIP)
+CHECK_TYPE_SIZE("off_t" SIZEOF_OFF_T)
+CHECK_TYPE_SIZE("size_t" SIZE_T_LIBZIP)
+CHECK_TYPE_SIZE("ssize_t" SSIZE_T_LIBZIP)
 
 FIND_PACKAGE(ZLIB REQUIRED)
 INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
 set(CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIR})
-CHECK_SYMBOL_EXISTS(ZEXPORT zlib.h HAVE_ZEXPORT)
-IF(NOT HAVE_ZEXPORT)
+IF(ZLIB_VERSION_STRING VERSION_LESS "1.1.2")
   MESSAGE(FATAL_ERROR "-- ZLIB version too old, please install at least v1.1.2")
-ENDIF(NOT HAVE_ZEXPORT)
+ENDIF(ZLIB_VERSION_STRING VERSION_LESS "1.1.2")
+
+IF(MSVC)
+ADD_DEFINITIONS("-D_CRT_SECURE_NO_WARNINGS")
+ENDIF(MSVC)
+
+ADD_DEFINITIONS("-DHAVE_CONFIG_H")
 
 # Targets
 ADD_SUBDIRECTORY(lib)
 ADD_SUBDIRECTORY(man)
 ADD_SUBDIRECTORY(src)
 ADD_SUBDIRECTORY(regress)
+ADD_SUBDIRECTORY(examples)
 
-
-# XXX: pkgconfig file
-
-# installation
-
-# XXX: pkgconfig file
-
-# packaging
-
-SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "library for manipulating zip archives")
-SET(CPACK_PACKAGE_VENDOR "Dieter Baron <dillo@giga.or.at> and Thomas Klausner <tk@giga.or.at>")
-SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README")
-SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
-SET(CPACK_PACKAGE_VERSION_MAJOR ${PACKAGE_VERSION_MAJOR})
-SET(CPACK_PACKAGE_VERSION_MINOR ${PACKAGE_VERSION_MINOR})
-SET(CPACK_PACKAGE_VERSION_PATCH ${PACKAGE_VERSION_PATCH})
-SET(CPACK_SOURCE_PACKAGE_FILE_NAME ${PACKAGE_NAME}-${PACKAGE_VERSION})
-SET(CPACK_GENERATOR "TGZ")
-SET(CPACK_SOURCE_GENERATOR "TGZ")
-SET(CPACK_SOURCE_IGNORE_FILES
-  ".a$"
-  ".cmake$"
-  ".o$"
-  ".so$"
-  "/.deps/"
-  "/.libs/"
-  "/CMakeFiles/"
-  "/CVS/"
-  "/autom4te.cache/"
-  "/build"
-  "/broken"
-  "/docs/"
-  "AdditionalInfo.txt$"
-  "CMakeCache.txt$"
-  "Makefile$"
-  "\\\\.sh$"
-  "_CPack_"
-  "config.h$"
-  "config.log$"
-  "config.status$"
-  "html$"
-  "install_manifest.txt$"
-  "stamp-h1$"
-  "tar.bz2"
-  "tar.gz"
-  "~$"
-)
-SET(CPACK_SOURCE_STRIP_FILES "")
-INCLUDE(CPack)
+# TODO: pkgconfig file
 
 # write out config file
 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/cmake-config.h.in
@@ -128,4 +103,6 @@ CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/cmake-config.h.in
 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/cmake-zipconf.h.in
   ${CMAKE_CURRENT_BINARY_DIR}/zipconf.h)
 
+# installation
+
 INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/zipconf.h DESTINATION lib/libzip/include)
diff --git a/LICENSE b/LICENSE
index 9b2fda0..bf30801 100644 (file)
--- a/LICENSE
+++ b/LICENSE
@@ -1,18 +1,22 @@
-Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
+Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
+
 The authors can be contacted at <libzip@nih.at>
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
 are met:
+
 1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
+  notice, this list of conditions and the following disclaimer.
+
 2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in
-   the documentation and/or other materials provided with the
-   distribution.
+  notice, this list of conditions and the following disclaimer in
+  the documentation and/or other materials provided with the
+  distribution.
+
 3. The names of the authors may not be used to endorse or promote
-   products derived from this software without specific prior
-   written permission.
+  products derived from this software without specific prior
+  written permission.
 
 THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
index fa5acef..09da711 100644 (file)
@@ -1,17 +1,30 @@
 # not GPL, thus no COPYING
-AUTOMAKE_OPTIONS=dist-bzip2 foreign
+AUTOMAKE_OPTIONS=dist-xz foreign
 
 ACLOCAL_AMFLAGS=       -I m4
 
-SUBDIRS=lib src man regress
+SUBDIRS=lib man src regress examples
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = libzip.pc
 
-EXTRA_DIST=    LICENSE \
+EXTRA_DIST=    API-CHANGES \
+               LICENSE \
                CMakeLists.txt \
                cmake-config.h.in \
                cmake-zipconf.h.in \
                libzip.pc.in \
                libzip-uninstalled.pc.in \
                m4
+
+dist-hook:
+       mkdir $(distdir)/xcode
+       mkdir $(distdir)/xcode/libzip.xcodeproj
+       mkdir $(distdir)/xcode/libzip.xcodeproj/project.xcworkspace
+       cp -p $(srcdir)/xcode/Info.plist \
+                 $(srcdir)/xcode/config.h \
+                 $(srcdir)/xcode/extract-version.sh \
+                 $(srcdir)/xcode/zipconf.h $(distdir)/xcode
+       cp -p $(srcdir)/xcode/libzip.xcodeproj/project.pbxproj $(distdir)/xcode/libzip.xcodeproj
+       cp -p $(srcdir)/xcode/libzip.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
+               $(distdir)/xcode/libzip.xcodeproj/project.xcworkspace
index aa8e93e..2c1cf0b 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -35,34 +79,52 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
-       $(srcdir)/Makefile.in $(srcdir)/config.h.in \
-       $(srcdir)/libzip-uninstalled.pc.in $(srcdir)/libzip.pc.in \
-       $(top_srcdir)/configure AUTHORS INSTALL NEWS THANKS TODO \
-       compile config.guess config.sub depcomp install-sh ltmain.sh \
-       missing mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+       $(top_srcdir)/configure $(am__configure_deps) \
+       $(srcdir)/config.h.in $(srcdir)/libzip.pc.in \
+       $(srcdir)/libzip-uninstalled.pc.in AUTHORS INSTALL NEWS README \
+       THANKS TODO compile config.guess config.sub depcomp install-sh \
+       missing ltmain.sh
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = config.h
 CONFIG_CLEAN_FILES = libzip.pc libzip-uninstalled.pc
 CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-       html-recursive info-recursive install-data-recursive \
-       install-dvi-recursive install-exec-recursive \
-       install-html-recursive install-info-recursive \
-       install-pdf-recursive install-ps-recursive install-recursive \
-       installcheck-recursive installdirs-recursive pdf-recursive \
-       ps-recursive uninstall-recursive
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+       ctags-recursive dvi-recursive html-recursive info-recursive \
+       install-data-recursive install-dvi-recursive \
+       install-exec-recursive install-html-recursive \
+       install-info-recursive install-pdf-recursive \
+       install-ps-recursive install-recursive installcheck-recursive \
+       installdirs-recursive pdf-recursive ps-recursive \
+       tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -84,23 +146,54 @@ am__nobase_list = $(am__nobase_strip_setup); \
 am__base_list = \
   sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
   sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
 am__installdirs = "$(DESTDIR)$(pkgconfigdir)"
 DATA = $(pkgconfig_DATA)
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-       $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-       distdir dist dist-all distcheck
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+       cscope distdir dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+       $(LISP)config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
+CSCOPE = cscope
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
 am__remove_distdir = \
-  { test ! -d "$(distdir)" \
-    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr "$(distdir)"; }; }
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
 am__relativize = \
   dir0=`pwd`; \
   sed_first='s,^\([^/]*\)/.*$$,\1,'; \
@@ -126,12 +219,16 @@ am__relativize = \
     dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
   done; \
   reldir="$$dir2"
-DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.xz
 GZIP_ENV = --best
+DIST_TARGETS = dist-xz dist-gzip
 distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
 distcleancheck_listfiles = find . -type f -print
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -140,11 +237,13 @@ AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -154,6 +253,7 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -169,6 +269,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MANFMT = @MANFMT@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -184,6 +285,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG_RPATH = @PKG_CONFIG_RPATH@
 RANLIB = @RANLIB@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
@@ -194,6 +296,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
@@ -226,7 +329,6 @@ libdir = @libdir@
 libexecdir = @libexecdir@
 localedir = @localedir@
 localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
@@ -244,12 +346,13 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 
 # not GPL, thus no COPYING
-AUTOMAKE_OPTIONS = dist-bzip2 foreign
+AUTOMAKE_OPTIONS = dist-xz foreign
 ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = lib src man regress
+SUBDIRS = lib man src regress examples
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = libzip.pc
-EXTRA_DIST = LICENSE \
+EXTRA_DIST = API-CHANGES \
+               LICENSE \
                CMakeLists.txt \
                cmake-config.h.in \
                cmake-zipconf.h.in \
@@ -261,7 +364,7 @@ all: config.h
        $(MAKE) $(AM_MAKEFLAGS) all-recursive
 
 .SUFFIXES:
-am--refresh:
+am--refresh: Makefile
        @:
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        @for dep in $?; do \
@@ -297,10 +400,8 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 
 config.h: stamp-h1
-       @if test ! -f $@; then \
-         rm -f stamp-h1; \
-         $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
-       else :; fi
+       @test -f $@ || rm -f stamp-h1
+       @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
 
 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
        @rm -f stamp-h1
@@ -327,8 +428,11 @@ distclean-libtool:
        -rm -f libtool config.lt
 install-pkgconfigDATA: $(pkgconfig_DATA)
        @$(NORMAL_INSTALL)
-       test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
        @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -342,27 +446,28 @@ uninstall-pkgconfigDATA:
        @$(NORMAL_UNINSTALL)
        @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       test -n "$$files" || exit 0; \
-       echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \
-       cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files
+       dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
 
 # This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-       @fail= failcom='exit 1'; \
-       for f in x $$MAKEFLAGS; do \
-         case $$f in \
-           *=* | --[!k]*);; \
-           *k*) failcom='fail=yes';; \
-         esac; \
-       done; \
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+       @fail=; \
+       if $(am__make_keepgoing); then \
+         failcom='fail=yes'; \
+       else \
+         failcom='exit 1'; \
+       fi; \
        dot_seen=no; \
        target=`echo $@ | sed s/-recursive//`; \
-       list='$(SUBDIRS)'; for subdir in $$list; do \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       for subdir in $$list; do \
          echo "Making $$target in $$subdir"; \
          if test "$$subdir" = "."; then \
            dot_seen=yes; \
@@ -377,57 +482,12 @@ $(RECURSIVE_TARGETS):
          $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
        fi; test -z "$$fail"
 
-$(RECURSIVE_CLEAN_TARGETS):
-       @fail= failcom='exit 1'; \
-       for f in x $$MAKEFLAGS; do \
-         case $$f in \
-           *=* | --[!k]*);; \
-           *k*) failcom='fail=yes';; \
-         esac; \
-       done; \
-       dot_seen=no; \
-       case "$@" in \
-         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-         *) list='$(SUBDIRS)' ;; \
-       esac; \
-       rev=''; for subdir in $$list; do \
-         if test "$$subdir" = "."; then :; else \
-           rev="$$subdir $$rev"; \
-         fi; \
-       done; \
-       rev="$$rev ."; \
-       target=`echo $@ | sed s/-recursive//`; \
-       for subdir in $$rev; do \
-         echo "Making $$target in $$subdir"; \
-         if test "$$subdir" = "."; then \
-           local_target="$$target-am"; \
-         else \
-           local_target="$$target"; \
-         fi; \
-         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-         || eval $$failcom; \
-       done && test -z "$$fail"
-tags-recursive:
-       list='$(SUBDIRS)'; for subdir in $$list; do \
-         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-       done
-ctags-recursive:
-       list='$(SUBDIRS)'; for subdir in $$list; do \
-         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-       done
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
        if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
@@ -443,12 +503,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
              set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
          fi; \
        done; \
-       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -460,15 +515,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -477,9 +528,31 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+       test ! -s cscope.files \
+         || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+       -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+       -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
 
 distdir: $(DISTFILES)
        $(am__remove_distdir)
@@ -515,13 +588,10 @@ distdir: $(DISTFILES)
        done
        @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
          if test "$$subdir" = .; then :; else \
-           test -d "$(distdir)/$$subdir" \
-           || $(MKDIR_P) "$(distdir)/$$subdir" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
            dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
            $(am__relativize); \
            new_distdir=$$reldir; \
@@ -541,6 +611,9 @@ distdir: $(DISTFILES)
              || exit 1; \
          fi; \
        done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="$(top_distdir)" distdir="$(distdir)" \
+         dist-hook
        -test -n "$(am__skip_mode_fix)" \
        || find "$(distdir)" -type d ! -perm -755 \
                -exec chmod u+rwx,go+rx {} \; -o \
@@ -550,36 +623,41 @@ distdir: $(DISTFILES)
        || chmod -R a+r "$(distdir)"
 dist-gzip: distdir
        tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-       $(am__remove_distdir)
-dist-bzip2: distdir
-       tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
-dist-lzma: distdir
-       tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
-       $(am__remove_distdir)
+dist-bzip2: distdir
+       tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+       $(am__post_remove_distdir)
 
+dist-lzip: distdir
+       tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+       $(am__post_remove_distdir)
 dist-xz: distdir
-       tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
-       $(am__remove_distdir)
+       tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+       $(am__post_remove_distdir)
 
 dist-tarZ: distdir
+       @echo WARNING: "Support for shar distribution archives is" \
+                      "deprecated." >&2
+       @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
        tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
 dist-shar: distdir
+       @echo WARNING: "Support for distribution archives compressed with" \
+                      "legacy program 'compress' is deprecated." >&2
+       @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
        shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
 dist-zip: distdir
        -rm -f $(distdir).zip
        zip -rq $(distdir).zip $(distdir)
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
-dist dist-all: distdir
-       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-       tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-       $(am__remove_distdir)
+dist dist-all:
+       $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+       $(am__post_remove_distdir)
 
 # This target untars the dist file and tries a VPATH configuration.  Then
 # it guarantees that the distribution is self-contained by making another
@@ -590,8 +668,8 @@ distcheck: dist
          GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
        *.tar.bz2*) \
          bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
-       *.tar.lzma*) \
-         lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+       *.tar.lz*) \
+         lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
        *.tar.xz*) \
          xz -dc $(distdir).tar.xz | $(am__untar) ;;\
        *.tar.Z*) \
@@ -601,17 +679,19 @@ distcheck: dist
        *.zip*) \
          unzip $(distdir).zip ;;\
        esac
-       chmod -R a-w $(distdir); chmod a+w $(distdir)
-       mkdir $(distdir)/_build
-       mkdir $(distdir)/_inst
+       chmod -R a-w $(distdir)
+       chmod u+w $(distdir)
+       mkdir $(distdir)/_build $(distdir)/_inst
        chmod a-w $(distdir)
        test -d $(distdir)/_build || exit 0; \
        dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
          && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
          && am__cwd=`pwd` \
          && $(am__cd) $(distdir)/_build \
-         && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+         && ../configure \
+           $(AM_DISTCHECK_CONFIGURE_FLAGS) \
            $(DISTCHECK_CONFIGURE_FLAGS) \
+           --srcdir=.. --prefix="$$dc_install_base" \
          && $(MAKE) $(AM_MAKEFLAGS) \
          && $(MAKE) $(AM_MAKEFLAGS) dvi \
          && $(MAKE) $(AM_MAKEFLAGS) check \
@@ -634,13 +714,21 @@ distcheck: dist
          && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
          && cd "$$am__cwd" \
          || exit 1
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
        @(echo "$(distdir) archives ready for distribution: "; \
          list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
          sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
 distuninstallcheck:
-       @$(am__cd) '$(distuninstallcheck_dir)' \
-       && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+       @test -n '$(distuninstallcheck_dir)' || { \
+         echo 'ERROR: trying to run $@ with an empty' \
+              '$$(distuninstallcheck_dir)' >&2; \
+         exit 1; \
+       }; \
+       $(am__cd) '$(distuninstallcheck_dir)' || { \
+         echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+         exit 1; \
+       }; \
+       test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
           || { echo "ERROR: files left after uninstall:" ; \
                if test -n "$(DESTDIR)"; then \
                  echo "  (check DESTDIR support)"; \
@@ -674,10 +762,15 @@ install-am: all-am
 
 installcheck: installcheck-recursive
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -759,26 +852,38 @@ ps-am:
 
 uninstall-am: uninstall-pkgconfigDATA
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
-       ctags-recursive install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-       all all-am am--refresh check check-am clean clean-generic \
-       clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
-       dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
-       distcheck distclean distclean-generic distclean-hdr \
-       distclean-libtool distclean-tags distcleancheck distdir \
-       distuninstallcheck dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-pkgconfigDATA install-ps \
-       install-ps-am install-strip installcheck installcheck-am \
-       installdirs installdirs-am maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
-       uninstall uninstall-am uninstall-pkgconfigDATA
-
+.MAKE: $(am__recursive_targets) all install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+       am--refresh check check-am clean clean-cscope clean-generic \
+       clean-libtool cscope cscopelist-am ctags ctags-am dist \
+       dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \
+       dist-tarZ dist-xz dist-zip distcheck distclean \
+       distclean-generic distclean-hdr distclean-libtool \
+       distclean-tags distcleancheck distdir distuninstallcheck dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-pkgconfigDATA install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       installdirs-am maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+       ps ps-am tags tags-am uninstall uninstall-am \
+       uninstall-pkgconfigDATA
+
+
+dist-hook:
+       mkdir $(distdir)/xcode
+       mkdir $(distdir)/xcode/libzip.xcodeproj
+       mkdir $(distdir)/xcode/libzip.xcodeproj/project.xcworkspace
+       cp -p $(srcdir)/xcode/Info.plist \
+                 $(srcdir)/xcode/config.h \
+                 $(srcdir)/xcode/extract-version.sh \
+                 $(srcdir)/xcode/zipconf.h $(distdir)/xcode
+       cp -p $(srcdir)/xcode/libzip.xcodeproj/project.pbxproj $(distdir)/xcode/libzip.xcodeproj
+       cp -p $(srcdir)/xcode/libzip.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
+               $(distdir)/xcode/libzip.xcodeproj/project.xcworkspace
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/NEWS b/NEWS
index 02081c6..dc8ff0d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,44 @@
+1.0.1 [2015/05/04]
+
+* Build fixes for Windows.
+
+1.0 [2015/05/03]
+
+* Implemented an I/O abstraction layer.
+* Added support for native Windows API for files.
+* Added support for setting the last modification time for a file.
+* Added a new type zip_error_t for errors.
+* Added more typedefs for structs.
+* Torrentzip support was removed.
+* CVE-2015-2331 was fixed.
+* Addressed all Coverity CIDs.
+
+0.11.2 [2013/12/19]
+
+* Support querying/setting operating system and external attributes.
+* For newly added files, set operating system to UNIX, permissions
+  to 0666 (0777 for directories).
+* Fix bug when writing zip archives containing files bigger than 4GB.
+
+0.11.1 [2013/04/27]
+
+* Fix bugs in zip_set_file_compression().
+* Include Xcode build infrastructure.
+
+0.11 [2013/03/23]
+
+* Added Zip64 support (large file support)
+* Added UTF-8 support for file names, file comments, and archive comments
+* Changed API for name and comment related functions for UTF-8 support
+* Added zip_discard()
+* Added ZIP_TRUNCATE for zip_open()
+* Added zip_set_file_compression()
+* Added API for accessing and modifying extra fields
+* Improved API type consistency
+* Use gcc4's visibility __attribute__
+* More changes for Windows support
+* Additional test cases
+
 0.10.1 [2012/03/20]
 
 * Fixed CVE-2012-1162
@@ -5,7 +46,7 @@
 
 0.10 [2010/03/18]
 
-* Added zip_get_num_files(), deprecated zip_get_num_entries().
+* Added zip_get_num_entries(), deprecated zip_get_num_files().
 * Better windows support.
 * Support for traditional PKWARE encryption added.
 * Fix opening archives with more than 65535 entries.
diff --git a/README b/README
index 35104a1..4f197a9 100644 (file)
--- a/README
+++ b/README
@@ -8,10 +8,17 @@ pages.
 can start with libzip(3), which lists all others.  Example source code
 is in the src/ subdirectory.
 
+  If you have developed an application using libzip, you can find out
+about API changes and how to adapt your code for them in the included
+file API-CHANGES.
+
   For generic installation instructions, see file `INSTALL'.
 Additionally, you'll need zlib (at least version 1.1.2). It comes
 with most operating systems nowadays, or you can get it at
-       http://www.gzip.org/zlib/
+       http://www.zlib.net/
+
+  When using a static Windows library, you need to define ZIP_STATIC
+when compiling packages using libzip.
 
   If you make a binary distribution, please include a pointer to the
 distribution site:
@@ -19,9 +26,9 @@ distribution site:
        ftp.nih.at /pub/nih/libzip
 The latest version can always be found there.
 
-  Mail suggestions and bug reports to <libzip@nih.at>.
+  There is a mailing list for developers using libzip.  You can
+subscribe to it by sending a mail with the subject "subscribe
+libzip-discuss" to minimalist at nih.at. List mail should be sent
+to libzip-discuss at nih.at. Use this for bug reports or questions.
 
-  There is also a mailing list for developers using libzip.  You can
-subscribe to it by sending a mail with the subject "subscribe libzip-discuss"
-to minimalist at nih.at. List mail should be sent to libzip-discuss at
-nih.at.
+  If you want to reach the authors in private, use <libzip@nih.at>.
diff --git a/THANKS b/THANKS
index 601d3cf..ae6a2f1 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -4,17 +4,47 @@ and some other general information gathered from their sources.
 Thanks to these people for suggestions, testing, and bug reports:
 
 Alexander Galanin <al@galanin.nnov.ru>
+Alexandr Shadchin <alexandr.shadchin@gmail.com>
 Andrew Brampton <brampton@gmail.com>
+Andrew Molyneux <andrew@molyneuxfamily.co.uk>
+Ankur Kothari <ankz.kothari@gmail.com>
+BALATON Zoltan <balaton@eik.bme.hu>
+Bogdan <bogiebog@gmail.com>
+Chris Nehren <cnehren+libzip@pobox.com>
+Coverity <info@coverity.com>
+Dane Springmeyer <dane.springmeyer@gmail.com>
+David Demelier <demelier.david@gmail.com>
+Del Merritt <del@alum.mit.edu>
+Dmytro Rybachenko <atmoliton@gmail.com>
+François Simon <AT.GFI.Francois.SIMON@sesam-vitale.fr>
 Heiko Hund <heiko@ist.eigentlich.net>
+Jan Weiß <jan@geheimwerk.de>
 Joel Ebrahimi <joel.ebrahimi@gmail.com>
 Jono Spiro <jono.spiro@gmail.com>
+Kohei Yoshida <kohei.yoshida@gmail.com>
+Lubomir I. Ivanov <neolit123@gmail.com>
+Martin Buchholz <martinrb@google.com>
+Martin Szulecki <m.szulecki@libimobiledevice.org>
+Michal Vyskocil <mvyskocil@suse.cz>
 Mikhail Gusarov <dottedmag@dottedmag.net>.
 Oliver Kaiser <under.northern.sky@googlemail.com>
+Oliver Kuckertz <oliver.kuckertz@mologie.de>
+Pascal Terjan <pterjan@gmail.com>
 Patrick Spendrin <ps_ml@gmx.de>
+Paul Harris <harris.pc@gmail.com>
+Paul Sheppard <shepsoft@googlemail.com>
 Pierre Joye <pierre.php@gmail.com>
+Pierre-Louis Cabelguen <plcabelguen@googlemail.com>
+Remi Collet <remi@fedoraproject.org>
 Rick Carback <carback1@umbc.edu>
 Roberto Tirabassi <rtirabassi@3di.it>
+Roland Ortloff <Ortloff.R@gmx.de>
 Simon Talbot <simont@nse.co.uk>
 Stephen Bryant <steve@bawue.de>
 Tarmo Pikaro <tapika@yahoo.com>
 Timo Warns <warns@pre-sense.de>
+Tom Callaway <tcallawa@redhat.com>
+Tomas Hoger <thoger@redhat.com>
+Vassili Courzakis <vcoxvco@googlemail.com>
+Wojciech Michalski <wmichalski@quay.pl>
+Wolfgang Glunz <Wolfgang.Glunz@gmx.de>
diff --git a/TODO b/TODO
index add2bf5..d067eee 100644 (file)
--- a/TODO
+++ b/TODO
-! [doc] zip_source_function: mention that stat is called after close
-! [cleanup] get rid of zip_get_{compression,encryption}_implementation
-! [compat] test calls against old API
-+ [portability] use _setmode(_fileno(fp), _O_BINARY); where present
-+ [bug] fix permissions of new file to match old one
-+ [bug] _zip_checkcons return value can overflow
-+ [bug] _zip_u2d_time: handle localtime(3) failure
-+ [bug] missing -Wl,-R in pkg-config file
-+ [cleanup] use zip_*int*_t internally
-+ [cleanup] don't make zip_source_zip go through zip_fread
-+ [bug] set "version of encoding software" to 2.0
-+ [bug?] keep extended local headers when copying?
-- [cleanup] remove now useless check of fseek 
-- [consistency check] check that local headers come before central dir
-- [consistency] check arguments for every entry point into libzip
-- [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] run regression tests also from CMake framework
-- [test] rename deleted (fails)
-- [test] rename file to dir/ and vice versa (fails)
------------------------------------------------- API issues
-- character encoding in file names and comments (ZIP_AFL_UTF8, see mail)
-- parameters for compression/crypt implementations (extra function)
-  ZIP_CM_DEFLATE/ZIP_CM_BZIP2: compression level
-                              memlevel?
+API Plans
+=========
+
+Encryption
+----------
+* struct zip *zip_open_encrypted(const char *path, int flags, const char *password, int *errorp);
+* int zip_set_encryption(struct zip *archive, zip_uint64_t idx, zip_uint16_t method, const char *password);
+* void zip_set_archive_encryption(struct zip *archive, zip_uint16_t method, const char *password);
+
+Prefixes
+--------
+For example for adding extractors for self-extracting zip archives.
+* zip_set_archive_prefix(struct zip *za, const zip_uint8_t *data, zip_uint64_t length);
+* const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp);
+
+Progress Callback
+-----------------
+Register callback; will be called from zip_close() after each file has been processed.
+typedef void (*zip_progress_callback_t)(double);
+void zip_register_progress_callback(zip_t *, zip_progress_callback_t);
+
+API Issues
+==========
+! D zip_get_archive_comment has int *lenp argument.  Cleaner would be zip_uint32_t *.
+       rename and fix.  which other functions for naming consistency?
+! D rename remaining zip_XXX_{file,archive}_* to zip_{file,archive}_XXX_*?
 * compression/crypt implementations: how to set error code on failure
-+ compression/crypt error messages a la ZIP_ER_ZLIB (no detailed info passing)
-* I/O methods
------------------------------------------------- API ideas
-struct zip *zip_open_encrypted(const char *path, int flags,
-                               const char *password, int *errorp);
-
-int zip_set_file_compression(struct zip *archive, zip_uint64_t idx,
-                       zip_uint16_t method, zip_uint32_t flags);
-       flags: 0-15: compression ratio (0: fast, 15: best)
-               16: default     
-               higher bits: method specific
-int zip_set_encryption(struct zip *archive, zip_uint64_t idx,
-                      zip_uint16_t method, const char *password);
-void zip_set_archive_encryption(struct zip *archive,
-                               zip_uint16_t 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 parsing extra fields?
-* API for setting/getting extra fields in cdir?
-* zipcmp: add option for file content comparison
-* support for zip64 (large file)
+* compression/crypt error messages a la ZIP_ER_ZLIB (no detailed info passing)
+* check arguments for every entry point into libzip
+
 
-* append to files (for self-extracting files)
+Features
+========
+* support setting extra fields from zip_source
+  . introduce layers of extra fields:
+    . original
+    . from zip_source
+    . manually set
+  . when querying extra fields, search all of them in reverse order
+  . add whiteout (deleted) flag
+  . allow invalid data flag, used when computing extra field size before writing data
+  . new command ZIP_SOURCE_EXTRA_FIELDS
+  . no support for multiple copies of same extra field
+* delete all extra fields during zip_replace()
+* function to copy file from one archive to another
+* set O_CLOEXEC flag after fopen and mkstemp
+
+* support streaming output (creating new archive to e.g. stdout)
+* add functions to:
+  . read/set ASCII file flag? (wiz: more general options?)
+* zip_commit (to finish changes without closing archive)
 * add custom compression function support
-* zip_replace_zip: remember compression method, recompress if different speced
-* close even if error...
+* zip_fseek
+* zip_source_zip: allow rewinding
+* zipcmp: add option for file content comparison
+* zipcmp: compare bit flags if paranoid
+* zipcmp: compare external attributes/opsys if paranoid
+* zipcmp: compare last_mod if paranoid (or with separate flag?)
+* consistency
+  . for stored files, test compressed = uncompressed
+  . data descriptor
+  . local headers come before central dir
+
 * support for old compression methods?????
------------------------------------------------- regression tests
+
+
+Bugs
+====
+* support InfoZIP encryption header extension (copy data descriptor for encrypted files)
+! ensure that nentries is small enough not to cause overflow (size_t for entry, uint64 for CD on disk)
+* Xcode 32bit build uses 64bit config.h
+* fix OpenSUSE i686 regression failures
+* fix open_filename_duplicate_consistency.test to fail
+* check for limits imposed by format (central dir size, file size, extra fields, ...)
+* _zip_u2d_time: handle localtime(3) failure
+* POSIX: zip_open: check whether file can be created and fail if not
+* fix inconsistent usage of valid flags (not checked in many places)
+* cdr == NULL -> ER_NOENT vs. idx > cdir->nentry -> ER_INVAL inconsistent (still there?)
+
+
+Cleanup
+=======
+* use bool
+* use ZIP_SOURCE_SUPPORTS_{READABLE,SEEKABLE,WRITABLE}
+* use zip_source_seek_compute_offset
+* move compat refs from zipint.h to own file, and include that in zipint.h and src
+* get rid of zip_get_{compression,encryption}_implementation
+* use zip_*int*_t internally
+
+
+Analysis
+========
+* pass through coverity
+
+
+Infrastructure
+==============
+* create CMakefile.txt man page linking from links file
+
+
+Test Case Issues
+================
+* test cases for set_extra*, delete_extra*, *extra_field*
+* test cases for in memory archives
+  add
+  delete
+  delete all
+  modify
+* use gcov output to increase test coverage
+* merge most tools into modify
+* add test case to change values for newly added files (name, compression method, comment, mtime, . . .)
+* zip_open file less than EOCDLEN bytes long
+* test calls against old API
+* run regression tests also from CMake framework
+* rename file to dir/ and vice versa (fails)
+* fix comment test to be newline insensitive
+* check if http://bugs.python.org/issue20078 provides ideas for new tests
+
 * (add, replace)
        add to empty zip
        add to existing zip
@@ -86,18 +131,12 @@ zip_source_vprintf(struct zip_source *, const char *fmt, va_list ap);
        close
        zipcmp copy expected
        remove copy
-* (delete)
 * (error_get)
 * (error_get_sys_type)
 * (error_to_str)
 * (extra_fields)
 * (file_error_get)
 * (file_strerror)
-* (fopen_index)
-       illegal index
-* (get_name)
-* (get_num_files)
-* (rename)
 * (replace)
 * (source_buffer)
 * (source_file)
@@ -105,8 +144,23 @@ zip_source_vprintf(struct zip_source *, const char *fmt, va_list ap);
 * (source_free)
 * (source_function)
 * (source_zip)
-* (stat)
-* (stat_index)
 * (strerror)
 * (unchange)
 * (unchange_all)
+* open(ZIP_RDONLY)
+* I/O abstraction layer
+    zip_open_from_source
+* read two zip entries interleaved
+
+
+Unsorted
+========
+* zip_source_file: don't allow write if start/len specify a part of the file
+* script to check if all exported symbols are marked with ZIP_EXTERN, add to make distcheck
+
+D re-implement fix for OS X sandboxing (zip_archive_set_tempdir).
+
+* document: zip_source_write: length can't be > ZIP_INT64_MAX
+* document: ZIP_SOURCE_CLOSE implementation can't return error
+* keep error codes in man pages in sync
+* document error codes in new man pages
index 73c847b..47af6a8 100644 (file)
@@ -1,7 +1,7 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 # PARTICULAR PURPOSE.
 
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
-[m4_warning([this file was generated for autoconf 2.68.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
 You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# Copyright (C) 2002-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -31,10 +32,10 @@ To do so, use the procedure documented by the package, typically `autoreconf'.])
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
+[am__api_version='1.14'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.1], [],
+m4_if([$1], [1.14.1], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -50,22 +51,22 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
+[AM_AUTOMAKE_VERSION([1.14.1])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
 #
 # Of course, Automake must honor this variable whenever it calls a
 # tool from the auxiliary directory.  The problem is that $srcdir (and
@@ -84,7 +85,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 #
 # The reason of the latter failure is that $top_srcdir and $ac_aux_dir
 # are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
+# harmless because $srcdir is '.', but things will broke when you
 # start a VPATH build or use an absolute $srcdir.
 #
 # So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
@@ -110,22 +111,19 @@ am_aux_dir=`cd $ac_aux_dir && pwd`
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 9
-
 # AM_CONDITIONAL(NAME, SHELL-CONDITION)
 # -------------------------------------
 # Define a conditional.
 AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+[AC_PREREQ([2.52])dnl
m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
 AC_SUBST([$1_TRUE])dnl
 AC_SUBST([$1_FALSE])dnl
 _AM_SUBST_NOTMAKE([$1_TRUE])dnl
@@ -144,16 +142,14 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 10
 
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
 # written in clear, in which case automake, when reading aclocal.m4,
 # will think it sees a *use*, and therefore will trigger all it's
 # C support machinery.  Also note that it means that autoscan, seeing
@@ -163,7 +159,7 @@ fi])])
 # _AM_DEPENDENCIES(NAME)
 # ----------------------
 # See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
 # We try a few techniques and use that to set a single cache variable.
 #
 # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
@@ -176,12 +172,13 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
 AC_REQUIRE([AM_MAKE_INCLUDE])dnl
 AC_REQUIRE([AM_DEP_TRACK])dnl
 
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
+m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
+      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
+      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
+      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                    [depcc="$$1"   am_compiler_list=])
 
 AC_CACHE_CHECK([dependency style of $depcc],
                [am_cv_$1_dependencies_compiler_type],
@@ -189,8 +186,9 @@ AC_CACHE_CHECK([dependency style of $depcc],
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
   # using a relative directory.
@@ -229,16 +227,16 @@ AC_CACHE_CHECK([dependency style of $depcc],
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -247,16 +245,16 @@ AC_CACHE_CHECK([dependency style of $depcc],
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
       if test "x$enable_dependency_tracking" = xyes; then
        continue
       else
        break
       fi
       ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -304,7 +302,7 @@ AM_CONDITIONAL([am__fastdep$1], [
 # AM_SET_DEPDIR
 # -------------
 # Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
 AC_DEFUN([AM_SET_DEPDIR],
 [AC_REQUIRE([AM_SET_LEADING_DOT])dnl
 AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
@@ -314,34 +312,39 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
 # AM_DEP_TRACK
 # ------------
 AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+  [--enable-dependency-tracking],
+  [do not reject slow dependency extractors])
+AS_HELP_STRING(
+  [--disable-dependency-tracking],
+  [speeds up one-time build])])
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
+  am__nodep='_no'
 fi
 AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
 AC_SUBST([AMDEPBACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
 ])
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-#serial 5
 
 # _AM_OUTPUT_DEPENDENCY_COMMANDS
 # ------------------------------
 AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
 [{
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # Older Autoconf quotes --file arguments for eval, but not when files
   # are listed without --file.  Let's play safe and only enable the eval
   # if we detect the quoting.
   case $CONFIG_FILES in
@@ -354,7 +357,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
     # Strip MF so we end up with the name of the file.
     mf=`echo "$mf" | sed -e 's/:.*$//'`
     # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
+    # We used to match only the files named 'Makefile.in', but
     # some people rename them; so instead we look at the file content.
     # Grep'ing the first line is not enough: some people post-process
     # each Makefile.in and add a new line on top of each file to say so.
@@ -366,21 +369,19 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
       continue
     fi
     # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
+    # from the Makefile without running 'make'.
     DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
     test -z "$DEPDIR" && continue
     am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
+    test -z "$am__include" && continue
     am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
     # Find all dependency output files, they are included files with
     # $(DEPDIR) in their names.  We invoke sed twice because it is the
     # simplest approach to changing $(DEPDIR) to its actual value in the
     # expansion.
     for file in `sed -n "
       s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
       # Make sure the directory exists.
       test -f "$dirpart/$file" && continue
       fdir=`AS_DIRNAME(["$file"])`
@@ -398,7 +399,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
 # This macro should only be invoked once -- use via AC_REQUIRE.
 #
 # This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
+# is enabled.  FIXME.  This creates each '.P' file that we will
 # need in order to bootstrap the dependency handling code.
 AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 [AC_CONFIG_COMMANDS([depfiles],
@@ -408,18 +409,21 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 16
-
 # This macro actually does too much.  Some checks are only needed if
 # your package does certain things.  But this isn't really a big deal.
 
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
 # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
 # AM_INIT_AUTOMAKE([OPTIONS])
 # -----------------------------------------------
@@ -432,7 +436,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 # arguments mandatory, and then we can depend on a new Autoconf
 # release and drop the old call support.
 AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
+[AC_PREREQ([2.65])dnl
 dnl Autoconf wants to disallow AM_ names.  We explicitly allow
 dnl the ones we care about.
 m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
@@ -461,31 +465,40 @@ AC_SUBST([CYGPATH_W])
 # Define the identity of the package.
 dnl Distinguish between old-style and new-style calls.
 m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+[AC_DIAGNOSE([obsolete],
+             [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
  AC_SUBST([PACKAGE], [$1])dnl
  AC_SUBST([VERSION], [$2])],
 [_AM_SET_OPTIONS([$1])dnl
 dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+m4_if(
+  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  [ok:ok],,
   [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
  AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
  AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
 
 _AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
 
 # Some tools Automake needs.
 AC_REQUIRE([AM_SANITY_CHECK])dnl
 AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
 AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
 AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
 AC_REQUIRE([AC_PROG_AWK])dnl
@@ -496,34 +509,78 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
                             [_AM_PROG_TAR([v7])])])
 _AM_IF_OPTION([no-dependencies],,
 [AC_PROVIDE_IFELSE([AC_PROG_CC],
-                 [_AM_DEPENDENCIES(CC)],
-                 [define([AC_PROG_CC],
-                         defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+                 [_AM_DEPENDENCIES([CC])],
+                 [m4_define([AC_PROG_CC],
+                            m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
 AC_PROVIDE_IFELSE([AC_PROG_CXX],
-                 [_AM_DEPENDENCIES(CXX)],
-                 [define([AC_PROG_CXX],
-                         defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+                 [_AM_DEPENDENCIES([CXX])],
+                 [m4_define([AC_PROG_CXX],
+                            m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
 AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-                 [_AM_DEPENDENCIES(OBJC)],
-                 [define([AC_PROG_OBJC],
-                         defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+                 [_AM_DEPENDENCIES([OBJC])],
+                 [m4_define([AC_PROG_OBJC],
+                            m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+                 [_AM_DEPENDENCIES([OBJCXX])],
+                 [m4_define([AC_PROG_OBJCXX],
+                            m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
 ])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
 AC_CONFIG_COMMANDS_PRE(dnl
 [m4_provide_if([_AM_COMPILER_EXEEXT],
   [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
 
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+  fi
+fi])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
 dnl mangled by Autoconf and run in a shell conditional statement.
 m4_define([_AC_COMPILER_EXEEXT],
 m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
 
-
 # When config.status generates a header, we must update the stamp-h file.
 # This file resides in the same directory as the config header
 # that is generated.  The stamp files are numbered to have different names.
@@ -545,7 +602,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -564,16 +621,14 @@ if test x"${install_sh}" != xset; then
     install_sh="\${SHELL} $am_aux_dir/install-sh"
   esac
 fi
-AC_SUBST(install_sh)])
+AC_SUBST([install_sh])])
 
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2003-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 2
-
 # Check whether the underlying file-system supports filenames
 # with a leading dot.  For instance MS-DOS doesn't.
 AC_DEFUN([AM_SET_LEADING_DOT],
@@ -589,14 +644,12 @@ AC_SUBST([am__leading_dot])])
 
 # Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
-# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 4
-
 # AM_MAKE_INCLUDE()
 # -----------------
 # Check to see how make treats includes.
@@ -614,7 +667,7 @@ am__quote=
 _am_result=none
 # First try GNU make style include.
 echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
+# Ignore all kinds of additional output from 'make'.
 case `$am_make -s -f confmf 2> /dev/null` in #(
 *the\ am__doit\ target*)
   am__include=include
@@ -639,52 +692,14 @@ AC_MSG_RESULT([$_am_result])
 rm -f confinc confmf
 ])
 
-# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_PROG_CC_C_O
-# --------------
-# Like AC_PROG_CC_C_O, but changed for automake.
-AC_DEFUN([AM_PROG_CC_C_O],
-[AC_REQUIRE([AC_PROG_CC_C_O])dnl
-AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([compile])dnl
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
-   # Losing compiler, so override with the script.
-   # FIXME: It is wrong to rewrite CC.
-   # But if we don't then we get into trouble of one sort or another.
-   # A longer-term fix would be to have automake use am__CC in this case,
-   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
-   CC="$am_aux_dir/compile $CC"
-fi
-dnl Make sure AC_PROG_CC is never called again, or it will override our
-dnl setting of CC.
-m4_define([AC_PROG_CC],
-          [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
-])
-
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 6
-
 # AM_MISSING_PROG(NAME, PROGRAM)
 # ------------------------------
 AC_DEFUN([AM_MISSING_PROG],
@@ -692,11 +707,10 @@ AC_DEFUN([AM_MISSING_PROG],
 $1=${$1-"${am_missing_run}$2"}
 AC_SUBST($1)])
 
-
 # AM_MISSING_HAS_RUN
 # ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
 AC_DEFUN([AM_MISSING_HAS_RUN],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
 AC_REQUIRE_AUX_FILE([missing])dnl
@@ -709,63 +723,35 @@ if test x"${MISSING+set}" != xset; then
   esac
 fi
 # Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
 else
   am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
+  AC_MSG_WARN(['missing' script is too old or missing])
 fi
 ])
 
-# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 4
-
 # _AM_MANGLE_OPTION(NAME)
 # -----------------------
 AC_DEFUN([_AM_MANGLE_OPTION],
 [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
 
 # _AM_SET_OPTION(NAME)
-# ------------------------------
+# --------------------
 # Set option NAME.  Presently that only means defining a flag for this option.
 AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
 
 # _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
+# ------------------------
 # OPTIONS is a space-separated list of Automake options.
 AC_DEFUN([_AM_SET_OPTIONS],
 [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
@@ -776,24 +762,82 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+  [whether $CC understands -c and -o together],
+  [am_cv_prog_cc_c_o],
+  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 5
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
 # AM_SANITY_CHECK
 # ---------------
 AC_DEFUN([AM_SANITY_CHECK],
 [AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
 # Reject unsafe characters in $srcdir or the absolute working directory
 # name.  Accept space and tab only in the latter.
 am_lf='
@@ -804,32 +848,40 @@ case `pwd` in
 esac
 case $srcdir in
   *[[\\\"\#\$\&\'\`$am_lf\ \   ]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
 esac
 
-# Do `set' in a subshell so we don't clobber the current shell's
+# Do 'set' in a subshell so we don't clobber the current shell's
 # arguments.  Must try -L first in case configure is actually a
 # symlink; some systems play weird games with the mod time of symlinks
 # (eg FreeBSD returns the mod time of the symlink's containing
 # directory).
 if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$[*]" = "X"; then
+       # -L didn't work.
+       set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$[*]" != "X $srcdir/configure conftest.file" \
+       && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+       # If neither matched, then we have a broken ls.  This can happen
+       # if, for instance, CONFIG_SHELL is bash and it inherits a
+       # broken ls alias from the environment.  This has actually
+       # happened.  Such a system could not be considered "sane".
+       AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment])
+     fi
+     if test "$[2]" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
    test "$[2]" = conftest.file
    )
 then
@@ -839,9 +891,85 @@ else
    AC_MSG_ERROR([newly created file is older than distributed files!
 Check your system clock])
 fi
-AC_MSG_RESULT(yes)])
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+  [AC_MSG_CHECKING([that generated files are newer than configure])
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+  [--enable-silent-rules],
+  [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+  [--disable-silent-rules],
+  [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
 
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -849,34 +977,32 @@ AC_MSG_RESULT(yes)])
 
 # AM_PROG_INSTALL_STRIP
 # ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
+# One issue with vendor 'install' (even GNU) is that you can't
 # specify the program used to strip binaries.  This is especially
 # annoying in cross-compiling environments, where the build's strip
 # is unlikely to handle the host's binaries.
 # Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
+# always use install-sh in "make install-strip", and initialize
 # STRIPPROG with the value of the STRIP variable (set by the user).
 AC_DEFUN([AM_PROG_INSTALL_STRIP],
 [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
 # tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
 if test "$cross_compiling" != no; then
   AC_CHECK_TOOL([STRIP], [strip], :)
 fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+# Copyright (C) 2006-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 2
-
 # _AM_SUBST_NOTMAKE(VARIABLE)
 # ---------------------------
 # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
@@ -884,24 +1010,22 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])])
 AC_DEFUN([_AM_SUBST_NOTMAKE])
 
 # AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
+# --------------------------
 # Public sister of _AM_SUBST_NOTMAKE.
 AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2004-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 2
-
 # _AM_PROG_TAR(FORMAT)
 # --------------------
 # Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
 #
 # Substitute a variable $(am__tar) that is a command
 # writing to stdout a FORMAT-tarball containing the directory
@@ -911,75 +1035,114 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 # Substitute a variable $(am__untar) that extract such
 # a tarball read from stdin.
 #     $(am__untar) < result.tar
+#
 AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
 _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
 
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
+m4_if([$1], [v7],
+  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+  [m4_case([$1],
+    [ustar],
+     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+      if test $am_uid -le $am_max_uid; then
+         AC_MSG_RESULT([yes])
+      else
+         AC_MSG_RESULT([no])
+         _am_tools=none
+      fi
+      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+      if test $am_gid -le $am_max_gid; then
+         AC_MSG_RESULT([yes])
+      else
+        AC_MSG_RESULT([no])
+        _am_tools=none
+      fi],
+
+  [pax],
+    [],
+
+  [m4_fatal([Unknown tar format])])
+
+  AC_MSG_CHECKING([how to create a $1 tar archive])
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        AM_RUN_LOG([$_am_tar --version]) && break
+      done
+      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x $1 -w "$$tardir"'
+      am__tar_='pax -L -x $1 -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+      am__untar='cpio -i -H $1 -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
 
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_$1}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      AM_RUN_LOG([$am__untar <conftest.tar])
+      AM_RUN_LOG([cat conftest.dir/file])
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
   rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
 
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
 AC_SUBST([am__tar])
 AC_SUBST([am__untar])
 ]) # _AM_PROG_TAR
@@ -989,3 +1152,4 @@ m4_include([m4/ltoptions.m4])
 m4_include([m4/ltsugar.m4])
 m4_include([m4/ltversion.m4])
 m4_include([m4/lt~obsolete.m4])
+m4_include([m4/visibility.m4])
index ae731c2..5d75e79 100644 (file)
@@ -1,13 +1,63 @@
 #ifndef HAD_CONFIG_H
 #define HAD_CONFIG_H
+#ifndef _HAD_ZIPCONF_H
+#include "zipconf.h"
+#endif
+/* BEGIN DEFINES */
+#cmakedefine HAVE__CLOSE
+#cmakedefine HAVE__DUP
+#cmakedefine HAVE__FDOPEN
+#cmakedefine HAVE__FILENO
+#cmakedefine HAVE__OPEN
+#cmakedefine HAVE__SNPRINTF
+#cmakedefine HAVE__STRDUP
+#cmakedefine HAVE__STRICMP
 #cmakedefine HAVE_FSEEKO
+#cmakedefine HAVE_FTELLO
+#cmakedefine HAVE_OPEN
 #cmakedefine HAVE_MKSTEMP
-#cmakedefine HAVE_MOVEFILEEXA
-#cmakedefine HAVE__SNPRINTF
 #cmakedefine HAVE_SNPRINTF
-#cmakedefine HAVE__STRCMPI
-#cmakedefine HAVE__STRICMP
+#cmakedefine HAVE_SSIZE_T_LIBZIP
+#cmakedefine HAVE_STRCASECMP
+#cmakedefine HAVE_STRDUP
+#cmakedefine HAVE_STRUCT_TM_TM_ZONE
+#cmakedefine HAVE_MOVEFILEEXA
+#cmakedefine HAVE_STDBOOL_H
+#cmakedefine HAVE_STRINGS_H
 #cmakedefine HAVE_UNISTD_H
+#cmakedefine __INT8_LIBZIP ${__INT8_LIBZIP}
+#cmakedefine INT8_T_LIBZIP ${INT8_T_LIBZIP}
+#cmakedefine UINT8_T_LIBZIP ${UINT8_T_LIBZIP}
+#cmakedefine __INT16_LIBZIP ${__INT16_LIBZIP}
+#cmakedefine INT16_T_LIBZIP ${INT16_T_LIBZIP}
+#cmakedefine UINT16_T_LIBZIP ${UINT16_T_LIBZIP}
+#cmakedefine __INT32_LIBZIP ${__INT32_LIBZIP}
+#cmakedefine INT32_T_LIBZIP ${INT32_T_LIBZIP}
+#cmakedefine UINT32_T_LIBZIP ${UINT32_T_LIBZIP}
+#cmakedefine __INT64_LIBZIP ${__INT64_LIBZIP}
+#cmakedefine INT64_T_LIBZIP ${INT64_T_LIBZIP}
+#cmakedefine UINT64_T_LIBZIP ${UINT64_T_LIBZIP}
+#cmakedefine SIZEOF_OFF_T ${SIZEOF_OFF_T}
+#cmakedefine SIZE_T_LIBZIP ${SIZE_T_LIBZIP}
+#cmakedefine SSIZE_T_LIBZIP ${SSIZE_T_LIBZIP}
+#cmakedefine HAVE_DIRENT_H
+#cmakedefine HAVE_NDIR_H
+#cmakedefine HAVE_SYS_DIR_H
+#cmakedefine HAVE_SYS_NDIR_H
+/* END DEFINES */
 #define PACKAGE "@PACKAGE@"
 #define VERSION "@VERSION@"
+
+#ifndef HAVE_SSIZE_T_LIBZIP
+#  if SIZE_T_LIBZIP == INT_LIBZIP
+typedef int ssize_t;
+#  elif SIZE_T_LIBZIP == LONG_LIBZIP
+typedef long ssize_t;
+#  elif SIZE_T_LIBZIP == LONG_LONG_LIBZIP
+typedef long long ssize_t;
+#  else
+#error no suitable type for ssize_t found
+#  endif
+#endif
+
 #endif /* HAD_CONFIG_H */
index f7b08ae..876568c 100644 (file)
 #cmakedefine HAVE_INTTYPES_H_LIBZIP
 #cmakedefine HAVE_STDINT_H_LIBZIP
 #cmakedefine HAVE_SYS_TYPES_H_LIBZIP
+#cmakedefine HAVE___INT8_LIBZIP
 #cmakedefine HAVE_INT8_T_LIBZIP
 #cmakedefine HAVE_UINT8_T_LIBZIP
+#cmakedefine HAVE___INT16_LIBZIP
 #cmakedefine HAVE_INT16_T_LIBZIP
 #cmakedefine HAVE_UINT16_T_LIBZIP
+#cmakedefine HAVE___INT32_LIBZIP
 #cmakedefine HAVE_INT32_T_LIBZIP
 #cmakedefine HAVE_UINT32_T_LIBZIP
+#cmakedefine HAVE___INT64_LIBZIP
 #cmakedefine HAVE_INT64_T_LIBZIP
 #cmakedefine HAVE_UINT64_T_LIBZIP
+#cmakedefine HAVE_SSIZE_T_LIBZIP
 #cmakedefine SHORT_LIBZIP ${SHORT_LIBZIP}
 #cmakedefine INT_LIBZIP ${INT_LIBZIP}
 #cmakedefine LONG_LIBZIP ${LONG_LIBZIP}
-#cmakedefine LONGLONG_LIBZIP ${LONGLONG_LIBZIP}
+#cmakedefine LONG_LONG_LIBZIP ${LONG_LONG_LIBZIP}
 
 #if defined(HAVE_STDINT_H_LIBZIP)
 #include <stdint.h>
 
 #if defined(HAVE_INT8_T_LIBZIP)
 typedef int8_t zip_int8_t;
+#elif defined(HAVE___INT8_LIBZIP)
+typedef __int8 zip_int8_t;
 #else
 typedef signed char zip_int8_t;
 #endif
 #if defined(HAVE_UINT8_T_LIBZIP)
 typedef uint8_t zip_uint8_t;
+#elif defined(HAVE___INT8_LIBZIP)
+typedef unsigned __int8 zip_uint8_t;
 #else
 typedef unsigned char zip_uint8_t;
 #endif
 #if defined(HAVE_INT16_T_LIBZIP)
 typedef int16_t zip_int16_t;
+#elif defined(HAVE___INT16_LIBZIP)
+typedef __int16 zip_int16_t;
 #elif defined(SHORT_LIBZIP) && SHORT_LIBZIP == 2
 typedef signed short zip_int16_t;
 #endif
 #if defined(HAVE_UINT16_T_LIBZIP)
 typedef uint16_t zip_uint16_t;
+#elif defined(HAVE___INT16_LIBZIP)
+typedef unsigned __int16 zip_uint16_t;
 #elif defined(SHORT_LIBZIP) && SHORT_LIBZIP == 2
 typedef unsigned short zip_uint16_t;
 #endif
 #if defined(HAVE_INT32_T_LIBZIP)
 typedef int32_t zip_int32_t;
+#elif defined(HAVE___INT32_LIBZIP)
+typedef __int32 zip_int32_t;
 #elif defined(INT_LIBZIP) && INT_LIBZIP == 4
 typedef signed int zip_int32_t;
 #elif defined(LONG_LIBZIP) && LONG_LIBZIP == 4
@@ -61,6 +76,8 @@ typedef signed long zip_int32_t;
 #endif
 #if defined(HAVE_UINT32_T_LIBZIP)
 typedef uint32_t zip_uint32_t;
+#elif defined(HAVE___INT32_LIBZIP)
+typedef unsigned __int32 zip_uint32_t;
 #elif defined(INT_LIBZIP) && INT_LIBZIP == 4
 typedef unsigned int zip_uint32_t;
 #elif defined(LONG_LIBZIP) && LONG_LIBZIP == 4
@@ -68,16 +85,20 @@ typedef unsigned long zip_uint32_t;
 #endif
 #if defined(HAVE_INT64_T_LIBZIP)
 typedef int64_t zip_int64_t;
+#elif defined(HAVE___INT64_LIBZIP)
+typedef __int64 zip_int64_t;
 #elif defined(LONG_LIBZIP) && LONG_LIBZIP == 8
 typedef signed long zip_int64_t;
-#elif defined(LONGLONG_LIBZIP) && LONGLONG_LIBZIP == 8
+#elif defined(LONG_LONG_LIBZIP) && LONG_LONG_LIBZIP == 8
 typedef signed long long zip_int64_t;
 #endif
 #if defined(HAVE_UINT64_T_LIBZIP)
 typedef uint64_t zip_uint64_t;
-#elif defined(LONG_LIBZIP) && LONGLONG_LIBZIP == 8
+#elif defined(HAVE___INT64_LIBZIP)
+typedef unsigned __int64 zip_uint64_t;
+#elif defined(LONG_LIBZIP) && LONG_LONG_LIBZIP == 8
 typedef unsigned long zip_uint64_t;
-#elif defined(LONGLONG_LIBZIP) && LONGLONG_LIBZIP == 8
+#elif defined(LONG_LONG_LIBZIP) && LONG_LONG_LIBZIP == 8
 typedef unsigned long long zip_uint64_t;
 #endif
 
diff --git a/compile b/compile
index c0096a7..531136b 100755 (executable)
--- a/compile
+++ b/compile
@@ -1,10 +1,9 @@
 #! /bin/sh
-# Wrapper for compilers which do not understand `-c -o'.
+# Wrapper for compilers which do not understand '-c -o'.
 
-scriptversion=2009-10-06.20; # UTC
+scriptversion=2012-10-14.11; # UTC
 
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009  Free Software
-# Foundation, Inc.
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
 # Written by Tom Tromey <tromey@cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
@@ -29,21 +28,224 @@ scriptversion=2009-10-06.20; # UTC
 # bugs to <bug-automake@gnu.org> or send patches to
 # <automake-patches@gnu.org>.
 
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""       $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+       # lazily determine how to convert abs files
+       case `uname -s` in
+         MINGW*)
+           file_conv=mingw
+           ;;
+         CYGWIN*)
+           file_conv=cygwin
+           ;;
+         *)
+           file_conv=wine
+           ;;
+       esac
+      fi
+      case $file_conv/,$2, in
+       *,$file_conv,*)
+         ;;
+       mingw/*)
+         file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+         ;;
+       cygwin/*)
+         file=`cygpath -m "$file" || echo "$file"`
+         ;;
+       wine/*)
+         file=`winepath -w "$file" || echo "$file"`
+         ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+       -o)
+         # configure might choose to run compile as 'compile cc -o foo foo.c'.
+         eat=1
+         case $2 in
+           *.o | *.[oO][bB][jJ])
+             func_file_conv "$2"
+             set x "$@" -Fo"$file"
+             shift
+             ;;
+           *)
+             func_file_conv "$2"
+             set x "$@" -Fe"$file"
+             shift
+             ;;
+         esac
+         ;;
+       -I)
+         eat=1
+         func_file_conv "$2" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -I*)
+         func_file_conv "${1#-I}" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -l)
+         eat=1
+         func_cl_dashl "$2"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -l*)
+         func_cl_dashl "${1#-l}"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -L)
+         eat=1
+         func_cl_dashL "$2"
+         ;;
+       -L*)
+         func_cl_dashL "${1#-L}"
+         ;;
+       -static)
+         shared=false
+         ;;
+       -Wl,*)
+         arg=${1#-Wl,}
+         save_ifs="$IFS"; IFS=','
+         for flag in $arg; do
+           IFS="$save_ifs"
+           linker_opts="$linker_opts $flag"
+         done
+         IFS="$save_ifs"
+         ;;
+       -Xlinker)
+         eat=1
+         linker_opts="$linker_opts $2"
+         ;;
+       -*)
+         set x "$@" "$1"
+         shift
+         ;;
+       *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+         func_file_conv "$1"
+         set x "$@" -Tp"$file"
+         shift
+         ;;
+       *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+         func_file_conv "$1" mingw
+         set x "$@" "$file"
+         shift
+         ;;
+       *)
+         set x "$@" "$1"
+         shift
+         ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
 case $1 in
   '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
      exit 1;
      ;;
   -h | --h*)
     cat <<\EOF
 Usage: compile [--help] [--version] PROGRAM [ARGS]
 
-Wrapper for compilers which do not understand `-c -o'.
-Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
 arguments, and rename the output as expected.
 
 If you are trying to build a whole package this is not the
-right script to run: please start by reading the file `INSTALL'.
+right script to run: please start by reading the file 'INSTALL'.
 
 Report bugs to <bug-automake@gnu.org>.
 EOF
@@ -53,11 +255,13 @@ EOF
     echo "compile $scriptversion"
     exit $?
     ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
 esac
 
 ofile=
 cfile=
-eat=
 
 for arg
 do
@@ -66,8 +270,8 @@ do
   else
     case $1 in
       -o)
-       # configure might choose to run compile as `compile cc -o foo foo.c'.
-       # So we strip `-o arg' only if arg is an object.
+       # configure might choose to run compile as 'compile cc -o foo foo.c'.
+       # So we strip '-o arg' only if arg is an object.
        eat=1
        case $2 in
          *.o | *.obj)
@@ -94,10 +298,10 @@ do
 done
 
 if test -z "$ofile" || test -z "$cfile"; then
-  # If no `-o' option was seen then we might have been invoked from a
+  # If no '-o' option was seen then we might have been invoked from a
   # pattern rule where we don't need one.  That is ok -- this is a
   # normal compilation that the losing compiler can handle.  If no
-  # `.c' file was seen then we are probably linking.  That is also
+  # '.c' file was seen then we are probably linking.  That is also
   # ok.
   exec "$@"
 fi
@@ -106,7 +310,7 @@ fi
 cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
 
 # Create the lock directory.
-# Note: use `[/\\:.-]' here to ensure that we don't use the same name
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
 # that we are using for the .o file.  Also, base the name on the expected
 # object file name, since that is what matters with a parallel build.
 lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
index c2246a4..d622a44 100755 (executable)
@@ -1,10 +1,10 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-#   Free Software Foundation, Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
 
-timestamp='2009-12-30'
+timestamp='2012-02-10'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -17,9 +17,7 @@ timestamp='2009-12-30'
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -57,8 +55,8 @@ GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
-Software Foundation, Inc.
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -145,7 +143,7 @@ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:NetBSD:*:*)
        # NetBSD (nbsd) targets should (where applicable) match one or
-       # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
        # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
        # switched to ELF, *-*-netbsd* would select the old
        # object file format.  This provides both forward
@@ -181,7 +179,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
                fi
                ;;
            *)
-               os=netbsd
+               os=netbsd
                ;;
        esac
        # The OS release
@@ -224,7 +222,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
                UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
                ;;
        *5.*)
-               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
                ;;
        esac
        # According to Compaq, /usr/sbin/psrinfo has been available on
@@ -270,7 +268,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        # A Xn.n version is an unreleased experimental baselevel.
        # 1.2 uses "1.2" for uname -r.
        echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-       exit ;;
+       # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+       exitcode=$?
+       trap '' 0
+       exit $exitcode ;;
     Alpha\ *:Windows_NT*:*)
        # How do we know it's Interix rather than the generic POSIX subsystem?
        # Should we change UNAME_MACHINE based on the output of uname instead
@@ -296,7 +297,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        echo s390-ibm-zvmoe
        exit ;;
     *:OS400:*:*)
-        echo powerpc-ibm-os400
+       echo powerpc-ibm-os400
        exit ;;
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
        echo arm-acorn-riscix${UNAME_RELEASE}
@@ -395,23 +396,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     # MiNT.  But MiNT is downward compatible to TOS, so this should
     # be no problem.
     atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+       echo m68k-atari-mint${UNAME_RELEASE}
        exit ;;
     atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
        echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
+       exit ;;
     *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+       echo m68k-atari-mint${UNAME_RELEASE}
        exit ;;
     milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
+       echo m68k-milan-mint${UNAME_RELEASE}
+       exit ;;
     hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
+       echo m68k-hades-mint${UNAME_RELEASE}
+       exit ;;
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
+       echo m68k-unknown-mint${UNAME_RELEASE}
+       exit ;;
     m68k:machten:*:*)
        echo m68k-apple-machten${UNAME_RELEASE}
        exit ;;
@@ -481,8 +482,8 @@ EOF
        echo m88k-motorola-sysv3
        exit ;;
     AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
+       # DG/UX returns AViiON for all architectures
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
        if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
        then
            if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
@@ -495,7 +496,7 @@ EOF
        else
            echo i586-dg-dgux${UNAME_RELEASE}
        fi
-       exit ;;
+       exit ;;
     M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
        echo m88k-dolphin-sysv3
        exit ;;
@@ -552,7 +553,7 @@ EOF
                echo rs6000-ibm-aix3.2
        fi
        exit ;;
-    *:AIX:*:[456])
+    *:AIX:*:[4567])
        IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
        if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
                IBM_ARCH=rs6000
@@ -595,52 +596,52 @@ EOF
            9000/[678][0-9][0-9])
                if [ -x /usr/bin/getconf ]; then
                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
+                   sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                   case "${sc_cpu_version}" in
+                     523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                     528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                     532)                      # CPU_PA_RISC2_0
+                       case "${sc_kernel_bits}" in
+                         32) HP_ARCH="hppa2.0n" ;;
+                         64) HP_ARCH="hppa2.0w" ;;
                          '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-                        esac ;;
-                    esac
+                       esac ;;
+                   esac
                fi
                if [ "${HP_ARCH}" = "" ]; then
                    eval $set_cc_for_build
-                   sed 's/^              //' << EOF >$dummy.c
+                   sed 's/^            //' << EOF >$dummy.c
 
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
+               #define _HPUX_SOURCE
+               #include <stdlib.h>
+               #include <unistd.h>
 
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
+               int main ()
+               {
+               #if defined(_SC_KERNEL_BITS)
+                   long bits = sysconf(_SC_KERNEL_BITS);
+               #endif
+                   long cpu  = sysconf (_SC_CPU_VERSION);
 
-                  switch (cpu)
-               {
-               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-               case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-                   switch (bits)
-                       {
-                       case 64: puts ("hppa2.0w"); break;
-                       case 32: puts ("hppa2.0n"); break;
-                       default: puts ("hppa2.0"); break;
-                       } break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-                   puts ("hppa2.0"); break;
-              #endif
-               default: puts ("hppa1.0"); break;
-               }
-                  exit (0);
-              }
+                   switch (cpu)
+                       {
+                       case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+                       case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+                       case CPU_PA_RISC2_0:
+               #if defined(_SC_KERNEL_BITS)
+                           switch (bits)
+                               {
+                               case 64: puts ("hppa2.0w"); break;
+                               case 32: puts ("hppa2.0n"); break;
+                               default: puts ("hppa2.0"); break;
+                               } break;
+               #else  /* !defined(_SC_KERNEL_BITS) */
+                           puts ("hppa2.0"); break;
+               #endif
+                       default: puts ("hppa1.0"); break;
+                       }
+                   exit (0);
+               }
 EOF
                    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
                    test -z "$HP_ARCH" && HP_ARCH=hppa
@@ -731,22 +732,22 @@ EOF
        exit ;;
     C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
        echo c1-convex-bsd
-        exit ;;
+       exit ;;
     C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
        if getsysinfo -f scalar_acc
        then echo c32-convex-bsd
        else echo c2-convex-bsd
        fi
-        exit ;;
+       exit ;;
     C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
        echo c34-convex-bsd
-        exit ;;
+       exit ;;
     C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
        echo c38-convex-bsd
-        exit ;;
+       exit ;;
     C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
        echo c4-convex-bsd
-        exit ;;
+       exit ;;
     CRAY*Y-MP:*:*:*)
        echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
        exit ;;
@@ -770,14 +771,14 @@ EOF
        exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
        FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit ;;
+       FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+       FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+       echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
     5000:UNIX_System_V:4.*:*)
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+       FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+       echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
        exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
        echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
@@ -789,13 +790,12 @@ EOF
        echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
        exit ;;
     *:FreeBSD:*:*)
-       case ${UNAME_MACHINE} in
-           pc98)
-               echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
+       case ${UNAME_PROCESSOR} in
            amd64)
                echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
            *)
-               echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+               echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
        esac
        exit ;;
     i*:CYGWIN*:*)
@@ -804,15 +804,18 @@ EOF
     *:MINGW*:*)
        echo ${UNAME_MACHINE}-pc-mingw32
        exit ;;
+    i*:MSYS*:*)
+       echo ${UNAME_MACHINE}-pc-msys
+       exit ;;
     i*:windows32*:*)
-       # uname -m includes "-pc" on this system.
-       echo ${UNAME_MACHINE}-mingw32
+       # uname -m includes "-pc" on this system.
+       echo ${UNAME_MACHINE}-mingw32
        exit ;;
     i*:PW*:*)
        echo ${UNAME_MACHINE}-pc-pw32
        exit ;;
     *:Interix*:*)
-       case ${UNAME_MACHINE} in
+       case ${UNAME_MACHINE} in
            x86)
                echo i586-pc-interix${UNAME_RELEASE}
                exit ;;
@@ -858,6 +861,13 @@ EOF
     i*86:Minix:*:*)
        echo ${UNAME_MACHINE}-pc-minix
        exit ;;
+    aarch64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    aarch64_be:Linux:*:*)
+       UNAME_MACHINE=aarch64_be
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
     alpha:Linux:*:*)
        case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
          EV5)   UNAME_MACHINE=alphaev5 ;;
@@ -867,7 +877,7 @@ EOF
          EV6)   UNAME_MACHINE=alphaev6 ;;
          EV67)  UNAME_MACHINE=alphaev67 ;;
          EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
+       esac
        objdump --private-headers /bin/sh | grep -q ld.so.1
        if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
        echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
@@ -879,20 +889,29 @@ EOF
        then
            echo ${UNAME_MACHINE}-unknown-linux-gnu
        else
-           echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+           if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+               | grep -q __ARM_PCS_VFP
+           then
+               echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+           else
+               echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+           fi
        fi
        exit ;;
     avr32*:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-gnu
        exit ;;
     cris:Linux:*:*)
-       echo cris-axis-linux-gnu
+       echo ${UNAME_MACHINE}-axis-linux-gnu
        exit ;;
     crisv32:Linux:*:*)
-       echo crisv32-axis-linux-gnu
+       echo ${UNAME_MACHINE}-axis-linux-gnu
        exit ;;
     frv:Linux:*:*)
-       echo frv-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    hexagon:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
        exit ;;
     i*86:Linux:*:*)
        LIBC=gnu
@@ -934,7 +953,7 @@ EOF
        test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
        ;;
     or32:Linux:*:*)
-       echo or32-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
        exit ;;
     padre:Linux:*:*)
        echo sparc-unknown-linux-gnu
@@ -960,7 +979,7 @@ EOF
        echo ${UNAME_MACHINE}-ibm-linux
        exit ;;
     sh64*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
        exit ;;
     sh*:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-gnu
@@ -968,14 +987,17 @@ EOF
     sparc:Linux:*:* | sparc64:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-gnu
        exit ;;
+    tile*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
     vax:Linux:*:*)
        echo ${UNAME_MACHINE}-dec-linux-gnu
        exit ;;
     x86_64:Linux:*:*)
-       echo x86_64-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
        exit ;;
     xtensa*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
        exit ;;
     i*86:DYNIX/ptx:4*:*)
        # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
@@ -984,11 +1006,11 @@ EOF
        echo i386-sequent-sysv4
        exit ;;
     i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
+       # Unixware is an offshoot of SVR4, but it has its own version
+       # number series starting with 2...
+       # I am not positive that other SVR4 systems won't match this,
        # I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
+       # Use sysv4.2uw... so that sysv4* matches it.
        echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
        exit ;;
     i*86:OS/2:*:*)
@@ -1020,7 +1042,7 @@ EOF
        fi
        exit ;;
     i*86:*:5:[678]*)
-       # UnixWare 7.x, OpenUNIX and OpenServer 6.
+       # UnixWare 7.x, OpenUNIX and OpenServer 6.
        case `/bin/uname -X | grep "^Machine"` in
            *486*)           UNAME_MACHINE=i486 ;;
            *Pentium)        UNAME_MACHINE=i586 ;;
@@ -1048,13 +1070,13 @@ EOF
        exit ;;
     pc:*:*:*)
        # Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i586.
+       # uname -m prints for DJGPP always 'pc', but it prints nothing about
+       # the processor, so we play safe by assuming i586.
        # Note: whatever this is, it MUST be the same as what config.sub
        # prints for the "djgpp" host, or else GDB configury will decide that
        # this is a cross-build.
        echo i586-pc-msdosdjgpp
-        exit ;;
+       exit ;;
     Intel:Mach:3*:*)
        echo i386-pc-mach3
        exit ;;
@@ -1089,8 +1111,8 @@ EOF
        /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
          && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
     3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4; exit; } ;;
     NCR*:*:4.2:* | MPRAS*:*:4.2:*)
        OS_REL='.3'
        test -r /etc/.relid \
@@ -1133,10 +1155,10 @@ EOF
                echo ns32k-sni-sysv
        fi
        exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
+    PENTIUM:*:4.0*:*)  # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                       # says <Richard.M.Bartel@ccMail.Census.GOV>
+       echo i586-unisys-sysv4
+       exit ;;
     *:UNIX_System_V:4*:FTX*)
        # From Gerald Hewes <hewes@openmarket.com>.
        # How about differentiating between stratus architectures? -djm
@@ -1162,11 +1184,11 @@ EOF
        exit ;;
     R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
        if [ -d /usr/nec ]; then
-               echo mips-nec-sysv${UNAME_RELEASE}
+               echo mips-nec-sysv${UNAME_RELEASE}
        else
-               echo mips-unknown-sysv${UNAME_RELEASE}
+               echo mips-unknown-sysv${UNAME_RELEASE}
        fi
-        exit ;;
+       exit ;;
     BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
        echo powerpc-be-beos
        exit ;;
@@ -1231,6 +1253,9 @@ EOF
     *:QNX:*:4*)
        echo i386-pc-qnx
        exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+       echo neo-tandem-nsk${UNAME_RELEASE}
+       exit ;;
     NSE-?:NONSTOP_KERNEL:*:*)
        echo nse-tandem-nsk${UNAME_RELEASE}
        exit ;;
@@ -1276,13 +1301,13 @@ EOF
        echo pdp10-unknown-its
        exit ;;
     SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
+       echo mips-sei-seiux${UNAME_RELEASE}
        exit ;;
     *:DragonFly:*:*)
        echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
        exit ;;
     *:*VMS:*:*)
-       UNAME_MACHINE=`(uname -p) 2>/dev/null`
+       UNAME_MACHINE=`(uname -p) 2>/dev/null`
        case "${UNAME_MACHINE}" in
            A*) echo alpha-dec-vms ; exit ;;
            I*) echo ia64-dec-vms ; exit ;;
@@ -1300,6 +1325,9 @@ EOF
     i*86:AROS:*:*)
        echo ${UNAME_MACHINE}-pc-aros
        exit ;;
+    x86_64:VMkernel:*:*)
+       echo ${UNAME_MACHINE}-unknown-esx
+       exit ;;
 esac
 
 #echo '(No uname command or uname output not recognized.)' 1>&2
@@ -1322,11 +1350,11 @@ main ()
 #include <sys/param.h>
   printf ("m68k-sony-newsos%s\n",
 #ifdef NEWSOS4
-          "4"
+       "4"
 #else
-         ""
+       ""
 #endif
-         ); exit (0);
+       ); exit (0);
 #endif
 #endif
 
index 46c9610..f77801f 100644 (file)
@@ -13,6 +13,9 @@
 /* Define to 1 if you have the `ftello' function. */
 #undef HAVE_FTELLO
 
+/* Define to 1 if you have the <fts.h> header file. */
+#undef HAVE_FTS_H
+
 /* Define to 1 if you have the `getopt' function. */
 #undef HAVE_GETOPT
 
 /* Define to 1 if you have the `snprintf' function. */
 #undef HAVE_SNPRINTF
 
+/* Define to 1 if the system has the type `ssize_t'. */
+#undef HAVE_SSIZE_T
+
+/* Define to 1 if you have the <stdbool.h> header file. */
+#undef HAVE_STDBOOL_H
+
 /* Define to 1 if you have the <stdint.h> header file. */
 #undef HAVE_STDINT_H
 
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
+/* Define to 1 or 0, depending whether the compiler supports simple visibility
+   declarations. */
+#undef HAVE_VISIBILITY
+
+/* Define to 1 if you have the `_close' function. */
+#undef HAVE__CLOSE
+
+/* Define to 1 if you have the `_dup' function. */
+#undef HAVE__DUP
+
+/* Define to 1 if you have the `_fdopen' function. */
+#undef HAVE__FDOPEN
+
+/* Define to 1 if you have the `_fileno' function. */
+#undef HAVE__FILENO
+
 /* Define to 1 if you have the `_open' function. */
 #undef HAVE__OPEN
 
 /* Define to 1 if you have the `_snprintf' function. */
 #undef HAVE__SNPRINTF
 
-/* Define to 1 if you have the `_strcmpi' function. */
-#undef HAVE__STRCMPI
-
 /* Define to 1 if you have the `_strdup' function. */
 #undef HAVE__STRDUP
 
    */
 #undef LT_OBJDIR
 
-/* Define to 1 if your C compiler doesn't accept -c and -o together. */
-#undef NO_MINUS_C_MINUS_O
-
 /* Name of package */
 #undef PACKAGE
 
 /* The size of `long long', as computed by sizeof. */
 #undef SIZEOF_LONG_LONG
 
+/* The size of `off_t', as computed by sizeof. */
+#undef SIZEOF_OFF_T
+
 /* The size of `short', as computed by sizeof. */
 #undef SIZEOF_SHORT
 
+/* The size of `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
 
 
 /* Version number of package */
 #undef VERSION
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+
+#ifndef HAVE_SSIZE_T
+#  if SIZEOF_SIZE_T == SIZEOF_INT
+typedef int ssize_t;
+#  elif SIZEOF_SIZE_T == SIZEOF_LONG
+typedef long ssize_t;
+#  elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG
+typedef long long ssize_t;
+#  else
+#error no suitable type for ssize_t found
+#  endif
+#endif
+
index 8518609..59bb593 100755 (executable)
@@ -1,10 +1,10 @@
 #! /bin/sh
 # Configuration validation subroutine script.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-#   Free Software Foundation, Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
 
-timestamp='2009-12-31'
+timestamp='2012-04-18'
 
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
@@ -21,9 +21,7 @@ timestamp='2009-12-31'
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -76,8 +74,8 @@ version="\
 GNU config.sub ($timestamp)
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
-Software Foundation, Inc.
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -124,13 +122,18 @@ esac
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
   *)
     basic_machine=`echo $1 | sed 's/-[^-]*$//'`
     if [ $basic_machine != $1 ]
@@ -157,8 +160,8 @@ case $os in
                os=
                basic_machine=$1
                ;;
-        -bluegene*)
-               os=-cnk
+       -bluegene*)
+               os=-cnk
                ;;
        -sim | -cisco | -oki | -wec | -winbond)
                os=
@@ -174,10 +177,10 @@ case $os in
                os=-chorusos
                basic_machine=$1
                ;;
-       -chorusrdb)
-               os=-chorusrdb
+       -chorusrdb)
+               os=-chorusrdb
                basic_machine=$1
-               ;;
+               ;;
        -hiux*)
                os=-hiuxwe2
                ;;
@@ -222,6 +225,12 @@ case $os in
        -isc*)
                basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
                ;;
+       -lynx*178)
+               os=-lynxos178
+               ;;
+       -lynx*5)
+               os=-lynxos5
+               ;;
        -lynx*)
                os=-lynxos
                ;;
@@ -246,17 +255,22 @@ case $basic_machine in
        # Some are omitted here because they have special meanings below.
        1750a | 580 \
        | a29k \
+       | aarch64 | aarch64_be \
        | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
        | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
        | am33_2.0 \
        | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+        | be32 | be64 \
        | bfin \
        | c4x | clipper \
        | d10v | d30v | dlx | dsp16xx \
+       | epiphany \
        | fido | fr30 | frv \
        | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | hexagon \
        | i370 | i860 | i960 | ia64 \
        | ip2k | iq2000 \
+       | le32 | le64 \
        | lm32 \
        | m32c | m32r | m32rle | m68000 | m68k | m88k \
        | maxq | mb | microblaze | mcore | mep | metag \
@@ -282,29 +296,39 @@ case $basic_machine in
        | moxie \
        | mt \
        | msp430 \
+       | nds32 | nds32le | nds32be \
        | nios | nios2 \
        | ns16k | ns32k \
+       | open8 \
        | or32 \
        | pdp10 | pdp11 | pj | pjl \
-       | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+       | powerpc | powerpc64 | powerpc64le | powerpcle \
        | pyramid \
-       | rx \
+       | rl78 | rx \
        | score \
        | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
        | sh64 | sh64le \
        | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
        | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-       | spu | strongarm \
-       | tahoe | thumb | tic4x | tic80 | tron \
+       | spu \
+       | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
        | ubicom32 \
-       | v850 | v850e \
+       | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
        | we32k \
-       | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+       | x86 | xc16x | xstormy16 | xtensa \
        | z8k | z80)
                basic_machine=$basic_machine-unknown
                ;;
-       m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-               # Motorola 68HC11/12.
+       c54x)
+               basic_machine=tic54x-unknown
+               ;;
+       c55x)
+               basic_machine=tic55x-unknown
+               ;;
+       c6x)
+               basic_machine=tic6x-unknown
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
                basic_machine=$basic_machine-unknown
                os=-none
                ;;
@@ -314,6 +338,21 @@ case $basic_machine in
                basic_machine=mt-unknown
                ;;
 
+       strongarm | thumb | xscale)
+               basic_machine=arm-unknown
+               ;;
+       xgate)
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       xscaleeb)
+               basic_machine=armeb-unknown
+               ;;
+
+       xscaleel)
+               basic_machine=armel-unknown
+               ;;
+
        # We use `pc' rather than `unknown'
        # because (1) that's what they normally are, and
        # (2) the word "unknown" tends to confuse beginning users.
@@ -328,21 +367,25 @@ case $basic_machine in
        # Recognize the basic CPU types with company name.
        580-* \
        | a29k-* \
+       | aarch64-* | aarch64_be-* \
        | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
        | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
        | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
        | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
        | avr-* | avr32-* \
+       | be32-* | be64-* \
        | bfin-* | bs2000-* \
-       | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+       | c[123]* | c30-* | [cjt]90-* | c4x-* \
        | clipper-* | craynv-* | cydra-* \
        | d10v-* | d30v-* | dlx-* \
        | elxsi-* \
        | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
        | h8300-* | h8500-* \
        | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | hexagon-* \
        | i*86-* | i860-* | i960-* | ia64-* \
        | ip2k-* | iq2000-* \
+       | le32-* | le64-* \
        | lm32-* \
        | m32c-* | m32r-* | m32rle-* \
        | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
@@ -368,25 +411,29 @@ case $basic_machine in
        | mmix-* \
        | mt-* \
        | msp430-* \
+       | nds32-* | nds32le-* | nds32be-* \
        | nios-* | nios2-* \
        | none-* | np1-* | ns16k-* | ns32k-* \
+       | open8-* \
        | orion-* \
        | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
        | pyramid-* \
-       | romp-* | rs6000-* | rx-* \
+       | rl78-* | romp-* | rs6000-* | rx-* \
        | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
        | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
        | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
        | sparclite-* \
-       | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-       | tahoe-* | thumb-* \
-       | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+       | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+       | tahoe-* \
+       | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+       | tile*-* \
        | tron-* \
        | ubicom32-* \
-       | v850-* | v850e-* | vax-* \
+       | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+       | vax-* \
        | we32k-* \
-       | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+       | x86-* | x86_64-* | xc16x-* | xps100-* \
        | xstormy16-* | xtensa*-* \
        | ymp-* \
        | z8k-* | z80-*)
@@ -411,7 +458,7 @@ case $basic_machine in
                basic_machine=a29k-amd
                os=-udi
                ;;
-       abacus)
+       abacus)
                basic_machine=abacus-unknown
                ;;
        adobe68k)
@@ -481,11 +528,20 @@ case $basic_machine in
                basic_machine=powerpc-ibm
                os=-cnk
                ;;
+       c54x-*)
+               basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c55x-*)
+               basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c6x-*)
+               basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
        c90)
                basic_machine=c90-cray
                os=-unicos
                ;;
-        cegcc)
+       cegcc)
                basic_machine=arm-unknown
                os=-cegcc
                ;;
@@ -517,7 +573,7 @@ case $basic_machine in
                basic_machine=craynv-cray
                os=-unicosmp
                ;;
-       cr16)
+       cr16 | cr16-*)
                basic_machine=cr16-unknown
                os=-elf
                ;;
@@ -675,7 +731,6 @@ case $basic_machine in
        i370-ibm* | ibm*)
                basic_machine=i370-ibm
                ;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
        i*86v32)
                basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
                os=-sysv32
@@ -733,7 +788,7 @@ case $basic_machine in
                basic_machine=ns32k-utek
                os=-sysv
                ;;
-        microblaze)
+       microblaze)
                basic_machine=microblaze-xilinx
                ;;
        mingw32)
@@ -772,10 +827,18 @@ case $basic_machine in
        ms1-*)
                basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
                ;;
+       msys)
+               basic_machine=i386-pc
+               os=-msys
+               ;;
        mvs)
                basic_machine=i370-ibm
                os=-mvs
                ;;
+       nacl)
+               basic_machine=le32-unknown
+               os=-nacl
+               ;;
        ncr3000)
                basic_machine=i486-ncr
                os=-sysv4
@@ -840,6 +903,12 @@ case $basic_machine in
        np1)
                basic_machine=np1-gould
                ;;
+       neo-tandem)
+               basic_machine=neo-tandem
+               ;;
+       nse-tandem)
+               basic_machine=nse-tandem
+               ;;
        nsr-tandem)
                basic_machine=nsr-tandem
                ;;
@@ -922,9 +991,10 @@ case $basic_machine in
                ;;
        power)  basic_machine=power-ibm
                ;;
-       ppc)    basic_machine=powerpc-unknown
+       ppc | ppcbe)    basic_machine=powerpc-unknown
                ;;
-       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+       ppc-* | ppcbe-*)
+               basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
                ;;
        ppcle | powerpclittle | ppc-le | powerpc-little)
                basic_machine=powerpcle-unknown
@@ -1018,6 +1088,9 @@ case $basic_machine in
                basic_machine=i860-stratus
                os=-sysv4
                ;;
+       strongarm-* | thumb-*)
+               basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
        sun2)
                basic_machine=m68000-sun
                ;;
@@ -1074,20 +1147,8 @@ case $basic_machine in
                basic_machine=t90-cray
                os=-unicos
                ;;
-       tic54x | c54x*)
-               basic_machine=tic54x-unknown
-               os=-coff
-               ;;
-       tic55x | c55x*)
-               basic_machine=tic55x-unknown
-               os=-coff
-               ;;
-       tic6x | c6x*)
-               basic_machine=tic6x-unknown
-               os=-coff
-               ;;
        tile*)
-               basic_machine=tile-unknown
+               basic_machine=$basic_machine-unknown
                os=-linux-gnu
                ;;
        tx39)
@@ -1157,6 +1218,9 @@ case $basic_machine in
        xps | xps100)
                basic_machine=xps100-honeywell
                ;;
+       xscale-* | xscalee[bl]-*)
+               basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+               ;;
        ymp)
                basic_machine=ymp-cray
                os=-unicos
@@ -1254,11 +1318,11 @@ esac
 if [ x"$os" != x"" ]
 then
 case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
+       # First match some system type aliases
+       # that might get confused with valid system types.
        # -solaris* is a basic system type, with this one exception.
-        -auroraux)
-               os=-auroraux
+       -auroraux)
+               os=-auroraux
                ;;
        -solaris1 | -solaris1.*)
                os=`echo $os | sed -e 's|solaris1|sunos4|'`
@@ -1294,8 +1358,9 @@ case $os in
              | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
              | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
              | -chorusos* | -chorusrdb* | -cegcc* \
-             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-             | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+             | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -linux-android* \
+             | -linux-newlib* | -linux-uclibc* \
              | -uxpv* | -beos* | -mpeix* | -udk* \
              | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
              | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
@@ -1342,7 +1407,7 @@ case $os in
        -opened*)
                os=-openedition
                ;;
-        -os400*)
+       -os400*)
                os=-os400
                ;;
        -wince*)
@@ -1391,7 +1456,7 @@ case $os in
        -sinix*)
                os=-sysv4
                ;;
-        -tpf*)
+       -tpf*)
                os=-tpf
                ;;
        -triton*)
@@ -1436,8 +1501,8 @@ case $os in
        -dicos*)
                os=-dicos
                ;;
-        -nacl*)
-               ;;
+       -nacl*)
+               ;;
        -none)
                ;;
        *)
@@ -1460,10 +1525,10 @@ else
 # system, and we'll never get to this point.
 
 case $basic_machine in
-        score-*)
+       score-*)
                os=-elf
                ;;
-        spu-*)
+       spu-*)
                os=-elf
                ;;
        *-acorn)
@@ -1475,8 +1540,17 @@ case $basic_machine in
        arm*-semi)
                os=-aout
                ;;
-        c4x-* | tic4x-*)
-               os=-coff
+       c4x-* | tic4x-*)
+               os=-coff
+               ;;
+       tic54x-*)
+               os=-coff
+               ;;
+       tic55x-*)
+               os=-coff
+               ;;
+       tic6x-*)
+               os=-coff
                ;;
        # This must come before the *-dec entry.
        pdp10-*)
@@ -1496,14 +1570,11 @@ case $basic_machine in
                ;;
        m68000-sun)
                os=-sunos3
-               # This also exists in the configure program, but was not the
-               # default.
-               # os=-sunos4
                ;;
        m68*-cisco)
                os=-aout
                ;;
-        mep-*)
+       mep-*)
                os=-elf
                ;;
        mips*-cisco)
@@ -1530,7 +1601,7 @@ case $basic_machine in
        *-ibm)
                os=-aix
                ;;
-       *-knuth)
+       *-knuth)
                os=-mmixware
                ;;
        *-wec)
index 0afd8c4..5e5ded0 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,13 +1,11 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for libzip 0.10.1.
+# Generated by GNU Autoconf 2.69 for libzip 1.0.1.
 #
-# Report bugs to <libzip-discuss@nih.at>.
+# Report bugs to <libzip@nih.at>.
 #
 #
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
 #
 #
 # This configure script is free software; the Free Software Foundation
@@ -136,6 +134,31 @@ export LANGUAGE
 # CDPATH.
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
 if test "x$CONFIG_SHELL" = x; then
   as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
@@ -169,11 +192,20 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
 else
   exitcode=1; echo positional parameters were not saved.
 fi
-test x\$exitcode = x0 || exit 1"
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
   as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
   as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
   test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
 test \$(( 1 + 1 )) = 2 || exit 1"
   if (eval "$as_required") 2>/dev/null; then :
   as_have_required=yes
@@ -214,21 +246,25 @@ IFS=$as_save_IFS
 
 
       if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-       # neutralization value for shells without unset; and this also
-       # works around shells that cannot unset nonexistent variables.
-       # Preserve -v and -x to the replacement shell.
-       BASH_ENV=/dev/null
-       ENV=/dev/null
-       (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-       export CONFIG_SHELL
-       case $- in # ((((
-         *v*x* | *x*v* ) as_opts=-vx ;;
-         *v* ) as_opts=-v ;;
-         *x* ) as_opts=-x ;;
-         * ) as_opts= ;;
-       esac
-       exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
 fi
 
     if test x$as_have_required = xno; then :
@@ -238,11 +274,11 @@ fi
     $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
     $as_echo "$0: be upgraded to zsh 4.3.4 or later."
   else
-    $as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: libzip-discuss@nih.at about your system, including any
-$0: error possibly output before this message. Then install
-$0: a modern shell, or manually run the script under such a
-$0: shell if you do have one."
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and libzip@nih.at
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
   fi
   exit 1
 fi
@@ -331,6 +367,14 @@ $as_echo X"$as_dir" |
 
 
 } # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
 # as_fn_append VAR VALUE
 # ----------------------
 # Append the text in VALUE to the end of the definition contained in VAR. Take
@@ -452,6 +496,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
   chmod +x "$as_me.lineno" ||
     { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
 
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
   # original and so on.  Autoconf is especially sensitive to this).
@@ -486,16 +534,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -507,28 +555,8 @@ else
   as_mkdir_p=false
 fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-       test -d "$1/.";
-      else
-       case $1 in #(
-       -*)set "./$1";;
-       esac;
-       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-       ???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -536,155 +564,8 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
 # Sed expression to map a string onto a valid variable name.
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
-
-
-# Check that we are running under the correct shell.
 SHELL=${CONFIG_SHELL-/bin/sh}
 
-case X$lt_ECHO in
-X*--fallback-echo)
-  # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','`
-  ;;
-esac
-
-ECHO=${lt_ECHO-echo}
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $ECHO works!
-  :
-else
-  # Restart under the correct shell.
-  exec $SHELL "$0" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<_LT_EOF
-$*
-_LT_EOF
-  exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$lt_ECHO"; then
-  if test "X${echo_test_string+set}" != Xset; then
-    # find a string as large as possible, as long as the shell can cope with it
-    for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
-      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
-        { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
-      then
-        break
-      fi
-    done
-  fi
-
-  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-     test "X$echo_testing_string" = "X$echo_test_string"; then
-    :
-  else
-    # The Solaris, AIX, and Digital Unix default echo programs unquote
-    # backslashes.  This makes it impossible to quote backslashes using
-    #   echo "$something" | sed 's/\\/\\\\/g'
-    #
-    # So, first we look for a working echo in the user's PATH.
-
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for dir in $PATH /usr/ucb; do
-      IFS="$lt_save_ifs"
-      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        ECHO="$dir/echo"
-        break
-      fi
-    done
-    IFS="$lt_save_ifs"
-
-    if test "X$ECHO" = Xecho; then
-      # We didn't find a better echo, so look for alternatives.
-      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        # This shell has a builtin print -r that does the trick.
-        ECHO='print -r'
-      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
-          test "X$CONFIG_SHELL" != X/bin/ksh; then
-        # If we have ksh, try running configure again with it.
-        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-        export ORIGINAL_CONFIG_SHELL
-        CONFIG_SHELL=/bin/ksh
-        export CONFIG_SHELL
-        exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
-      else
-        # Try using printf.
-        ECHO='printf %s\n'
-        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-          echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-          test "X$echo_testing_string" = "X$echo_test_string"; then
-         # Cool, printf works
-         :
-        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
-            test "X$echo_testing_string" = 'X\t' &&
-            echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-            test "X$echo_testing_string" = "X$echo_test_string"; then
-         CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-         export CONFIG_SHELL
-         SHELL="$CONFIG_SHELL"
-         export SHELL
-         ECHO="$CONFIG_SHELL $0 --fallback-echo"
-        elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
-            test "X$echo_testing_string" = 'X\t' &&
-            echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-            test "X$echo_testing_string" = "X$echo_test_string"; then
-         ECHO="$CONFIG_SHELL $0 --fallback-echo"
-        else
-         # maybe with a smaller string...
-         prev=:
-
-         for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
-           if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
-           then
-             break
-           fi
-           prev="$cmd"
-         done
-
-         if test "$prev" != 'sed 50q "$0"'; then
-           echo_test_string=`eval $prev`
-           export echo_test_string
-           exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
-         else
-           # Oops.  We lost completely, so just stick with echo.
-           ECHO=echo
-         fi
-        fi
-      fi
-    fi
-  fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-lt_ECHO=$ECHO
-if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
-   lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
-fi
-
-
-
 
 test -n "$DJDIR" || exec 7<&0 </dev/null
 exec 6>&1
@@ -709,9 +590,9 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='libzip'
 PACKAGE_TARNAME='libzip'
-PACKAGE_VERSION='0.10.1'
-PACKAGE_STRING='libzip 0.10.1'
-PACKAGE_BUGREPORT='libzip-discuss@nih.at'
+PACKAGE_VERSION='1.0.1'
+PACKAGE_STRING='libzip 1.0.1'
+PACKAGE_BUGREPORT='libzip@nih.at'
 PACKAGE_URL=''
 
 ac_unique_file="lib/zip_add.c"
@@ -754,6 +635,8 @@ ac_includes_default="\
 ac_subst_vars='am__EXEEXT_FALSE
 am__EXEEXT_TRUE
 LTLIBOBJS
+HAVE_VISIBILITY
+CFLAG_VISIBILITY
 MANFMT
 LIBOBJS
 CPP
@@ -762,9 +645,11 @@ OTOOL
 LIPO
 NMEDIT
 DSYMUTIL
-lt_ECHO
+MANIFEST_TOOL
 RANLIB
+ac_ct_AR
 AR
+DLLTOOL
 OBJDUMP
 LN_S
 NM
@@ -775,18 +660,11 @@ FGREP
 EGREP
 GREP
 SED
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
 LIBTOOL
 am__fastdepCC_FALSE
 am__fastdepCC_TRUE
 CCDEPMODE
+am__nodep
 AMDEPBACKSLASH
 AMDEP_FALSE
 AMDEP_TRUE
@@ -800,6 +678,19 @@ CPPFLAGS
 LDFLAGS
 CFLAGS
 CC
+PKG_CONFIG_RPATH
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
 am__untar
 am__tar
 AMTAR
@@ -864,13 +755,16 @@ SHELL'
 ac_subst_files=''
 ac_user_opts='
 enable_option_checking
+enable_silent_rules
 enable_dependency_tracking
+enable_largefile
 with_zlib
 enable_shared
 enable_static
 with_pic
 enable_fast_install
 with_gnu_ld
+with_sysroot
 enable_libtool_lock
 '
       ac_precious_vars='build_alias
@@ -1337,8 +1231,6 @@ target=$target_alias
 if test "x$host_alias" != x; then
   if test "x$build_alias" = x; then
     cross_compiling=maybe
-    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used" >&2
   elif test "x$build_alias" != "x$host_alias"; then
     cross_compiling=yes
   fi
@@ -1424,7 +1316,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures libzip 0.10.1 to adapt to many kinds of systems.
+\`configure' configures libzip 1.0.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1494,7 +1386,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of libzip 0.10.1:";;
+     short | recursive ) echo "Configuration of libzip 1.0.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1502,8 +1394,13 @@ Optional Features:
   --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-silent-rules   less verbose build output (undo: "make V=1")
+  --disable-silent-rules  verbose build output (undo: "make V=0")
+  --enable-dependency-tracking
+                          do not reject slow dependency extractors
+  --disable-dependency-tracking
+                          speeds up one-time build
+  --disable-largefile     omit support for large files
   --enable-shared[=PKGS]  build shared libraries [default=yes]
   --enable-static[=PKGS]  build static libraries [default=yes]
   --enable-fast-install[=PKGS]
@@ -1514,9 +1411,11 @@ Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
   --with-zlib=PREFIX  specify prefix for ZLIB library
-  --with-pic              try to use only PIC/non-PIC objects [default=use
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                           both]
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot=DIR Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).
 
 Some influential environment variables:
   CC          C compiler command
@@ -1531,7 +1430,7 @@ Some influential environment variables:
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
-Report bugs to <libzip-discuss@nih.at>.
+Report bugs to <libzip@nih.at>.
 _ACEOF
 ac_status=$?
 fi
@@ -1594,10 +1493,10 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-libzip configure 0.10.1
-generated by GNU Autoconf 2.68
+libzip configure 1.0.1
+generated by GNU Autoconf 2.69
 
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
@@ -1673,7 +1572,7 @@ $as_echo "$ac_try_echo"; } >&5
         test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
         test "$cross_compiling" = yes ||
-        $as_test_x conftest$ac_exeext
+        test -x conftest$ac_exeext
        }; then :
   ac_retval=0
 else
@@ -1939,9 +1838,9 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
 $as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ------------------------------------ ##
-## Report this to libzip-discuss@nih.at ##
-## ------------------------------------ ##"
+( $as_echo "## ---------------------------- ##
+## Report this to libzip@nih.at ##
+## ---------------------------- ##"
      ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
@@ -2031,7 +1930,8 @@ int
 main ()
 {
 static int test_array [1 - 2 * !(($2) >= 0)];
-test_array [0] = 0
+test_array [0] = 0;
+return test_array [0];
 
   ;
   return 0;
@@ -2047,7 +1947,8 @@ int
 main ()
 {
 static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
+test_array [0] = 0;
+return test_array [0];
 
   ;
   return 0;
@@ -2073,7 +1974,8 @@ int
 main ()
 {
 static int test_array [1 - 2 * !(($2) < 0)];
-test_array [0] = 0
+test_array [0] = 0;
+return test_array [0];
 
   ;
   return 0;
@@ -2089,7 +1991,8 @@ int
 main ()
 {
 static int test_array [1 - 2 * !(($2) >= $ac_mid)];
-test_array [0] = 0
+test_array [0] = 0;
+return test_array [0];
 
   ;
   return 0;
@@ -2123,7 +2026,8 @@ int
 main ()
 {
 static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
+test_array [0] = 0;
+return test_array [0];
 
   ;
   return 0;
@@ -2298,8 +2202,8 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by libzip $as_me 0.10.1, which was
-generated by GNU Autoconf 2.68.  Invocation command line was
+It was created by libzip $as_me 1.0.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
 
@@ -2650,7 +2554,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 ac_config_headers="$ac_config_headers config.h"
 
 
-am__api_version='1.11'
+am__api_version='1.14'
 
 ac_aux_dir=
 for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
@@ -2718,7 +2622,7 @@ case $as_dir/ in #((
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+       if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
          if test $ac_prog = install &&
            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
            # AIX install.  It has an incompatible calling convention.
@@ -2776,9 +2680,6 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
 $as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
 # Reject unsafe characters in $srcdir or the absolute working directory
 # name.  Accept space and tab only in the latter.
 am_lf='
@@ -2789,32 +2690,40 @@ case `pwd` in
 esac
 case $srcdir in
   *[\\\"\#\$\&\'\`$am_lf\ \    ]*)
-    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
 esac
 
-# Do `set' in a subshell so we don't clobber the current shell's
+# Do 'set' in a subshell so we don't clobber the current shell's
 # arguments.  Must try -L first in case configure is actually a
 # symlink; some systems play weird games with the mod time of symlinks
 # (eg FreeBSD returns the mod time of the symlink's containing
 # directory).
 if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$*" = "X"; then
+       # -L didn't work.
+       set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$*" != "X $srcdir/configure conftest.file" \
+       && test "$*" != "X conftest.file $srcdir/configure"; then
+
+       # If neither matched, then we have a broken ls.  This can happen
+       # if, for instance, CONFIG_SHELL is bash and it inherits a
+       # broken ls alias from the environment.  This has actually
+       # happened.  Such a system could not be considered "sane".
+       as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment" "$LINENO" 5
+     fi
+     if test "$2" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
    test "$2" = conftest.file
    )
 then
@@ -2826,6 +2735,16 @@ Check your system clock" "$LINENO" 5
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
 test "$program_prefix" != NONE &&
   program_transform_name="s&^&$program_prefix&;$program_transform_name"
 # Use a double $ so make ignores it.
@@ -2848,12 +2767,12 @@ if test x"${MISSING+set}" != xset; then
   esac
 fi
 # Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
 else
   am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
 fi
 
 if test x"${install_sh}" != xset; then
@@ -2865,10 +2784,10 @@ if test x"${install_sh}" != xset; then
   esac
 fi
 
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
 # tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
+# will honor the 'STRIP' environment variable to overrule this program.
 if test "$cross_compiling" != no; then
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
@@ -2887,7 +2806,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2927,7 +2846,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_STRIP="strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2978,7 +2897,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_prog in mkdir gmkdir; do
         for ac_exec_ext in '' $ac_executable_extensions; do
-          { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+          as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
           case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
             'mkdir (GNU coreutils) '* | \
             'mkdir (coreutils) '* | \
@@ -3007,12 +2926,6 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
 $as_echo "$MKDIR_P" >&6; }
 
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
 for ac_prog in gawk mawk nawk awk
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -3031,7 +2944,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_AWK="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3095,6 +3008,45 @@ else
 fi
 rmdir .tst 2>/dev/null
 
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
 if test "`cd $srcdir && pwd`" != "`pwd`"; then
   # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
   # is not polluted with repeated "-I."
@@ -3117,7 +3069,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='libzip'
- VERSION='0.10.1'
+ VERSION='1.0.1'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3145,17 +3097,148 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
 
 MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
-# Always define AMTAR for backward compatibility.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar  pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+  fi
+fi
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
 
-AMTAR=${AMTAR-"${am_missing_run}tar"}
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
 
 
+case $host_os in
+    *bsd*)
+        PKG_CONFIG_RPATH=-Wl,-R\${libdir};;
+    *)
+        PKG_CONFIG_RPATH=;;
+esac
 
 
 
@@ -3181,7 +3264,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3221,7 +3304,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3274,7 +3357,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3315,7 +3398,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -3373,7 +3456,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3417,7 +3500,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3863,8 +3946,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <stdarg.h>
 #include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+struct stat;
 /* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
 struct buf { int x; };
 FILE * (*rcsopen) (struct buf *, struct stat *, int);
@@ -3948,6 +4030,65 @@ ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
 DEPDIR="${am__leading_dot}deps"
 
 ac_config_commands="$ac_config_commands depfiles"
@@ -3967,7 +4108,7 @@ am__quote=
 _am_result=none
 # First try GNU make style include.
 echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
+# Ignore all kinds of additional output from 'make'.
 case `$am_make -s -f confmf 2> /dev/null` in #(
 *the\ am__doit\ target*)
   am__include=include
@@ -4000,6 +4141,7 @@ fi
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
+  am__nodep='_no'
 fi
  if test "x$enable_dependency_tracking" != xno; then
   AMDEP_TRUE=
@@ -4022,8 +4164,9 @@ else
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
   # using a relative directory.
@@ -4057,16 +4200,16 @@ else
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -4075,16 +4218,16 @@ else
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
       if test "x$enable_dependency_tracking" = xyes; then
        continue
       else
        break
       fi
       ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -4138,21 +4281,36 @@ else
 fi
 
 
-if test "x$CC" != xcc; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5
-$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5
-$as_echo_n "checking whether cc understands -c and -o together... " >&6; }
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
 fi
-set dummy $CC; ac_cc=`$as_echo "$2" |
-                     sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then :
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+        # IRIX 6.2 and later do not support large files by default,
+        # so use the C compiler's -n32 option if that helps.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
 int
 main ()
 {
@@ -4161,106 +4319,167 @@ main ()
   return 0;
 }
 _ACEOF
-# Make sure it works both with $CC and with simple cc.
-# We do the test twice because some compilers refuse to overwrite an
-# existing .o file with -o, though they will create one.
-ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
-rm -f conftest2.*
-if { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } &&
-   test -f conftest2.$ac_objext && { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; };
-then
-  eval ac_cv_prog_cc_${ac_cc}_c_o=yes
-  if test "x$CC" != xcc; then
-    # Test first that cc exists at all.
-    if { ac_try='cc -c conftest.$ac_ext >&5'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-      ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
-      rm -f conftest2.*
-      if { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } &&
-        test -f conftest2.$ac_objext && { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; };
-      then
-       # cc works too.
-       :
-      else
-       # cc exists but doesn't like -o.
-       eval ac_cv_prog_cc_${ac_cc}_c_o=no
-      fi
+        if ac_fn_c_try_compile "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext
+        CC="$CC -n32"
+        if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+        break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
     fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
   fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  eval ac_cv_prog_cc_${ac_cc}_c_o=no
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
 fi
-rm -f core conftest*
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
 fi
-if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
 
-$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+
 
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
-   # Losing compiler, so override with the script.
-   # FIXME: It is wrong to rewrite CC.
-   # But if we don't then we get into trouble of one sort or another.
-   # A longer-term fix would be to have automake use am__CC in this case,
-   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
-   CC="$am_aux_dir/compile $CC"
 fi
 
 
@@ -4290,7 +4509,6 @@ then
     fi
 fi
 
-
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lz" >&5
 $as_echo_n "checking for main in -lz... " >&6; }
 if ${ac_cv_lib_z_main+:} false; then :
@@ -4341,7 +4559,7 @@ else
 int
 main ()
 {
-extern ZEXPORT unzOpen (const char *path);
+extern ZEXPORT int unzOpen (const char *path);
   ;
   return 0;
 }
@@ -4370,8 +4588,8 @@ esac
 
 
 
-macro_version='2.2.6b'
-macro_revision='1.3017'
+macro_version='2.4.2'
+macro_revision='1.3337'
 
 
 
@@ -4387,75 +4605,73 @@ macro_revision='1.3017'
 
 ltmain="$ac_aux_dir/ltmain.sh"
 
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
 
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
 
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
 esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+
+
+
+
+
+
+
+
+
 
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
@@ -4480,7 +4696,7 @@ do
     for ac_prog in sed gsed; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+      as_fn_executable_p "$ac_path_SED" || continue
 # Check for GNU ac_path_SED and select it if it is found.
   # Check for GNU $ac_path_SED
 case `"$ac_path_SED" --version 2>&1` in
@@ -4556,7 +4772,7 @@ do
     for ac_prog in grep ggrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+      as_fn_executable_p "$ac_path_GREP" || continue
 # Check for GNU ac_path_GREP and select it if it is found.
   # Check for GNU $ac_path_GREP
 case `"$ac_path_GREP" --version 2>&1` in
@@ -4622,7 +4838,7 @@ do
     for ac_prog in egrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+      as_fn_executable_p "$ac_path_EGREP" || continue
 # Check for GNU ac_path_EGREP and select it if it is found.
   # Check for GNU $ac_path_EGREP
 case `"$ac_path_EGREP" --version 2>&1` in
@@ -4689,7 +4905,7 @@ do
     for ac_prog in fgrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+      as_fn_executable_p "$ac_path_FGREP" || continue
 # Check for GNU ac_path_FGREP and select it if it is found.
   # Check for GNU $ac_path_FGREP
 case `"$ac_path_FGREP" --version 2>&1` in
@@ -4923,8 +5139,11 @@ if test "$lt_cv_path_NM" != "no"; then
   NM="$lt_cv_path_NM"
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
@@ -4942,7 +5161,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -4968,7 +5187,7 @@ fi
 fi
 if test -z "$DUMPBIN"; then
   ac_ct_DUMPBIN=$DUMPBIN
-  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+  for ac_prog in dumpbin "link -dump"
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
@@ -4986,7 +5205,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5023,6 +5242,15 @@ esac
   fi
 fi
 
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
 
   if test "$DUMPBIN" != ":"; then
     NM="$DUMPBIN"
@@ -5042,13 +5270,13 @@ if ${lt_cv_nm_interface+:} false; then :
 else
   lt_cv_nm_interface="BSD nm"
   echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:5045: $ac_compile\"" >&5)
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
   (eval "$ac_compile" 2>conftest.err)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:5048: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
   (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:5051: output\"" >&5)
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
   cat conftest.out >&5
   if $GREP 'External.*some_variable' conftest.out > /dev/null; then
     lt_cv_nm_interface="MS dumpbin"
@@ -5105,6 +5333,11 @@ else
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
   amigaos*)
     # On AmigaOS with pdksh, this test takes hours, literally.
     # So we just punt and use a minimum line length of 8192.
@@ -5130,6 +5363,11 @@ else
     lt_cv_sys_max_cmd_len=196608
     ;;
 
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
   osf*)
     # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
     # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
@@ -5169,8 +5407,8 @@ else
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
-                = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+                = "X$teststring$teststring"; } >/dev/null 2>&1 &&
              test $i != 17 # 1/2 MB should be enough
       do
         i=`expr $i + 1`
@@ -5212,8 +5450,8 @@ $as_echo_n "checking whether the shell understands some XSI constructs... " >&6;
 # Try some XSI features
 xsi_shell=no
 ( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
     && eval 'test $(( 1 + 1 )) -eq 2 \
     && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
   && xsi_shell=yes
@@ -5262,6 +5500,80 @@ esac
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
 $as_echo_n "checking for $LD option to reload object files... " >&6; }
 if ${lt_cv_ld_reload_flag+:} false; then :
@@ -5278,6 +5590,11 @@ case $reload_flag in
 esac
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
   darwin*)
     if test "$GCC" = yes; then
       reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
@@ -5312,7 +5629,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5352,7 +5669,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_OBJDUMP="objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5441,16 +5758,18 @@ mingw* | pw32*)
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
-  if ( file / ) >/dev/null 2>&1; then
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
     lt_cv_file_magic_cmd='$OBJDUMP -f'
   fi
   ;;
 
-cegcc)
+cegcc*)
   # use the weaker test based on 'objdump'. See mingw*.
   lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
   lt_cv_file_magic_cmd='$OBJDUMP -f'
@@ -5480,6 +5799,10 @@ gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
 hpux10.20* | hpux11*)
   lt_cv_file_magic_cmd=/usr/bin/file
   case $host_cpu in
@@ -5488,121 +5811,287 @@ hpux10.20* | hpux11*)
     lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
     ;;
   hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
     lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
     ;;
   *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
     lt_cv_file_magic_test_file=/usr/lib/libc.sl
     ;;
   esac
   ;;
 
-interix[3-9]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
 
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
 
-# This must be Linux ELF.
-linux* | k*bsd*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
 
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
-  fi
-  ;;
 
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
 
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
 
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  fi
-  ;;
 
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
 
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
 
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
 
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
 
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
     ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
     ;;
   esac
   ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
   ;;
 esac
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
 
 
 
@@ -5611,8 +6100,10 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown
 
 
 if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_prog_AR+:} false; then :
@@ -5627,8 +6118,8 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AR="${ac_tool_prefix}ar"
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -5648,11 +6139,15 @@ $as_echo "no" >&6; }
 fi
 
 
+    test -n "$AR" && break
+  done
 fi
-if test -z "$ac_cv_prog_AR"; then
+if test -z "$AR"; then
   ac_ct_AR=$AR
-  # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_prog_ac_ct_AR+:} false; then :
@@ -5667,8 +6162,8 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_AR="ar"
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -5687,6 +6182,10 @@ else
 $as_echo "no" >&6; }
 fi
 
+
+  test -n "$ac_ct_AR" && break
+done
+
   if test "x$ac_ct_AR" = x; then
     AR="false"
   else
@@ -5698,16 +6197,72 @@ ac_tool_warned=yes ;;
 esac
     AR=$ac_ct_AR
   fi
-else
-  AR="$ac_cv_prog_AR"
 fi
 
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+       # Ensure the archiver fails upon bogus file names.
+       rm -f conftest.$ac_objext libconftest.a
+       { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+       if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
 
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
 
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
 
 
 
@@ -5732,7 +6287,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5772,7 +6327,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_STRIP="strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5831,7 +6386,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5871,7 +6426,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5921,15 +6476,27 @@ old_postuninstall_cmds=
 if test -n "$RANLIB"; then
   case $host_os in
   openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
     ;;
   esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
 fi
 
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
 
 
 
@@ -6037,8 +6604,8 @@ esac
 lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
 
 # Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
 
 # Handle CRLF in mingw tool chain
 opt_cr=
@@ -6062,6 +6629,7 @@ for ac_symprfx in "" "_"; do
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK '"\
 "     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
@@ -6074,6 +6642,7 @@ for ac_symprfx in "" "_"; do
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[     ]\($symcode$symcode*\)[         ][      ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
   fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
 
   # Check to see that the pipe works correctly.
   pipe_works=no
@@ -6099,8 +6668,8 @@ _LT_EOF
   test $ac_status = 0; }; then
     # Now try to grab the symbols.
     nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } && test -s "$nlist"; then
@@ -6115,6 +6684,18 @@ _LT_EOF
       if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
        if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
          cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -6126,7 +6707,7 @@ _LT_EOF
          cat <<_LT_EOF >> conftest.$ac_ext
 
 /* The mapping between symbol names and symbols.  */
-const struct {
+LT_DLSYM_CONST struct {
   const char *name;
   void       *address;
 }
@@ -6152,8 +6733,8 @@ static const void *lt_preloaded_setup() {
 _LT_EOF
          # Now try linking the two files.
          mv conftest.$ac_objext conftstm.$ac_objext
-         lt_save_LIBS="$LIBS"
-         lt_save_CFLAGS="$CFLAGS"
+         lt_globsym_save_LIBS=$LIBS
+         lt_globsym_save_CFLAGS=$CFLAGS
          LIBS="conftstm.$ac_objext"
          CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
          if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
@@ -6163,8 +6744,8 @@ _LT_EOF
   test $ac_status = 0; } && test -s conftest${ac_exeext}; then
            pipe_works=yes
          fi
-         LIBS="$lt_save_LIBS"
-         CFLAGS="$lt_save_CFLAGS"
+         LIBS=$lt_globsym_save_LIBS
+         CFLAGS=$lt_globsym_save_CFLAGS
        else
          echo "cannot find nm_test_func in $nlist" >&5
        fi
@@ -6201,6 +6782,20 @@ else
 $as_echo "ok" >&6; }
 fi
 
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
 
 
 
@@ -6220,6 +6815,41 @@ fi
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
 
 
 # Check whether --enable-libtool-lock was given.
@@ -6253,7 +6883,7 @@ ia64-*-hpux*)
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 6256 "configure"' > conftest.$ac_ext
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -6388,7 +7018,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
     CFLAGS="$SAVE_CFLAGS"
   fi
   ;;
-sparc*-*solaris*)
+*-*solaris*)
   # Find out which ABI we are using.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
@@ -6399,7 +7029,20 @@ sparc*-*solaris*)
     case `/usr/bin/file conftest.o` in
     *64-bit*)
       case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
       *)
        if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
          LD="${LD-ld} -64"
@@ -6415,6 +7058,123 @@ esac
 
 need_locks="$enable_libtool_lock"
 
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
 
   case $host_os in
     rhapsody* | darwin*)
@@ -6435,7 +7195,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6475,7 +7235,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6527,7 +7287,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6567,7 +7327,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_NMEDIT="nmedit"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6619,7 +7379,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6659,7 +7419,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_LIPO="lipo"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6711,7 +7471,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6751,7 +7511,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_OTOOL="otool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6803,7 +7563,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6843,7 +7603,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_OTOOL64="otool64"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6922,7 +7682,13 @@ else
        $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
          -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
         _lt_result=$?
-       if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+       # If there is a non-empty error log, and "single_module"
+       # appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+         cat conftest.err >&5
+       # Otherwise, if the output was created with a 0 exit code from
+       # the compiler, it worked.
+       elif test -f libconftest.dylib && test $_lt_result -eq 0; then
          lt_cv_apple_cc_single_mod=yes
        else
          cat conftest.err >&5
@@ -6933,6 +7699,7 @@ else
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
 $as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
 if ${lt_cv_ld_exported_symbols_list+:} false; then :
@@ -6963,8 +7730,43 @@ rm -f core conftest.err conftest.$ac_objext \
        LDFLAGS="$save_LDFLAGS"
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+       cat conftest.err >&5
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+       lt_cv_ld_force_load=yes
+      else
+       cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
     case $host_os in
     rhapsody* | darwin1.[012])
       _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
@@ -6992,7 +7794,7 @@ $as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
     else
       _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
     fi
-    if test "$DSYMUTIL" != ":"; then
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
@@ -7282,6 +8084,8 @@ done
 
 
 
+
+
 # Set options
 
 
@@ -7357,7 +8161,22 @@ fi
 
 # Check whether --with-pic was given.
 if test "${with_pic+set}" = set; then :
-  withval=$with_pic; pic_mode="$withval"
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+       IFS="$lt_save_ifs"
+       if test "X$lt_pkg" = "X$lt_p"; then
+         pic_mode=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
 else
   pic_mode=default
 fi
@@ -7434,6 +8253,11 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool'
 
 
 
+
+
+
+
+
 test -z "$LN_S" && LN_S="ln -s"
 
 
@@ -7483,19 +8307,6 @@ _ACEOF
 
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
 case $host_os in
 aix3*)
   # AIX sometimes has problems with the GCC collect2 program.  For some
@@ -7508,23 +8319,6 @@ aix3*)
   ;;
 esac
 
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
 # Global variables:
 ofile=libtool
 can_build_shared=yes
@@ -7553,7 +8347,7 @@ for cc_temp in $compiler""; do
     *) break;;
   esac
 done
-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
 
 
 # Only perform the check for file, if the check method requires it
@@ -7762,7 +8556,12 @@ if test -n "$compiler"; then
 lt_prog_compiler_no_builtin_flag=
 
 if test "$GCC" = yes; then
-  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
@@ -7782,15 +8581,15 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7785: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:7789: \$? = $ac_status" >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
      $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
      if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
        lt_cv_prog_compiler_rtti_exceptions=yes
@@ -7819,8 +8618,6 @@ fi
 lt_prog_compiler_pic=
 lt_prog_compiler_static=
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
 
   if test "$GCC" = yes; then
     lt_prog_compiler_wl='-Wl,'
@@ -7868,6 +8665,12 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
       lt_prog_compiler_pic='-fno-common'
       ;;
 
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
     hpux*)
       # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
       # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
@@ -7910,6 +8713,15 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
       lt_prog_compiler_pic='-fPIC'
       ;;
     esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
   else
     # PORTME Check for flag to pass linker flags through the system compiler.
     case $host_os in
@@ -7951,7 +8763,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
       lt_prog_compiler_static='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -7972,7 +8784,13 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
        lt_prog_compiler_pic='--shared'
        lt_prog_compiler_static='--static'
        ;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
+      nagfor*)
+       # NAG Fortran compiler
+       lt_prog_compiler_wl='-Wl,-Wl,,'
+       lt_prog_compiler_pic='-PIC'
+       lt_prog_compiler_static='-Bstatic'
+       ;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
        # which looks to be a dead project)
        lt_prog_compiler_wl='-Wl,'
@@ -7984,25 +8802,40 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
         # All Alpha code is PIC.
         lt_prog_compiler_static='-non_shared'
         ;;
-      xl*)
-       # IBM XL C 8.0/Fortran 10.1 on PPC
+      xl* | bgxl* | bgf* | mpixl*)
+       # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
        lt_prog_compiler_wl='-Wl,'
        lt_prog_compiler_pic='-qpic'
        lt_prog_compiler_static='-qstaticlink'
        ;;
       *)
        case `$CC -V 2>&1 | sed 5q` in
+       *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+         # Sun Fortran 8.3 passes all unrecognized flags to the linker
+         lt_prog_compiler_pic='-KPIC'
+         lt_prog_compiler_static='-Bstatic'
+         lt_prog_compiler_wl=''
+         ;;
+       *Sun\ F* | *Sun*Fortran*)
+         lt_prog_compiler_pic='-KPIC'
+         lt_prog_compiler_static='-Bstatic'
+         lt_prog_compiler_wl='-Qoption ld '
+         ;;
        *Sun\ C*)
          # Sun C 5.9
          lt_prog_compiler_pic='-KPIC'
          lt_prog_compiler_static='-Bstatic'
          lt_prog_compiler_wl='-Wl,'
          ;;
-       *Sun\ F*)
-         # Sun Fortran 8.3 passes all unrecognized flags to the linker
-         lt_prog_compiler_pic='-KPIC'
+        *Intel*\ [CF]*Compiler*)
+         lt_prog_compiler_wl='-Wl,'
+         lt_prog_compiler_pic='-fPIC'
+         lt_prog_compiler_static='-static'
+         ;;
+       *Portland\ Group*)
+         lt_prog_compiler_wl='-Wl,'
+         lt_prog_compiler_pic='-fpic'
          lt_prog_compiler_static='-Bstatic'
-         lt_prog_compiler_wl=''
          ;;
        esac
        ;;
@@ -8034,7 +8867,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
       lt_prog_compiler_pic='-KPIC'
       lt_prog_compiler_static='-Bstatic'
       case $cc_basename in
-      f77* | f90* | f95*)
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
        lt_prog_compiler_wl='-Qoption ld ';;
       *)
        lt_prog_compiler_wl='-Wl,';;
@@ -8091,13 +8924,17 @@ case $host_os in
     lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
     ;;
 esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
-$as_echo "$lt_prog_compiler_pic" >&6; }
-
-
-
-
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
 
 #
 # Check to make sure the PIC flag actually works.
@@ -8121,15 +8958,15 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8124: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:8128: \$? = $ac_status" >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
      $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
      if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
        lt_cv_prog_compiler_pic_works=yes
@@ -8158,6 +8995,11 @@ fi
 
 
 
+
+
+
+
+
 #
 # Check to make sure the static flag actually works.
 #
@@ -8177,7 +9019,7 @@ else
      if test -s conftest.err; then
        # Append any errors to the config.log.
        cat conftest.err 1>&5
-       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
        $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
        if diff conftest.exp conftest.er2 >/dev/null; then
          lt_cv_prog_compiler_static_works=yes
@@ -8226,16 +9068,16 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8229: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:8233: \$? = $ac_status" >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
      $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
      if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
        lt_cv_prog_compiler_c_o=yes
@@ -8281,16 +9123,16 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8284: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:8288: \$? = $ac_status" >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
      $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
      if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
        lt_cv_prog_compiler_c_o=yes
@@ -8356,7 +9198,6 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   hardcode_direct=no
   hardcode_direct_absolute=no
   hardcode_libdir_flag_spec=
-  hardcode_libdir_flag_spec_ld=
   hardcode_libdir_separator=
   hardcode_minus_L=no
   hardcode_shlibpath_var=unsupported
@@ -8403,7 +9244,33 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   esac
 
   ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
   if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+       # The AIX port of GNU ld has always aspired to compatibility
+       # with the native linker.  However, as the warning in the GNU ld
+       # block says, versions before 2.19.5* couldn't really create working
+       # shared libraries, regardless of the interface used.
+       case `$LD -v 2>&1` in
+         *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+         *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+         *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+         *)
+           lt_use_gnu_ld_interface=yes
+           ;;
+       esac
+       ;;
+      *)
+       lt_use_gnu_ld_interface=yes
+       ;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
     # If archive_cmds runs LD, not CC, wlarc should be empty
     wlarc='${wl}'
 
@@ -8421,6 +9288,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     fi
     supports_anon_versioning=no
     case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
       *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
@@ -8436,11 +9304,12 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
        ld_shlibs=no
        cat <<_LT_EOF 1>&2
 
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** Warning: the GNU linker, at least up to release 2.19, is reported
 *** to be unable to reliably create shared libraries on AIX.
 *** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
 
 _LT_EOF
       fi
@@ -8476,10 +9345,12 @@ _LT_EOF
       # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
       # as there is no search path for DLLs.
       hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
       allow_undefined_flag=unsupported
       always_export_symbols=no
       enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
         archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
@@ -8497,6 +9368,11 @@ _LT_EOF
       fi
       ;;
 
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
     interix[3-9]*)
       hardcode_direct=no
       hardcode_shlibpath_var=no
@@ -8512,7 +9388,7 @@ _LT_EOF
       archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
-    gnu* | linux* | tpf* | k*bsd*-gnu)
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
       if test "$host_os" = linux-dietlibc; then
        case $cc_basename in
@@ -8522,15 +9398,16 @@ _LT_EOF
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
         && test "$tmp_diet" = no
       then
-       tmp_addflag=
+       tmp_addflag=' $pic_flag'
        tmp_sharedflag='-shared'
        case $cc_basename,$host_cpu in
         pgcc*)                         # Portland Group C compiler
-         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
          tmp_addflag=' $pic_flag'
          ;;
-       pgf77* | pgf90* | pgf95*)       # Portland Group f77 and f90 compilers
-         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+       pgf77* | pgf90* | pgf95* | pgfortran*)
+                                       # Portland Group f77 and f90 compilers
+         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
          tmp_addflag=' $pic_flag -Mnomain' ;;
        ecc*,ia64* | icc*,ia64*)        # Intel C compiler on ia64
          tmp_addflag=' -i_dynamic' ;;
@@ -8541,13 +9418,17 @@ _LT_EOF
        lf95*)                          # Lahey Fortran 8.1
          whole_archive_flag_spec=
          tmp_sharedflag='--shared' ;;
-       xl[cC]*)                        # IBM XL C 8.0 on PPC (deal with xlf below)
+       xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
          tmp_sharedflag='-qmkshrobj'
          tmp_addflag= ;;
+       nvcc*)  # Cuda Compiler Driver 2.2
+         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         compiler_needs_object=yes
+         ;;
        esac
        case `$CC -V 2>&1 | sed 5q` in
        *Sun\ C*)                       # Sun C 5.9
-         whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+         whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
          compiler_needs_object=yes
          tmp_sharedflag='-G' ;;
        *Sun\ F*)                       # Sun Fortran 8.3
@@ -8563,17 +9444,16 @@ _LT_EOF
         fi
 
        case $cc_basename in
-       xlf*)
+       xlf* | bgf* | bgxlf* | mpixlf*)
          # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
          whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-         hardcode_libdir_flag_spec=
-         hardcode_libdir_flag_spec_ld='-rpath $libdir'
-         archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+         hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+         archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
          if test "x$supports_anon_versioning" = xyes; then
            archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
              echo "local: *; };" >> $output_objdir/$libname.ver~
-             $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+             $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
          fi
          ;;
        esac
@@ -8587,8 +9467,8 @@ _LT_EOF
        archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
        wlarc=
       else
-       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
       fi
       ;;
 
@@ -8606,8 +9486,8 @@ _LT_EOF
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
       else
        ld_shlibs=no
       fi
@@ -8653,8 +9533,8 @@ _LT_EOF
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
       else
        ld_shlibs=no
       fi
@@ -8694,8 +9574,10 @@ _LT_EOF
       else
        # If we're using GNU nm, then we don't want the "-C" option.
        # -C means demangle to AIX nm, but means don't demangle with GNU nm
+       # Also, AIX nm treats weak defined symbols like other global
+       # defined symbols, whereas GNU nm marks them as "W".
        if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-         export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+         export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
        else
          export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
        fi
@@ -8782,7 +9664,13 @@ _LT_EOF
        allow_undefined_flag='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -8795,25 +9683,32 @@ main ()
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
 
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-       /^0/ {
-           s/^0  *\(.*\)$/\1/
-           p
-       }
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+         /^0/ {
+             s/^0  *\([^ ]*\) *$/\1/
+             p
+         }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
 
         hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
       else
        if test "$host_cpu" = ia64; then
          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
@@ -8822,7 +9717,13 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
        else
         # Determine the default libpath from the value encoded in an
         # empty executable.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -8835,30 +9736,42 @@ main ()
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
 
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-       /^0/ {
-           s/^0  *\(.*\)$/\1/
-           p
-       }
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+         /^0/ {
+             s/^0  *\([^ ]*\) *$/\1/
+             p
+         }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
 
         hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
          # Warning - without using the other run time loading flags,
          # -berok will link without error, but may produce a broken library.
          no_undefined_flag=' ${wl}-bernotok'
          allow_undefined_flag=' ${wl}-berok'
-         # Exported symbols can be pulled into shared objects from archives
-         whole_archive_flag_spec='$convenience'
+         if test "$with_gnu_ld" = yes; then
+           # We only use this code for GNU lds that support --whole-archive.
+           whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+         else
+           # Exported symbols can be pulled into shared objects from archives
+           whole_archive_flag_spec='$convenience'
+         fi
          archive_cmds_need_lc=yes
          # This is similar to how AIX traditionally builds its shared libraries.
          archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
@@ -8890,20 +9803,64 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
       # Microsoft Visual C++.
       # hardcode_libdir_flag_spec is actually meaningless, as there is
       # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      allow_undefined_flag=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_from_new_cmds='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes=yes
+      case $cc_basename in
+      cl*)
+       # Native MSVC
+       hardcode_libdir_flag_spec=' '
+       allow_undefined_flag=unsupported
+       always_export_symbols=yes
+       file_list_spec='@'
+       # Tell ltmain to make .lib files, not .a files.
+       libext=lib
+       # Tell ltmain to make .dll files, not .so files.
+       shrext_cmds=".dll"
+       # FIXME: Setting linknames here is a bad hack.
+       archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+       archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+           sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+         else
+           sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+         fi~
+         $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+         linknames='
+       # The linker will not automatically build a static lib if we build a DLL.
+       # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+       enable_shared_with_static_runtimes=yes
+       exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+       export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+       # Don't use ranlib
+       old_postinstall_cmds='chmod 644 $oldlib'
+       postlink_cmds='lt_outputfile="@OUTPUT@"~
+         lt_tool_outputfile="@TOOL_OUTPUT@"~
+         case $lt_outputfile in
+           *.exe|*.EXE) ;;
+           *)
+             lt_outputfile="$lt_outputfile.exe"
+             lt_tool_outputfile="$lt_tool_outputfile.exe"
+             ;;
+         esac~
+         if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+           $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+           $RM "$lt_outputfile.manifest";
+         fi'
+       ;;
+      *)
+       # Assume MSVC wrapper
+       hardcode_libdir_flag_spec=' '
+       allow_undefined_flag=unsupported
+       # Tell ltmain to make .lib files, not .a files.
+       libext=lib
+       # Tell ltmain to make .dll files, not .so files.
+       shrext_cmds=".dll"
+       # FIXME: Setting linknames here is a bad hack.
+       archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+       # The linker will automatically build a .lib file if we build a DLL.
+       old_archive_from_new_cmds='true'
+       # FIXME: Should let the user specify the lib program.
+       old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+       enable_shared_with_static_runtimes=yes
+       ;;
+      esac
       ;;
 
     darwin* | rhapsody*)
@@ -8913,7 +9870,12 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
   hardcode_direct=no
   hardcode_automatic=yes
   hardcode_shlibpath_var=unsupported
-  whole_archive_flag_spec=''
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
   link_all_deplibs=yes
   allow_undefined_flag="$_lt_dar_allow_undefined"
   case $cc_basename in
@@ -8921,7 +9883,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
      *) _lt_dar_can_shared=$GCC ;;
   esac
   if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=echo
+    output_verbose_link_cmd=func_echo_all
     archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
     module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
     archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
@@ -8939,10 +9901,6 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
       hardcode_shlibpath_var=no
       ;;
 
-    freebsd1*)
-      ld_shlibs=no
-      ;;
-
     # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
     # support.  Future versions do this automatically, but an explicit c++rt0.o
     # does not break anything, and helps significantly (at the cost of a little
@@ -8955,7 +9913,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
       ;;
 
     # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
+    freebsd2.*)
       archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       hardcode_direct=yes
       hardcode_minus_L=yes
@@ -8964,7 +9922,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
     # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
     freebsd* | dragonfly*)
-      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       hardcode_libdir_flag_spec='-R$libdir'
       hardcode_direct=yes
       hardcode_shlibpath_var=no
@@ -8972,7 +9930,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
     hpux9*)
       if test "$GCC" = yes; then
-       archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+       archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
       else
        archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
       fi
@@ -8987,14 +9945,13 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
       ;;
 
     hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-       archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+       archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
       else
        archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
       if test "$with_gnu_ld" = no; then
        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-       hardcode_libdir_flag_spec_ld='+b $libdir'
        hardcode_libdir_separator=:
        hardcode_direct=yes
        hardcode_direct_absolute=yes
@@ -9006,16 +9963,16 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
       ;;
 
     hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
        case $host_cpu in
        hppa*64*)
          archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        ia64*)
-         archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        *)
-         archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+         archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        esac
       else
@@ -9027,7 +9984,46 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
          archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        *)
-         archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+
+         # Older versions of the 11.00 compiler do not understand -b yet
+         # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+         { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
          ;;
        esac
       fi
@@ -9055,26 +10051,39 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
     irix5* | irix6* | nonstopux*)
       if test "$GCC" = yes; then
-       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
        # Try to use the -exported_symbol ld option, if it does not
        # work, assume that -exports_file does not work either and
        # implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+       # This should be the same for all languages, so no per-tag cache variable.
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS="$LDFLAGS"
+          LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-int foo(void) {}
+int foo (void) { return 0; }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-        LDFLAGS="$save_LDFLAGS"
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+       if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+       fi
       else
-       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
       fi
       archive_cmds_need_lc='no'
       hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
@@ -9136,17 +10145,17 @@ rm -f core conftest.err conftest.$ac_objext \
       hardcode_libdir_flag_spec='-L$libdir'
       hardcode_minus_L=yes
       allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
       old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
       ;;
 
     osf3*)
       if test "$GCC" = yes; then
        allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
       else
        allow_undefined_flag=' -expect_unresolved \*'
-       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
       fi
       archive_cmds_need_lc='no'
       hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
@@ -9156,13 +10165,13 @@ rm -f core conftest.err conftest.$ac_objext \
     osf4* | osf5*)     # as osf3* with the addition of -msym flag
       if test "$GCC" = yes; then
        allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
       else
        allow_undefined_flag=' -expect_unresolved \*'
-       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
        archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-       $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+       $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
 
        # Both c and cxx compiler support -rpath directly
        hardcode_libdir_flag_spec='-rpath $libdir'
@@ -9175,9 +10184,9 @@ rm -f core conftest.err conftest.$ac_objext \
       no_undefined_flag=' -z defs'
       if test "$GCC" = yes; then
        wlarc='${wl}'
-       archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
        archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-         $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+         $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
       else
        case `$CC -V 2>&1` in
        *"Compilers 5.0"*)
@@ -9365,44 +10374,50 @@ x|xyes)
       # to ld, don't add -lc before -lgcc.
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-      $RM conftest*
-      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+       echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-      if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+       if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$lt_prog_compiler_wl
-       pic_flag=$lt_prog_compiler_pic
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag
-        allow_undefined_flag=
-        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+         soname=conftest
+         lib=conftest
+         libobjs=conftest.$ac_objext
+         deplibs=
+         wl=$lt_prog_compiler_wl
+         pic_flag=$lt_prog_compiler_pic
+         compiler_flags=-v
+         linker_flags=-v
+         verstring=
+         output_objdir=.
+         libname=conftest
+         lt_save_allow_undefined_flag=$allow_undefined_flag
+         allow_undefined_flag=
+         if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
   (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
-        then
-         archive_cmds_need_lc=no
-        else
-         archive_cmds_need_lc=yes
-        fi
-        allow_undefined_flag=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $RM conftest*
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5
-$as_echo "$archive_cmds_need_lc" >&6; }
+         then
+           lt_cv_archive_cmds_need_lc=no
+         else
+           lt_cv_archive_cmds_need_lc=yes
+         fi
+         allow_undefined_flag=$lt_save_allow_undefined_flag
+       else
+         cat conftest.err 1>&5
+       fi
+       $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
       ;;
     esac
   fi
@@ -9560,11 +10575,6 @@ esac
 
 
 
-
-
-
-
-
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
 $as_echo_n "checking dynamic linker characteristics... " >&6; }
 
@@ -9573,16 +10583,23 @@ if test "$GCC" = yes; then
     darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
     *) lt_awk_arg="/^libraries:/" ;;
   esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
     # if the path contains ";" then we assume it to be the separator
     # otherwise default to the standard path separator (i.e. ":") - it is
     # assumed that no part of a normal pathname contains ";" but that should
     # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
   # Ok, now we have the path, separated by spaces, we can step through it
   # and add multilib dir if necessary.
   lt_tmp_lt_search_path_spec=
@@ -9595,7 +10612,7 @@ if test "$GCC" = yes; then
        lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
-  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
 BEGIN {RS=" "; FS="/|\n";} {
   lt_foo="";
   lt_count=0;
@@ -9615,7 +10632,13 @@ BEGIN {RS=" "; FS="/|\n";} {
   if (lt_foo != "") { lt_freq[lt_foo]++; }
   if (lt_freq[lt_foo] == 1) { print lt_foo; }
 }'`
-  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
   sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
 fi
@@ -9641,7 +10664,7 @@ need_version=unknown
 
 case $host_os in
 aix3*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
@@ -9650,7 +10673,7 @@ aix3*)
   ;;
 
 aix[4-9]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
@@ -9703,7 +10726,7 @@ amigaos*)
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
@@ -9715,7 +10738,7 @@ beos*)
   ;;
 
 bsdi[45]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
@@ -9734,8 +10757,9 @@ cygwin* | mingw* | pw32* | cegcc*)
   need_version=no
   need_lib_prefix=no
 
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
     postinstall_cmds='base_file=`basename \${file}`~
@@ -9756,36 +10780,83 @@ cygwin* | mingw* | pw32* | cegcc*)
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
       soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
       soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
       library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
       ;;
     esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
     ;;
 
   *)
+    # Assume MSVC wrapper
     library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
     ;;
   esac
-  dynamic_linker='Win32 ld.exe'
   # FIXME: first we should search . and the directory the executable is in
   shlibpath_var=PATH
   ;;
@@ -9806,7 +10877,7 @@ darwin* | rhapsody*)
   ;;
 
 dgux*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
@@ -9814,10 +10885,6 @@ dgux*)
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
 freebsd* | dragonfly*)
   # DragonFly does not have aout.  When/if they implement a new
   # versioning mechanism, adjust this.
@@ -9825,7 +10892,7 @@ freebsd* | dragonfly*)
     objformat=`/usr/bin/objformat`
   else
     case $host_os in
-    freebsd[123]*) objformat=aout ;;
+    freebsd[23].*) objformat=aout ;;
     *) objformat=elf ;;
     esac
   fi
@@ -9843,7 +10910,7 @@ freebsd* | dragonfly*)
   esac
   shlibpath_var=LD_LIBRARY_PATH
   case $host_os in
-  freebsd2*)
+  freebsd2.*)
     shlibpath_overrides_runpath=yes
     ;;
   freebsd3.[01]* | freebsdelf3.[01]*)
@@ -9863,12 +10930,26 @@ freebsd* | dragonfly*)
   ;;
 
 gnu*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
 
@@ -9914,12 +10995,14 @@ hpux9* | hpux10* | hpux11*)
     soname_spec='${libname}${release}${shared_ext}$major'
     ;;
   esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
   postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
   ;;
 
 interix[3-9]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
@@ -9935,7 +11018,7 @@ irix5* | irix6* | nonstopux*)
     nonstopux*) version_type=nonstopux ;;
     *)
        if test "$lt_cv_prog_gnu_ld" = yes; then
-               version_type=linux
+               version_type=linux # correct to gnu/linux during the next big refactor
        else
                version_type=irix
        fi ;;
@@ -9972,9 +11055,9 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
-# This must be Linux ELF.
-linux* | k*bsd*-gnu)
-  version_type=linux
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -9982,12 +11065,17 @@ linux* | k*bsd*-gnu)
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
+
   # Some binutils ld are patched to set DT_RUNPATH
-  save_LDFLAGS=$LDFLAGS
-  save_libdir=$libdir
-  eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
-       LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+        LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -10000,13 +11088,17 @@ main ()
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
   if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  shlibpath_overrides_runpath=yes
+  lt_cv_shlibpath_overrides_runpath=yes
 fi
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-  LDFLAGS=$save_LDFLAGS
-  libdir=$save_libdir
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
 
   # This implies no fast_install, which is unacceptable.
   # Some rework will be needed to allow for fast_install
@@ -10015,7 +11107,7 @@ rm -f core conftest.err conftest.$ac_objext \
 
   # Append ld.so.conf contents to the search path
   if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[      ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[      ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
   fi
 
@@ -10047,7 +11139,7 @@ netbsd*)
   ;;
 
 newsos6)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
@@ -10116,7 +11208,7 @@ rdos*)
   ;;
 
 solaris*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -10141,7 +11233,7 @@ sunos4*)
   ;;
 
 sysv4 | sysv4.3*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
@@ -10165,7 +11257,7 @@ sysv4 | sysv4.3*)
 
 sysv4*MP*)
   if test -d /usr/nec ;then
-    version_type=linux
+    version_type=linux # correct to gnu/linux during the next big refactor
     library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
     soname_spec='$libname${shared_ext}.$major'
     shlibpath_var=LD_LIBRARY_PATH
@@ -10196,7 +11288,7 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
 
 tpf*)
   # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -10206,7 +11298,7 @@ tpf*)
   ;;
 
 uts4*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
 
 
 
+
+
+
+
+
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
 $as_echo_n "checking how to hardcode library paths into programs... " >&6; }
 hardcode_action=
@@ -10648,7 +11745,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10651 "configure"
+#line $LINENO "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10689,7 +11786,13 @@ else
 #  endif
 #endif
 
-void fnord() { int i=42;}
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
 int main ()
 {
   void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
@@ -10698,7 +11801,11 @@ int main ()
   if (self)
     {
       if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      else
+        {
+         if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+       }
       /* dlclose (self); */
     }
   else
@@ -10744,7 +11851,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10747 "configure"
+#line $LINENO "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10785,7 +11892,13 @@ else
 #  endif
 #endif
 
-void fnord() { int i=42;}
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
 int main ()
 {
   void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
@@ -10794,7 +11907,11 @@ int main ()
   if (self)
     {
       if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      else
+        {
+         if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+       }
       /* dlclose (self); */
     }
   else
@@ -10963,6 +12080,8 @@ CC="$lt_save_CC"
 
 
 
+
+
         ac_config_commands="$ac_config_commands libtool"
 
 
@@ -10972,7 +12091,7 @@ CC="$lt_save_CC"
 
 
 
-for ac_func in _open _snprintf _strcmpi _strdup _stricmp fseeko ftello getopt open snprintf strcasecmp strdup
+for ac_func in _close _dup _fdopen _fileno _open _snprintf _strdup _stricmp fseeko ftello getopt open snprintf strcasecmp strdup
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 
-for ac_header in unistd.h
+for ac_header in fts.h stdbool.h strings.h unistd.h
 do :
-  ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
-if test "x$ac_cv_header_unistd_h" = xyes; then :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
-#define HAVE_UNISTD_H 1
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
 _ACEOF
 
 fi
@@ -11122,6 +12242,16 @@ _ACEOF
 
 fi
 
+ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
+if test "x$ac_cv_type_ssize_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_SSIZE_T 1
+_ACEOF
+
+
+fi
+
 
 # The cast to long int works around a bug in the HP C Compiler
 # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
@@ -11255,6 +12385,72 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5
+$as_echo_n "checking size of off_t... " >&6; }
+if ${ac_cv_sizeof_off_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_off_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (off_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_off_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_off_t" >&5
+$as_echo "$ac_cv_sizeof_off_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_OFF_T $ac_cv_sizeof_off_t
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
+$as_echo_n "checking size of size_t... " >&6; }
+if ${ac_cv_sizeof_size_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_size_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (size_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_size_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5
+$as_echo "$ac_cv_sizeof_size_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
+_ACEOF
+
+
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5
 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; }
 esac
 
 
-ac_config_files="$ac_config_files Makefile libzip.pc libzip-uninstalled.pc man/Makefile lib/Makefile regress/Makefile src/Makefile"
+
+
+
+
+  CFLAG_VISIBILITY=
+  HAVE_VISIBILITY=0
+  if test -n "$GCC"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5
+$as_echo_n "checking for simple visibility declarations... " >&6; }
+    if ${gl_cv_cc_visibility+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+      gl_save_CFLAGS="$CFLAGS"
+      CFLAGS="$CFLAGS -fvisibility=hidden"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+         extern __attribute__((__visibility__("default"))) int exportedvar;
+         extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+         extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_cc_visibility=yes
+else
+  gl_cv_cc_visibility=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      CFLAGS="$gl_save_CFLAGS"
+fi
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5
+$as_echo "$gl_cv_cc_visibility" >&6; }
+    if test $gl_cv_cc_visibility = yes; then
+      CFLAG_VISIBILITY="-fvisibility=hidden"
+      HAVE_VISIBILITY=1
+    fi
+  fi
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_VISIBILITY $HAVE_VISIBILITY
+_ACEOF
+
+
+
+ac_config_files="$ac_config_files Makefile libzip.pc libzip-uninstalled.pc examples/Makefile man/Makefile lib/Makefile regress/Makefile src/Makefile"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -11477,6 +12727,14 @@ LIBOBJS=$ac_libobjs
 LTLIBOBJS=$ac_ltlibobjs
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
  if test -n "$EXEEXT"; then
   am__EXEEXT_TRUE=
   am__EXEEXT_FALSE='#'
@@ -11791,16 +13049,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -11860,28 +13118,16 @@ else
   as_mkdir_p=false
 fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-       test -d "$1/.";
-      else
-       case $1 in #(
-       -*)set "./$1";;
-       esac;
-       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-       ???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -11902,8 +13148,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by libzip $as_me 0.10.1, which was
-generated by GNU Autoconf 2.68.  Invocation command line was
+This file was extended by libzip $as_me 1.0.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -11962,17 +13208,17 @@ $config_headers
 Configuration commands:
 $config_commands
 
-Report bugs to <libzip-discuss@nih.at>."
+Report bugs to <libzip@nih.at>."
 
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-libzip config.status 0.10.1
-configured by $0, generated by GNU Autoconf 2.68,
+libzip config.status 1.0.1
+configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
@@ -12063,7 +13309,7 @@ fi
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
   shift
   \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
   CONFIG_SHELL='$SHELL'
@@ -12097,131 +13343,154 @@ AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
 sed_quote_subst='$sed_quote_subst'
 double_quote_subst='$double_quote_subst'
 delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`'
-enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`'
-host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`'
-host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`'
-host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`'
-build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`'
-build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`'
-build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`'
-SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`'
-Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`'
-GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`'
-EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`'
-FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`'
-LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`'
-NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`'
-LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`'
-exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`'
-AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`'
-STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`'
-compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`'
-GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
-objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`'
-SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`'
-ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`'
-need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`'
-LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`'
-libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`'
-fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
-need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`'
-version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`'
-striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
 
 LTCC='$LTCC'
 LTCFLAGS='$LTCFLAGS'
 compiler='$compiler_DEFAULT'
 
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
 # Quote evaled strings.
-for var in SED \
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
 GREP \
 EGREP \
 FGREP \
@@ -12234,8 +13503,13 @@ reload_flag \
 OBJDUMP \
 deplibs_check_method \
 file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
 AR \
 AR_FLAGS \
+archiver_list_spec \
 STRIP \
 RANLIB \
 CC \
@@ -12245,14 +13519,14 @@ lt_cv_sys_global_symbol_pipe \
 lt_cv_sys_global_symbol_to_cdecl \
 lt_cv_sys_global_symbol_to_c_name_address \
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-SHELL \
-ECHO \
+nm_file_list_spec \
 lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_wl \
 lt_prog_compiler_pic \
+lt_prog_compiler_wl \
 lt_prog_compiler_static \
 lt_cv_prog_compiler_c_o \
 need_locks \
+MANIFEST_TOOL \
 DSYMUTIL \
 NMEDIT \
 LIPO \
@@ -12266,9 +13540,7 @@ with_gnu_ld \
 allow_undefined_flag \
 no_undefined_flag \
 hardcode_libdir_flag_spec \
-hardcode_libdir_flag_spec_ld \
 hardcode_libdir_separator \
-fix_srcfile_path \
 exclude_expsyms \
 include_expsyms \
 file_list_spec \
@@ -12276,12 +13548,13 @@ variables_saved_for_relink \
 libname_spec \
 library_names_spec \
 soname_spec \
+install_override_mode \
 finish_eval \
 old_striplib \
 striplib; do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -12303,14 +13576,15 @@ module_cmds \
 module_expsym_cmds \
 export_symbols_cmds \
 prelink_cmds \
+postlink_cmds \
 postinstall_cmds \
 postuninstall_cmds \
 finish_cmds \
 sys_lib_search_path_spec \
 sys_lib_dlsearch_path_spec; do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -12318,12 +13592,6 @@ sys_lib_dlsearch_path_spec; do
     esac
 done
 
-# Fix-up fallback echo if it was mangled by the above quoting rules.
-case \$lt_ECHO in
-*'\\\$0 --fallback-echo"')  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\`
-  ;;
-esac
-
 ac_aux_dir='$ac_aux_dir'
 xsi_shell='$xsi_shell'
 lt_shell_append='$lt_shell_append'
@@ -12358,6 +13626,7 @@ do
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
     "libzip.pc") CONFIG_FILES="$CONFIG_FILES libzip.pc" ;;
     "libzip-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES libzip-uninstalled.pc" ;;
+    "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
     "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;;
     "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;;
     "regress/Makefile") CONFIG_FILES="$CONFIG_FILES regress/Makefile" ;;
@@ -12958,7 +14227,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
 
   case $ac_file$ac_mode in
     "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # Older Autoconf quotes --file arguments for eval, but not when files
   # are listed without --file.  Let's play safe and only enable the eval
   # if we detect the quoting.
   case $CONFIG_FILES in
@@ -12971,7 +14240,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
     # Strip MF so we end up with the name of the file.
     mf=`echo "$mf" | sed -e 's/:.*$//'`
     # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
+    # We used to match only the files named 'Makefile.in', but
     # some people rename them; so instead we look at the file content.
     # Grep'ing the first line is not enough: some people post-process
     # each Makefile.in and add a new line on top of each file to say so.
@@ -13005,21 +14274,19 @@ $as_echo X"$mf" |
       continue
     fi
     # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
+    # from the Makefile without running 'make'.
     DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
     test -z "$DEPDIR" && continue
     am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
+    test -z "$am__include" && continue
     am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
     # Find all dependency output files, they are included files with
     # $(DEPDIR) in their names.  We invoke sed twice because it is the
     # simplest approach to changing $(DEPDIR) to its actual value in the
     # expansion.
     for file in `sed -n "
       s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
       # Make sure the directory exists.
       test -f "$dirpart/$file" && continue
       fdir=`$as_dirname -- "$file" ||
@@ -13073,7 +14340,8 @@ $as_echo X"$file" |
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
 #
 #   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
 #   Written by Gordon Matzigkeit, 1996
 #
 #   This file is part of GNU Libtool.
@@ -13121,6 +14389,15 @@ pic_mode=$pic_mode
 # Whether or not to optimize for fast installation.
 fast_install=$enable_fast_install
 
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
 # The host system.
 host_alias=$host_alias
 host=$host
@@ -13170,9 +14447,11 @@ SP2NL=$lt_lt_SP2NL
 # turn newlines into spaces.
 NL2SP=$lt_lt_NL2SP
 
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
 
 # An object symbol dumper.
 OBJDUMP=$lt_OBJDUMP
@@ -13180,13 +14459,30 @@ OBJDUMP=$lt_OBJDUMP
 # Method to check whether dependent libraries are shared objects.
 deplibs_check_method=$lt_deplibs_check_method
 
-# Command to use when deplibs_check_method == "file_magic".
+# Command to use when deplibs_check_method = "file_magic".
 file_magic_cmd=$lt_file_magic_cmd
 
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
 # The archiver.
 AR=$lt_AR
+
+# Flags to create an archive.
 AR_FLAGS=$lt_AR_FLAGS
 
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
 # A symbol stripping program.
 STRIP=$lt_STRIP
 
@@ -13195,6 +14491,9 @@ RANLIB=$lt_RANLIB
 old_postinstall_cmds=$lt_old_postinstall_cmds
 old_postuninstall_cmds=$lt_old_postuninstall_cmds
 
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
 # A C compiler.
 LTCC=$lt_CC
 
@@ -13213,14 +14512,14 @@ global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 # Transform the output of nm in a C name address pair when lib prefix is needed.
 global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
 
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
 
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
 
-# An echo program that does not interpret backslashes.
-ECHO=$lt_ECHO
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
 
 # Used to examine libraries when file_magic_cmd begins with "file".
 MAGIC_CMD=$MAGIC_CMD
@@ -13228,6 +14527,9 @@ MAGIC_CMD=$MAGIC_CMD
 # Must we lock files when doing compilation?
 need_locks=$lt_need_locks
 
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
 # Tool to manipulate archived DWARF debug symbol files on Mac OS X.
 DSYMUTIL=$lt_DSYMUTIL
 
@@ -13284,6 +14586,9 @@ library_names_spec=$lt_library_names_spec
 # The coded name of the library, if different from the real name.
 soname_spec=$lt_soname_spec
 
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
 # Command to use after installation of a shared archive.
 postinstall_cmds=$lt_postinstall_cmds
 
@@ -13323,6 +14628,10 @@ striplib=$lt_striplib
 # The linker used to build libraries.
 LD=$lt_LD
 
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
 # Commands used to build an old-style archive.
 old_archive_cmds=$lt_old_archive_cmds
 
@@ -13335,12 +14644,12 @@ with_gcc=$GCC
 # Compiler flag to turn off builtin functions.
 no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
 
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
 # Additional compiler flags for building library objects.
 pic_flag=$lt_lt_prog_compiler_pic
 
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
 # Compiler flag to prevent dynamic linking.
 link_static_flag=$lt_lt_prog_compiler_static
 
@@ -13390,10 +14699,6 @@ no_undefined_flag=$lt_no_undefined_flag
 # This must work even if \$libdir does not exist
 hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
 
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
-
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator
 
@@ -13427,9 +14732,6 @@ inherit_rpath=$inherit_rpath
 # Whether libtool must link a program against all its dependency libraries.
 link_all_deplibs=$link_all_deplibs
 
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path
-
 # Set to "yes" if exported symbols are required.
 always_export_symbols=$always_export_symbols
 
@@ -13445,6 +14747,9 @@ include_expsyms=$lt_include_expsyms
 # Commands necessary for linking programs (against libraries) with templates.
 prelink_cmds=$lt_prelink_cmds
 
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
 # Specify filename containing input files.
 file_list_spec=$lt_file_list_spec
 
@@ -13477,212 +14782,169 @@ ltmain="$ac_aux_dir/ltmain.sh"
   # if finds mixed CR/LF and LF-only lines.  Since sed operates in
   # text mode, it properly converts lines to CR/LF.  This bash problem
   # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $* ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[^=]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$@"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1+=\$2"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1=\$$1\$2"
-}
-
-_LT_EOF
-    ;;
-  esac
-
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  if test x"$xsi_shell" = xyes; then
+  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\    # positional parameters, so assign one to ordinary parameter first.\
+\    func_stripname_result=${3}\
+\    func_stripname_result=${func_stripname_result#"${1}"}\
+\    func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\    func_split_long_opt_name=${1%%=*}\
+\    func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\    func_split_short_opt_arg=${1#??}\
+\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\    case ${1} in\
+\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\      *)    func_lo2o_result=${1} ;;\
+\    esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+    func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+    func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+    func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+    eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\    func_quote_for_eval "${2}"\
+\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+   mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
 
index 793c1ca..86ed916 100644 (file)
@@ -1,13 +1,23 @@
-AC_PREREQ(2.57)
-AC_INIT([libzip],[0.10.1],[libzip-discuss@nih.at])
+AC_PREREQ([2.60])
+AC_INIT([libzip],[1.0.1],[libzip@nih.at])
 AC_CONFIG_SRCDIR([lib/zip_add.c])
 AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_MACRO_DIR([m4])
 AM_INIT_AUTOMAKE
 
-dnl AC_CANONICAL_HOST
+AC_CANONICAL_HOST
+dnl Add rpath flags to installed pkg-config (.pc) file on systems that prefer it this way.
+case $host_os in
+    *bsd*)
+        PKG_CONFIG_RPATH=-Wl,-R\${libdir};;
+    *)
+        PKG_CONFIG_RPATH=;;
+esac
+AC_SUBST(PKG_CONFIG_RPATH)
+
 
 AC_PROG_CC
+AC_SYS_LARGEFILE
 AM_PROG_CC_C_O
 
 AC_ARG_WITH(zlib,
@@ -32,7 +42,7 @@ fi
 
 AC_CHECK_LIB(z, main)
 AC_CACHE_CHECK(new ZLIB version, id_cv_lib_zlib_ok, 
-       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <zlib.h>]], [[extern ZEXPORT unzOpen (const char *path);]])],[id_cv_lib_zlib_ok=yes],[id_cv_lib_zlib_ok=no]))
+       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <zlib.h>]], [[extern ZEXPORT int unzOpen (const char *path);]])],[id_cv_lib_zlib_ok=yes],[id_cv_lib_zlib_ok=no]))
 if test "$id_cv_lib_zlib_ok" = "no"
 then
     AC_MSG_ERROR([ZLIB version too old, please install at least v1.1.2])
@@ -40,9 +50,9 @@ fi
 
 AC_EXEEXT
 
-AM_PROG_LIBTOOL
+LT_INIT
 
-AC_CHECK_FUNCS([_open _snprintf _strcmpi _strdup _stricmp fseeko ftello getopt open snprintf strcasecmp strdup])
+AC_CHECK_FUNCS([_close _dup _fdopen _fileno _open _snprintf _strdup _stricmp fseeko ftello getopt open snprintf strcasecmp strdup])
 AC_CHECK_FUNCS([mkstemp], [], [AC_LIBOBJ(mkstemp)])
 
 AC_MSG_CHECKING([MoveFileExA])
@@ -53,7 +63,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <windows.h>],
                        [Define to 1 if you have the `MoveFileExA' function.])],
               [AC_MSG_RESULT([no])])
 
-AC_CHECK_HEADERS([unistd.h])
+AC_CHECK_HEADERS([fts.h stdbool.h strings.h unistd.h])
 
 AC_CHECK_TYPES([int8_t])
 AC_CHECK_TYPES([int16_t])
@@ -63,11 +73,14 @@ AC_CHECK_TYPES([uint8_t])
 AC_CHECK_TYPES([uint16_t])
 AC_CHECK_TYPES([uint32_t])
 AC_CHECK_TYPES([uint64_t])
+AC_CHECK_TYPES([ssize_t])
 
 AC_CHECK_SIZEOF([short])
 AC_CHECK_SIZEOF([int])
 AC_CHECK_SIZEOF([long])
 AC_CHECK_SIZEOF([long long])
+AC_CHECK_SIZEOF([off_t])
+AC_CHECK_SIZEOF([size_t])
 
 AC_STRUCT_TIMEZONE
 
@@ -78,9 +91,26 @@ in
 esac
 AC_SUBST([MANFMT])
 
+AH_BOTTOM([
+#ifndef HAVE_SSIZE_T
+#  if SIZEOF_SIZE_T == SIZEOF_INT
+typedef int ssize_t;
+#  elif SIZEOF_SIZE_T == SIZEOF_LONG
+typedef long ssize_t;
+#  elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG
+typedef long long ssize_t;
+#  else
+#error no suitable type for ssize_t found
+#  endif
+#endif
+])
+
+gl_VISIBILITY
+
 AC_CONFIG_FILES([Makefile
                 libzip.pc
                 libzip-uninstalled.pc
+                examples/Makefile
                 man/Makefile
                 lib/Makefile
                 regress/Makefile
diff --git a/depcomp b/depcomp
index df8eea7..4ebd5b3 100755 (executable)
--- a/depcomp
+++ b/depcomp
@@ -1,10 +1,9 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2013-05-30.07; # UTC
 
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
-# Software Foundation, Inc.
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -28,9 +27,9 @@ scriptversion=2009-04-28.21; # UTC
 
 case $1 in
   '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
   -h | --h*)
     cat <<\EOF
 Usage: depcomp [--help] [--version] PROGRAM [ARGS]
@@ -40,11 +39,11 @@ as side-effects.
 
 Environment variables:
   depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
   DEPDIR      directory where to store dependencies.
   depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputing dependencies.
+  tmpdepfile  Temporary file to use when outputting dependencies.
   libtool     Whether libtool is used (yes/no).
 
 Report bugs to <bug-automake@gnu.org>.
@@ -57,6 +56,66 @@ EOF
     ;;
 esac
 
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='  '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
 if test -z "$depmode" || test -z "$source" || test -z "$object"; then
   echo "depcomp: Variables source, object and depmode must be set" 1>&2
   exit 1
@@ -69,6 +128,9 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
 
 rm -f "$tmpdepfile"
 
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
 # Some modes work just like other modes, but use different flags.  We
 # parameterize here, but still list the modes in the big case below,
 # to make depend.m4 easier to write.  Note that we *cannot* use a case
@@ -80,18 +142,32 @@ if test "$depmode" = hp; then
 fi
 
 if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
 fi
 
 cygpath_u="cygpath -u -f -"
 if test "$depmode" = msvcmsys; then
-   # This is just like msvisualcpp but w/o cygpath translation.
-   # Just convert the backslash-escaped backslashes to single forward
-   # slashes to satisfy depend.m4
-   cygpath_u="sed s,\\\\\\\\,/,g"
-   depmode=msvisualcpp
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
 fi
 
 case "$depmode" in
@@ -114,8 +190,7 @@ gcc3)
   done
   "$@"
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -123,13 +198,17 @@ gcc3)
   ;;
 
 gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
 ## There are various ways to get dependency output from gcc.  Here's
 ## why we pick this rather obscure method:
 ## - Don't want to use -MD because we'd like the dependencies to end
 ##   up in a subdir.  Having to rename by hand is ugly.
 ##   (We might end up doing this anyway to support other compilers.)
 ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
 ## - Using -M directly means running the compiler twice (even worse
 ##   than renaming).
   if test -z "$gccflag"; then
@@ -137,31 +216,31 @@ gcc)
   fi
   "$@" -Wp,"$gccflag$tmpdepfile"
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
   sed -e 's/^[^:]*: / /' \
       -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
+## This next piece of magic avoids the "deleted header file" problem.
 ## The problem is that when a header file which appears in a .P file
 ## is deleted, the dependency causes make to die (because there is
 ## typically no way to rebuild the header).  We avoid this by adding
 ## dummy dependencies for each header file.  Too bad gcc doesn't do
 ## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
+## Some versions of gcc put a space before the ':'.  On the theory
 ## that the space means something, we add a space to the output as
-## well.
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
 ## Some versions of the HPUX 10.20 sed can't process this invocation
 ## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -179,8 +258,7 @@ sgi)
     "$@" -MDupdate "$tmpdepfile"
   fi
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -188,43 +266,41 @@ sgi)
 
   if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
     echo "$object : \\" > "$depfile"
-
     # Clip off the initial element (the dependent).  Don't try to be
     # clever and replace this with sed code, as IRIX sed won't handle
     # lines with more than a fixed number of characters (4096 in
     # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
+    # the IRIX cc adds comments like '#:fec' to the end of the
     # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> "$depfile"
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
     echo >> "$depfile"
-
     # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> "$depfile"
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
   else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
+    make_dummy_depfile
   fi
   rm -f "$tmpdepfile"
   ;;
 
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
 aix)
   # The C for AIX Compiler uses -M and outputs the dependencies
   # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
   # start of each line; $object doesn't have directory information.
   # Version 6 uses the directory in both cases.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  set_dir_from "$object"
+  set_base_from "$object"
   if test "$libtool" = yes; then
     tmpdepfile1=$dir$base.u
     tmpdepfile2=$base.u
@@ -237,9 +313,7 @@ aix)
     "$@" -M
   fi
   stat=$?
-
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
     exit $stat
   fi
@@ -248,44 +322,100 @@ aix)
   do
     test -f "$tmpdepfile" && break
   done
-  if test -f "$tmpdepfile"; then
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-    # That's a tab and a space in the [].
-    sed -e 's,^.*\.[a-z]*:[     ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
   fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
   #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
+  # and will wrap long lines using '\' :
   #    foo.o: sub/foo.c ... \
   #     sub/foo.h ... \
   #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
 
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -297,8 +427,8 @@ icc)
   sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
   # Some versions of the HPUX 10.20 sed can't process this invocation
   # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -309,9 +439,8 @@ hp2)
   # 'foo.d', which lands next to the object file, wherever that
   # happens to be.
   # Much of this is similar to the tru64 case; see comments there.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  set_dir_from  "$object"
+  set_base_from "$object"
   if test "$libtool" = yes; then
     tmpdepfile1=$dir$base.d
     tmpdepfile2=$dir.libs/$base.d
@@ -322,8 +451,7 @@ hp2)
     "$@" +Maked
   fi
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
      rm -f "$tmpdepfile1" "$tmpdepfile2"
      exit $stat
   fi
@@ -333,77 +461,107 @@ hp2)
     test -f "$tmpdepfile" && break
   done
   if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add `dependent.h:' lines.
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
     sed -ne '2,${
-              s/^ *//
-              s/ \\*$//
-              s/$/:/
-              p
-            }' "$tmpdepfile" >> "$depfile"
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
   else
-    echo "#dummy" > "$depfile"
+    make_dummy_depfile
   fi
   rm -f "$tmpdepfile" "$tmpdepfile2"
   ;;
 
 tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mechanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[   ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
 
 #nosideeffect)
   # This comment above is used by automake to tell side-effect
@@ -422,7 +580,7 @@ dashmstdout)
     shift
   fi
 
-  # Remove `-o $object'.
+  # Remove '-o $object'.
   IFS=" "
   for arg
   do
@@ -442,18 +600,18 @@ dashmstdout)
   done
 
   test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
+  # Require at least two characters before searching for ':'
   # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
   "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
   rm -f "$depfile"
   cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -503,12 +661,15 @@ makedepend)
   touch "$tmpdepfile"
   ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
   rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile" "$tmpdepfile".bak
   ;;
 
@@ -525,7 +686,7 @@ cpp)
     shift
   fi
 
-  # Remove `-o $object'.
+  # Remove '-o $object'.
   IFS=" "
   for arg
   do
@@ -544,10 +705,10 @@ cpp)
     esac
   done
 
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
+  "$@" -E \
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    sed '$ s: \\$::' > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
   cat < "$tmpdepfile" >> "$depfile"
@@ -579,23 +740,23 @@ msvisualcpp)
       shift
       ;;
     "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-       set fnord "$@"
-       shift
-       shift
-       ;;
+        set fnord "$@"
+        shift
+        shift
+        ;;
     *)
-       set fnord "$@" "$arg"
-       shift
-       shift
-       ;;
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
     esac
   done
   "$@" -E 2>/dev/null |
   sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::     \1 \\:p' >> "$depfile"
-  echo "       " >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
   sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
new file mode 100644 (file)
index 0000000..db1e686
--- /dev/null
@@ -0,0 +1,13 @@
+CHECK_FUNCTION_EXISTS(getopt HAVE_GETOPT)
+IF(NOT HAVE_GETOPT)
+  SET(SRC_EXTRA_FILES ../src/getopt.c)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_CURRENT_SOURCE_DIR}/../src)
+ENDIF(NOT HAVE_GETOPT)
+
+ADD_EXECUTABLE(in-memory in-memory.c)
+TARGET_LINK_LIBRARIES(in-memory zip)
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../lib
+       ${CMAKE_CURRENT_SOURCE_DIR}/../src
+       ${CMAKE_CURRENT_BINARY_DIR}/..)
diff --git a/examples/Makefile.am b/examples/Makefile.am
new file mode 100644 (file)
index 0000000..7887ac4
--- /dev/null
@@ -0,0 +1,6 @@
+noinst_PROGRAMS=in-memory
+
+in_memory_CPPFLAGS=-I${top_srcdir}/lib -I../lib
+in_memory_LDADD=${top_builddir}/lib/libzip.la
+
+EXTRA_DIST=    CMakeLists.txt windows-open.c
diff --git a/examples/Makefile.in b/examples/Makefile.in
new file mode 100644 (file)
index 0000000..1f4ada9
--- /dev/null
@@ -0,0 +1,589 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+noinst_PROGRAMS = in-memory$(EXEEXT)
+subdir = examples
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+       $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+in_memory_SOURCES = in-memory.c
+in_memory_OBJECTS = in_memory-in-memory.$(OBJEXT)
+in_memory_DEPENDENCIES = ${top_builddir}/lib/libzip.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = in-memory.c
+DIST_SOURCES = in-memory.c
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANFMT = @MANFMT@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG_RPATH = @PKG_CONFIG_RPATH@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+in_memory_CPPFLAGS = -I${top_srcdir}/lib -I../lib
+in_memory_LDADD = ${top_builddir}/lib/libzip.la
+EXTRA_DIST = CMakeLists.txt windows-open.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign examples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+       @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+       echo " rm -f" $$list; \
+       rm -f $$list || exit $$?; \
+       test -n "$(EXEEXT)" || exit 0; \
+       list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+       echo " rm -f" $$list; \
+       rm -f $$list
+
+in-memory$(EXEEXT): $(in_memory_OBJECTS) $(in_memory_DEPENDENCIES) $(EXTRA_in_memory_DEPENDENCIES) 
+       @rm -f in-memory$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(in_memory_OBJECTS) $(in_memory_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/in_memory-in-memory.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+in_memory-in-memory.o: in-memory.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(in_memory_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT in_memory-in-memory.o -MD -MP -MF $(DEPDIR)/in_memory-in-memory.Tpo -c -o in_memory-in-memory.o `test -f 'in-memory.c' || echo '$(srcdir)/'`in-memory.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/in_memory-in-memory.Tpo $(DEPDIR)/in_memory-in-memory.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='in-memory.c' object='in_memory-in-memory.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(in_memory_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_memory-in-memory.o `test -f 'in-memory.c' || echo '$(srcdir)/'`in-memory.c
+
+in_memory-in-memory.obj: in-memory.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(in_memory_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT in_memory-in-memory.obj -MD -MP -MF $(DEPDIR)/in_memory-in-memory.Tpo -c -o in_memory-in-memory.obj `if test -f 'in-memory.c'; then $(CYGPATH_W) 'in-memory.c'; else $(CYGPATH_W) '$(srcdir)/in-memory.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/in_memory-in-memory.Tpo $(DEPDIR)/in_memory-in-memory.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='in-memory.c' object='in_memory-in-memory.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(in_memory_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_memory-in-memory.obj `if test -f 'in-memory.c'; then $(CYGPATH_W) 'in-memory.c'; else $(CYGPATH_W) '$(srcdir)/in-memory.c'; fi`
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       set x; \
+       here=`pwd`; \
+       $(am__define_uniq_tagged_files); \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+       clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+       ctags-am distclean distclean-compile distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/in-memory.c b/examples/in-memory.c
new file mode 100644 (file)
index 0000000..a37ee18
--- /dev/null
@@ -0,0 +1,220 @@
+/*
+  in-memory.c -- modify zip file in memory
+  Copyright (C) 2014-2015 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include <zip.h>
+
+static int
+get_data(void **datap, size_t *sizep, const char *archive)
+{
+    /* example implementation that reads data from file */
+    struct stat st;
+    FILE *fp;
+
+    if (stat(archive, &st) < 0) {
+       if (errno != ENOENT) {
+           fprintf(stderr, "can't stat %s: %s\n", archive, strerror(errno));
+           return -1;
+       }
+
+       *datap = NULL;
+       *sizep = 0;
+       
+       return 0;
+    }
+
+    if ((*datap = malloc((size_t)st.st_size)) == NULL) {
+       fprintf(stderr, "can't allocate buffer\n");
+       return -1;
+    }
+
+    if ((fp=fopen(archive, "r")) == NULL) {
+       free(*datap);
+       fprintf(stderr, "can't open %s: %s\n", archive, strerror(errno));
+       return -1;
+    }
+    
+    if (fread(*datap, 1, (size_t)st.st_size, fp) < (size_t)st.st_size) {
+       free(*datap);
+       fprintf(stderr, "can't read %s: %s\n", archive, strerror(errno));
+       fclose(fp);
+       return -1;
+    }
+
+    fclose(fp);
+
+    *sizep = (size_t)st.st_size;
+    return 0;
+}
+
+static int
+modify_archive(zip_t *za)
+{
+    /* modify the archive */
+    return 0;
+}
+
+
+static int
+use_data(void *data, size_t size, const char *archive)
+{
+    /* example implementation that writes data to file */
+    FILE *fp;
+
+    if (data == NULL) {
+       if (remove(archive) < 0 && errno != ENOENT) {
+           fprintf(stderr, "can't remove %s: %s\n", archive, strerror(errno));
+           return -1;
+       }
+       return 0;
+    }
+
+    if ((fp = fopen(archive, "wb")) == NULL) {
+       fprintf(stderr, "can't open %s: %s\n", archive, strerror(errno));
+       return -1;
+    }
+    if (fwrite(data, 1, size, fp) < size) {
+       fprintf(stderr, "can't write %s: %s\n", archive, strerror(errno));
+       fclose(fp);
+       return -1;
+    }
+    if (fclose(fp) < 0) {
+       fprintf(stderr, "can't write %s: %s\n", archive, strerror(errno));
+       return -1;
+    }
+
+    return 0;
+}
+
+
+int
+main(int argc, char *argv[])
+{
+    const char *archive;
+    zip_source_t *src;
+    zip_t *za;
+    zip_error_t error;
+    void *data;
+    size_t size;
+
+    if (argc < 2) {
+       fprintf(stderr, "usage: %s archive\n", argv[0]);
+       return 1;
+    }
+    archive = argv[1];
+
+    /* get buffer with zip archive inside */
+    if (get_data(&data, &size, archive) < 0) {
+       return 1;
+    }
+
+    zip_error_init(&error);
+    /* create source from buffer */
+    if ((src = zip_source_buffer_create(data, size, 1, &error)) == NULL) {
+       fprintf(stderr, "can't create source: %s\n", zip_error_strerror(&error));
+       free(data);
+       zip_error_fini(&error);
+       return 1;
+    }
+
+    /* open zip archive from source */
+    if ((za = zip_open_from_source(src, 0, &error)) == NULL) {
+       fprintf(stderr, "can't open zip from source: %s\n", zip_error_strerror(&error));
+       zip_source_free(src);
+       zip_error_fini(&error);
+       return 1;
+    }
+    zip_error_fini(&error);
+
+    /* we'll want to read the data back after zip_close */
+    zip_source_keep(src);
+
+    /* modify archive */
+    modify_archive(za);
+
+    /* close archive */
+    if (zip_close(za) < 0) {
+       fprintf(stderr, "can't close zip archive '%s': %s\n", archive, zip_strerror(za));
+       return 1;
+    }
+
+
+    /* copy new archive to buffer */
+
+    if (zip_source_is_deleted(src)) {
+       /* new archive is empty, thus no data */
+       data = NULL;
+    }
+    else {
+       zip_stat_t zst;
+
+       if (zip_source_stat(src, &zst) < 0) {
+           fprintf(stderr, "can't stat source: %s\n", zip_error_strerror(zip_source_error(src)));
+           return 1;
+       }
+
+       size = zst.size;
+
+       if (zip_source_open(src) < 0) {
+           fprintf(stderr, "can't open source: %s\n", zip_error_strerror(zip_source_error(src)));
+           return 1;
+       }
+       if ((data = malloc(size)) == NULL) {
+           fprintf(stderr, "malloc failed: %s\n", strerror(errno));
+           zip_source_close(src);
+           return 1;
+       }
+       if ((zip_uint64_t)zip_source_read(src, data, size) < size) {
+           fprintf(stderr, "can't read data from source: %s\n", zip_error_strerror(zip_source_error(src)));
+           zip_source_close(src);
+           free(data);
+           return 1;
+       }
+       zip_source_close(src);
+    }
+
+    /* we're done with src */
+    zip_source_free(src);
+
+    /* use new data */
+    use_data(data, size, archive);
+
+    free(data);
+
+    return 0;
+}
diff --git a/examples/windows-open.c b/examples/windows-open.c
new file mode 100644 (file)
index 0000000..fdd7034
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+  windows-open.c -- open zip archive using Windows UTF-16/Unicode file name
+  Copyright (C) 2015 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <zip.h>
+
+zip_t *
+windows_open(const wchar_t *name, int flags)
+{
+    zip_source_t *src;
+    zip_t *za;
+    zip_error_t error;
+
+    zip_error_init(&error);
+    /* create source from buffer */
+    if ((src = zip_source_win32w_create(name, 0, -1, &error)) == NULL) {
+       fprintf(stderr, "can't create source: %s\n", zip_error_strerror(&error));
+       zip_error_fini(&error);
+       return NULL;
+    }
+
+    /* open zip archive from source */
+    if ((za = zip_open_from_source(src, flags, &error)) == NULL) {
+       fprintf(stderr, "can't open zip from source: %s\n", zip_error_strerror(&error));
+       zip_source_free(src);
+       zip_error_fini(&error);
+       return NULL;
+    }
+    zip_error_fini(&error);
+
+    return za;
+}
index 68b8100..b12c0f7 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# $NetBSD: install-sh.in,v 1.5 2010/10/08 19:57:05 tez Exp $
+# $NetBSD: install-sh.in,v 1.6 2012/01/11 13:07:31 hans Exp $
 # This script now also installs multiple files, but might choke on installing
 # multiple files with spaces in the file names.
 #
@@ -45,6 +45,7 @@ rmprog="${RMPROG-rm}"
 mkdirprog="${MKDIRPROG-mkdir}"
 
 instcmd="$cpprog"
+instflags=""
 pathcompchmodcmd="$chmodprog 755"
 chmodcmd="$chmodprog 755"
 chowncmd=""
@@ -84,6 +85,11 @@ while [ x"$1" != x ]; do
            shift
            continue;;
 
+       -m*)
+           chmodcmd="$chmodprog ${1#-m}"
+           shift
+           continue;;
+
        -o) chowncmd="$chownprog $2"
            shift
            shift
@@ -104,6 +110,10 @@ while [ x"$1" != x ]; do
            shift
            continue;;
 
+       -p) instflags="-p"
+           shift
+           continue;;
+
        *)  if [ x"$msrc" = x ]
            then
                msrc="$dst"
@@ -154,7 +164,7 @@ else
 
        if [ -f "$srcarg" ]
        then
-               doinst="$instcmd"
+               doinst="$instcmd $instflags"
        elif [ -d "$srcarg" ]
        then
                echo "install: $srcarg: not a regular file"
index af09a39..3bfc622 100644 (file)
@@ -16,9 +16,9 @@ MACRO(CREATE_LIBTOOL_FILE _target _install_DIR)
   GET_TARGET_PROPERTY(_target_location ${_target} LOCATION)
   GET_TARGET_PROPERTY_WITH_DEFAULT(_target_static_lib ${_target} STATIC_LIB "")
   GET_TARGET_PROPERTY_WITH_DEFAULT(_target_dependency_libs ${_target} LT_DEPENDENCY_LIBS "")
-  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_current ${_target} LT_VERSION_CURRENT 0)
-  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_age ${_target} LT_VERSION_AGE 0)
+  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_current ${_target} LT_VERSION_CURRENT 4)
   GET_TARGET_PROPERTY_WITH_DEFAULT(_target_revision ${_target} LT_VERSION_REVISION 0)
+  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_age ${_target} LT_VERSION_AGE 0)
   GET_TARGET_PROPERTY_WITH_DEFAULT(_target_installed ${_target} LT_INSTALLED yes)
   GET_TARGET_PROPERTY_WITH_DEFAULT(_target_shouldnotlink ${_target} LT_SHOULDNOTLINK yes)
   GET_TARGET_PROPERTY_WITH_DEFAULT(_target_dlopen ${_target} LT_DLOPEN "")
@@ -55,11 +55,14 @@ ENDMACRO(CREATE_LIBTOOL_FILE)
 SET(LIBZIP_SOURCES
   zip_add.c
   zip_add_dir.c
+  zip_add_entry.c
+  zip_buffer.c
   zip_close.c
   zip_delete.c
+  zip_dir_add.c
   zip_dirent.c
-  zip_entry_free.c
-  zip_entry_new.c
+  zip_discard.c
+  zip_entry.c
   zip_err_str.c
   zip_error.c
   zip_error_clear.c
@@ -67,11 +70,21 @@ SET(LIBZIP_SOURCES
   zip_error_get_sys_type.c
   zip_error_strerror.c
   zip_error_to_str.c
+  zip_extra_field.c
+  zip_extra_field_api.c
   zip_fclose.c
   zip_fdopen.c
+  zip_file_add.c
   zip_file_error_clear.c
   zip_file_error_get.c
+  zip_file_get_comment.c
+  zip_file_get_external_attributes.c
   zip_file_get_offset.c
+  zip_file_rename.c
+  zip_file_replace.c
+  zip_file_set_comment.c
+  zip_file_set_external_attributes.c
+  zip_file_set_mtime.c
   zip_file_strerror.c
   zip_filerange_crc.c
   zip_fopen.c
@@ -79,15 +92,15 @@ SET(LIBZIP_SOURCES
   zip_fopen_index.c
   zip_fopen_index_encrypted.c
   zip_fread.c
-  zip_free.c
   zip_get_archive_comment.c
   zip_get_archive_flag.c
   zip_get_compression_implementation.c
   zip_get_encryption_implementation.c
   zip_get_file_comment.c
-  zip_get_file_extra.c
   zip_get_name.c
+  zip_get_num_entries.c
   zip_get_num_files.c
+  zip_io_util.c
   zip_memdup.c
   zip_name_locate.c
   zip_new.c
@@ -98,38 +111,65 @@ SET(LIBZIP_SOURCES
   zip_set_archive_flag.c
   zip_set_default_password.c
   zip_set_file_comment.c
-  zip_set_file_extra.c
+  zip_set_file_compression.c
   zip_set_name.c
+  zip_source_begin_write.c
   zip_source_buffer.c
+  zip_source_call.c
   zip_source_close.c
+  zip_source_commit_write.c
   zip_source_crc.c
   zip_source_deflate.c
   zip_source_error.c
-  zip_source_file.c
   zip_source_filep.c
   zip_source_free.c
   zip_source_function.c
+  zip_source_is_deleted.c
   zip_source_layered.c
   zip_source_open.c
   zip_source_pkware.c
-  zip_source_pop.c
   zip_source_read.c
+  zip_source_remove.c
+  zip_source_rollback_write.c
+  zip_source_seek.c
+  zip_source_seek_write.c
   zip_source_stat.c
+  zip_source_supports.c
+  zip_source_tell.c
+  zip_source_tell_write.c
+  zip_source_window.c
+  zip_source_write.c
   zip_source_zip.c
+  zip_source_zip_new.c
   zip_stat.c
   zip_stat_index.c
   zip_stat_init.c
   zip_strerror.c
+  zip_string.c
   zip_unchange.c
   zip_unchange_all.c
   zip_unchange_archive.c
   zip_unchange_data.c
+  zip_utf-8.c
 )
 
+IF(WIN32)
+  SET(LIBZIP_OPSYS_FILES
+    zip_source_win32a.c
+    zip_source_win32handle.c
+    zip_source_win32utf8.c
+    zip_source_win32w.c
+  )
+ELSE(WIN32)
+  SET(LIBZIP_OPSYS_FILES
+    zip_source_file.c
+  )
+ENDIF(WIN32)
+
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}
   ${CMAKE_CURRENT_BINARY_DIR}/..)
 
-# XXX: distribute instead?
+# TODO: distribute instead?
 #ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zip_err_str.c
 #  COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/make_zip_err_str.sh
 #    ${CMAKE_CURRENT_SOURCE_DIR}/zip.h
@@ -142,10 +182,11 @@ IF(NOT HAVE_MKSTEMP)
   SET(LIBZIP_EXTRA_FILES mkstemp.c)
 ENDIF(NOT HAVE_MKSTEMP)
 
-ADD_LIBRARY(zip SHARED ${LIBZIP_SOURCES} ${LIBZIP_EXTRA_FILES})
+ADD_LIBRARY(zip SHARED ${LIBZIP_SOURCES} ${LIBZIP_EXTRA_FILES} ${LIBZIP_OPSYS_FILES})
 SET_TARGET_PROPERTIES(zip PROPERTIES VERSION 3.0 SOVERSION 3 )
 TARGET_LINK_LIBRARIES(zip ${ZLIB_LIBRARY})
 INSTALL(TARGETS zip
-       ARCHIVE DESTINATION lib
-       LIBRARY DESTINATION lib)
+  RUNTIME DESTINATION bin
+  ARCHIVE DESTINATION lib
+  LIBRARY DESTINATION lib)
 #CREATE_LIBTOOL_FILE(zip lib)
index 9f7be38..c43ed4b 100644 (file)
@@ -1,22 +1,26 @@
+AM_CFLAGS=     @CFLAG_VISIBILITY@
 libincludedir = ${libdir}/@PACKAGE@/include
 
 lib_LTLIBRARIES = libzip.la
 noinst_HEADERS = zipint.h
 include_HEADERS = zip.h
-libinclude_HEADERS = zipconf.h
+nodist_libinclude_HEADERS = zipconf.h
 
 # also update CMakeLists.txt when changing version
-libzip_la_LDFLAGS=-no-undefined -version-info 3:0:1
+libzip_la_LDFLAGS=-no-undefined -version-info 4:0:0
 libzip_la_LIBADD=@LTLIBOBJS@
 
 libzip_la_SOURCES=\
        zip_add.c \
        zip_add_dir.c \
+       zip_add_entry.c \
+       zip_buffer.c \
        zip_close.c \
        zip_delete.c \
+       zip_dir_add.c \
        zip_dirent.c \
-       zip_entry_free.c \
-       zip_entry_new.c \
+       zip_discard.c \
+       zip_entry.c \
        zip_err_str.c \
        zip_error.c \
        zip_error_clear.c \
@@ -24,11 +28,21 @@ libzip_la_SOURCES=\
        zip_error_get_sys_type.c \
        zip_error_strerror.c \
        zip_error_to_str.c \
+       zip_extra_field.c \
+       zip_extra_field_api.c \
        zip_fclose.c \
        zip_fdopen.c \
+       zip_file_add.c \
        zip_file_error_clear.c \
        zip_file_error_get.c \
+       zip_file_get_comment.c \
+       zip_file_get_external_attributes.c \
        zip_file_get_offset.c \
+       zip_file_rename.c \
+       zip_file_replace.c \
+       zip_file_set_comment.c \
+       zip_file_set_external_attributes.c \
+       zip_file_set_mtime.c \
        zip_file_strerror.c \
        zip_filerange_crc.c \
        zip_fopen.c \
@@ -36,16 +50,15 @@ libzip_la_SOURCES=\
        zip_fopen_index.c \
        zip_fopen_index_encrypted.c \
        zip_fread.c \
-       zip_free.c \
        zip_get_archive_comment.c \
        zip_get_archive_flag.c \
        zip_get_compression_implementation.c \
        zip_get_encryption_implementation.c \
        zip_get_file_comment.c \
-       zip_get_file_extra.c \
        zip_get_num_entries.c \
        zip_get_num_files.c \
        zip_get_name.c \
+       zip_io_util.c \
        zip_memdup.c \
        zip_name_locate.c \
        zip_new.c \
@@ -56,9 +69,13 @@ libzip_la_SOURCES=\
        zip_set_archive_flag.c \
        zip_set_default_password.c \
        zip_set_file_comment.c \
-       zip_set_file_extra.c \
+       zip_set_file_compression.c \
+       zip_set_name.c \
+       zip_source_begin_write.c \
        zip_source_buffer.c \
+       zip_source_call.c \
        zip_source_close.c \
+       zip_source_commit_write.c \
        zip_source_crc.c \
        zip_source_deflate.c \
        zip_source_error.c \
@@ -66,29 +83,45 @@ libzip_la_SOURCES=\
        zip_source_filep.c \
        zip_source_free.c \
        zip_source_function.c \
+       zip_source_is_deleted.c \
        zip_source_layered.c \
        zip_source_open.c \
        zip_source_pkware.c \
-       zip_source_pop.c \
        zip_source_read.c \
+       zip_source_remove.c \
+       zip_source_rollback_write.c \
+       zip_source_seek.c \
+       zip_source_seek_write.c \
        zip_source_stat.c \
+       zip_source_supports.c \
+       zip_source_tell.c \
+       zip_source_tell_write.c \
+       zip_source_window.c \
+       zip_source_write.c \
        zip_source_zip.c \
-       zip_set_name.c \
+       zip_source_zip_new.c \
        zip_stat.c \
        zip_stat_index.c \
        zip_stat_init.c \
        zip_strerror.c \
+       zip_string.c \
        zip_unchange.c \
        zip_unchange_all.c \
        zip_unchange_archive.c \
-       zip_unchange_data.c
+       zip_unchange_data.c \
+       zip_utf-8.c
 
-BUILT_SOURCES=zip_err_str.c zipconf.h
+BUILT_SOURCES=zipconf.h
 CLEANFILES=    ${BUILT_SOURCES}
 
 EXTRA_DIST=    CMakeLists.txt \
                make_zip_err_str.sh \
-               make_zipconf.sh
+               make_zipconf.sh \
+               zip_source_win32a.c \
+               zip_source_win32handle.c \
+               zip_source_win32utf8.c \
+               zip_source_win32w.c \
+               zipwin32.h
 
 zip_err_str.c: zip.h make_zip_err_str.sh
        sh $(srcdir)/make_zip_err_str.sh $(srcdir)/zip.h zip_err_str.c
index 9059850..c82b29c 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -36,17 +80,16 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 subdir = lib
-DIST_COMMON = $(include_HEADERS) $(libinclude_HEADERS) \
-       $(noinst_HEADERS) $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-       mkstemp.c
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am mkstemp.c \
+       $(top_srcdir)/depcomp $(include_HEADERS) $(noinst_HEADERS)
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
@@ -71,62 +114,128 @@ am__nobase_list = $(am__nobase_strip_setup); \
 am__base_list = \
   sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
   sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" \
        "$(DESTDIR)$(libincludedir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libzip_la_DEPENDENCIES = @LTLIBOBJS@
-am_libzip_la_OBJECTS = zip_add.lo zip_add_dir.lo zip_close.lo \
-       zip_delete.lo zip_dirent.lo zip_entry_free.lo zip_entry_new.lo \
-       zip_err_str.lo zip_error.lo zip_error_clear.lo \
-       zip_error_get.lo zip_error_get_sys_type.lo \
-       zip_error_strerror.lo zip_error_to_str.lo zip_fclose.lo \
-       zip_fdopen.lo zip_file_error_clear.lo zip_file_error_get.lo \
-       zip_file_get_offset.lo zip_file_strerror.lo \
+am_libzip_la_OBJECTS = zip_add.lo zip_add_dir.lo zip_add_entry.lo \
+       zip_buffer.lo zip_close.lo zip_delete.lo zip_dir_add.lo \
+       zip_dirent.lo zip_discard.lo zip_entry.lo zip_err_str.lo \
+       zip_error.lo zip_error_clear.lo zip_error_get.lo \
+       zip_error_get_sys_type.lo zip_error_strerror.lo \
+       zip_error_to_str.lo zip_extra_field.lo zip_extra_field_api.lo \
+       zip_fclose.lo zip_fdopen.lo zip_file_add.lo \
+       zip_file_error_clear.lo zip_file_error_get.lo \
+       zip_file_get_comment.lo zip_file_get_external_attributes.lo \
+       zip_file_get_offset.lo zip_file_rename.lo zip_file_replace.lo \
+       zip_file_set_comment.lo zip_file_set_external_attributes.lo \
+       zip_file_set_mtime.lo zip_file_strerror.lo \
        zip_filerange_crc.lo zip_fopen.lo zip_fopen_encrypted.lo \
        zip_fopen_index.lo zip_fopen_index_encrypted.lo zip_fread.lo \
-       zip_free.lo zip_get_archive_comment.lo zip_get_archive_flag.lo \
+       zip_get_archive_comment.lo zip_get_archive_flag.lo \
        zip_get_compression_implementation.lo \
        zip_get_encryption_implementation.lo zip_get_file_comment.lo \
-       zip_get_file_extra.lo zip_get_num_entries.lo \
-       zip_get_num_files.lo zip_get_name.lo zip_memdup.lo \
-       zip_name_locate.lo zip_new.lo zip_open.lo zip_rename.lo \
-       zip_replace.lo zip_set_archive_comment.lo \
-       zip_set_archive_flag.lo zip_set_default_password.lo \
-       zip_set_file_comment.lo zip_set_file_extra.lo \
-       zip_source_buffer.lo zip_source_close.lo zip_source_crc.lo \
+       zip_get_num_entries.lo zip_get_num_files.lo zip_get_name.lo \
+       zip_io_util.lo zip_memdup.lo zip_name_locate.lo zip_new.lo \
+       zip_open.lo zip_rename.lo zip_replace.lo \
+       zip_set_archive_comment.lo zip_set_archive_flag.lo \
+       zip_set_default_password.lo zip_set_file_comment.lo \
+       zip_set_file_compression.lo zip_set_name.lo \
+       zip_source_begin_write.lo zip_source_buffer.lo \
+       zip_source_call.lo zip_source_close.lo \
+       zip_source_commit_write.lo zip_source_crc.lo \
        zip_source_deflate.lo zip_source_error.lo zip_source_file.lo \
        zip_source_filep.lo zip_source_free.lo zip_source_function.lo \
-       zip_source_layered.lo zip_source_open.lo zip_source_pkware.lo \
-       zip_source_pop.lo zip_source_read.lo zip_source_stat.lo \
-       zip_source_zip.lo zip_set_name.lo zip_stat.lo \
-       zip_stat_index.lo zip_stat_init.lo zip_strerror.lo \
-       zip_unchange.lo zip_unchange_all.lo zip_unchange_archive.lo \
-       zip_unchange_data.lo
+       zip_source_is_deleted.lo zip_source_layered.lo \
+       zip_source_open.lo zip_source_pkware.lo zip_source_read.lo \
+       zip_source_remove.lo zip_source_rollback_write.lo \
+       zip_source_seek.lo zip_source_seek_write.lo zip_source_stat.lo \
+       zip_source_supports.lo zip_source_tell.lo \
+       zip_source_tell_write.lo zip_source_window.lo \
+       zip_source_write.lo zip_source_zip.lo zip_source_zip_new.lo \
+       zip_stat.lo zip_stat_index.lo zip_stat_init.lo zip_strerror.lo \
+       zip_string.lo zip_unchange.lo zip_unchange_all.lo \
+       zip_unchange_archive.lo zip_unchange_data.lo zip_utf-8.lo
 libzip_la_OBJECTS = $(am_libzip_la_OBJECTS)
-libzip_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libzip_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
        $(libzip_la_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-       --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-       --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-       $(LDFLAGS) -o $@
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 SOURCES = $(libzip_la_SOURCES)
 DIST_SOURCES = $(libzip_la_SOURCES)
-HEADERS = $(include_HEADERS) $(libinclude_HEADERS) $(noinst_HEADERS)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+HEADERS = $(include_HEADERS) $(nodist_libinclude_HEADERS) \
+       $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -135,11 +244,13 @@ AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -149,6 +260,7 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -164,6 +276,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MANFMT = @MANFMT@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -179,6 +292,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG_RPATH = @PKG_CONFIG_RPATH@
 RANLIB = @RANLIB@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
@@ -189,6 +303,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
@@ -221,7 +336,6 @@ libdir = @libdir@
 libexecdir = @libexecdir@
 localedir = @localedir@
 localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
@@ -237,23 +351,27 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_CFLAGS = @CFLAG_VISIBILITY@
 libincludedir = ${libdir}/@PACKAGE@/include
 lib_LTLIBRARIES = libzip.la
 noinst_HEADERS = zipint.h
 include_HEADERS = zip.h
-libinclude_HEADERS = zipconf.h
+nodist_libinclude_HEADERS = zipconf.h
 
 # also update CMakeLists.txt when changing version
-libzip_la_LDFLAGS = -no-undefined -version-info 3:0:1
+libzip_la_LDFLAGS = -no-undefined -version-info 4:0:0
 libzip_la_LIBADD = @LTLIBOBJS@
 libzip_la_SOURCES = \
        zip_add.c \
        zip_add_dir.c \
+       zip_add_entry.c \
+       zip_buffer.c \
        zip_close.c \
        zip_delete.c \
+       zip_dir_add.c \
        zip_dirent.c \
-       zip_entry_free.c \
-       zip_entry_new.c \
+       zip_discard.c \
+       zip_entry.c \
        zip_err_str.c \
        zip_error.c \
        zip_error_clear.c \
@@ -261,11 +379,21 @@ libzip_la_SOURCES = \
        zip_error_get_sys_type.c \
        zip_error_strerror.c \
        zip_error_to_str.c \
+       zip_extra_field.c \
+       zip_extra_field_api.c \
        zip_fclose.c \
        zip_fdopen.c \
+       zip_file_add.c \
        zip_file_error_clear.c \
        zip_file_error_get.c \
+       zip_file_get_comment.c \
+       zip_file_get_external_attributes.c \
        zip_file_get_offset.c \
+       zip_file_rename.c \
+       zip_file_replace.c \
+       zip_file_set_comment.c \
+       zip_file_set_external_attributes.c \
+       zip_file_set_mtime.c \
        zip_file_strerror.c \
        zip_filerange_crc.c \
        zip_fopen.c \
@@ -273,16 +401,15 @@ libzip_la_SOURCES = \
        zip_fopen_index.c \
        zip_fopen_index_encrypted.c \
        zip_fread.c \
-       zip_free.c \
        zip_get_archive_comment.c \
        zip_get_archive_flag.c \
        zip_get_compression_implementation.c \
        zip_get_encryption_implementation.c \
        zip_get_file_comment.c \
-       zip_get_file_extra.c \
        zip_get_num_entries.c \
        zip_get_num_files.c \
        zip_get_name.c \
+       zip_io_util.c \
        zip_memdup.c \
        zip_name_locate.c \
        zip_new.c \
@@ -293,9 +420,13 @@ libzip_la_SOURCES = \
        zip_set_archive_flag.c \
        zip_set_default_password.c \
        zip_set_file_comment.c \
-       zip_set_file_extra.c \
+       zip_set_file_compression.c \
+       zip_set_name.c \
+       zip_source_begin_write.c \
        zip_source_buffer.c \
+       zip_source_call.c \
        zip_source_close.c \
+       zip_source_commit_write.c \
        zip_source_crc.c \
        zip_source_deflate.c \
        zip_source_error.c \
@@ -303,28 +434,44 @@ libzip_la_SOURCES = \
        zip_source_filep.c \
        zip_source_free.c \
        zip_source_function.c \
+       zip_source_is_deleted.c \
        zip_source_layered.c \
        zip_source_open.c \
        zip_source_pkware.c \
-       zip_source_pop.c \
        zip_source_read.c \
+       zip_source_remove.c \
+       zip_source_rollback_write.c \
+       zip_source_seek.c \
+       zip_source_seek_write.c \
        zip_source_stat.c \
+       zip_source_supports.c \
+       zip_source_tell.c \
+       zip_source_tell_write.c \
+       zip_source_window.c \
+       zip_source_write.c \
        zip_source_zip.c \
-       zip_set_name.c \
+       zip_source_zip_new.c \
        zip_stat.c \
        zip_stat_index.c \
        zip_stat_init.c \
        zip_strerror.c \
+       zip_string.c \
        zip_unchange.c \
        zip_unchange_all.c \
        zip_unchange_archive.c \
-       zip_unchange_data.c
+       zip_unchange_data.c \
+       zip_utf-8.c
 
-BUILT_SOURCES = zip_err_str.c zipconf.h
+BUILT_SOURCES = zipconf.h
 CLEANFILES = ${BUILT_SOURCES}
 EXTRA_DIST = CMakeLists.txt \
                make_zip_err_str.sh \
-               make_zipconf.sh
+               make_zipconf.sh \
+               zip_source_win32a.c \
+               zip_source_win32handle.c \
+               zip_source_win32utf8.c \
+               zip_source_win32w.c \
+               zipwin32.h
 
 all: $(BUILT_SOURCES)
        $(MAKE) $(AM_MAKEFLAGS) all-am
@@ -361,9 +508,9 @@ $(top_srcdir)/configure:  $(am__configure_deps)
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
+
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
        @$(NORMAL_INSTALL)
-       test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
        @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
        list2=; for p in $$list; do \
          if test -f $$p; then \
@@ -371,6 +518,8 @@ install-libLTLIBRARIES: $(lib_LTLIBRARIES)
          else :; fi; \
        done; \
        test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
          echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
          $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
        }
@@ -386,14 +535,17 @@ uninstall-libLTLIBRARIES:
 
 clean-libLTLIBRARIES:
        -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-       @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-         test "$$dir" != "$$p" || dir=.; \
-         echo "rm -f \"$${dir}/so_locations\""; \
-         rm -f "$${dir}/so_locations"; \
-       done
-libzip.la: $(libzip_la_OBJECTS) $(libzip_la_DEPENDENCIES) 
-       $(libzip_la_LINK) -rpath $(libdir) $(libzip_la_OBJECTS) $(libzip_la_LIBADD) $(LIBS)
+       @list='$(lib_LTLIBRARIES)'; \
+       locs=`for p in $$list; do echo $$p; done | \
+             sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+             sort -u`; \
+       test -z "$$locs" || { \
+         echo rm -f $${locs}; \
+         rm -f $${locs}; \
+       }
+
+libzip.la: $(libzip_la_OBJECTS) $(libzip_la_DEPENDENCIES) $(EXTRA_libzip_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(libzip_la_LINK) -rpath $(libdir) $(libzip_la_OBJECTS) $(libzip_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -404,11 +556,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/mkstemp.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_add.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_add_dir.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_add_entry.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_buffer.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_close.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_delete.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_dir_add.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_dirent.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_entry_free.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_entry_new.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_discard.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_entry.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_err_str.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_error.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_error_clear.Plo@am__quote@
@@ -416,11 +571,21 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_error_get_sys_type.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_error_strerror.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_error_to_str.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_extra_field.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_extra_field_api.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_fclose.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_fdopen.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_file_add.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_file_error_clear.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_file_error_get.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_file_get_comment.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_file_get_external_attributes.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_file_get_offset.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_file_rename.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_file_replace.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_file_set_comment.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_file_set_external_attributes.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_file_set_mtime.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_file_strerror.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_filerange_crc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_fopen.Plo@am__quote@
@@ -428,16 +593,15 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_fopen_index.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_fopen_index_encrypted.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_fread.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_free.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_get_archive_comment.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_get_archive_flag.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_get_compression_implementation.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_get_encryption_implementation.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_get_file_comment.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_get_file_extra.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_get_name.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_get_num_entries.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_get_num_files.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_io_util.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_memdup.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_name_locate.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_new.Plo@am__quote@
@@ -448,10 +612,13 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_set_archive_flag.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_set_default_password.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_set_file_comment.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_set_file_extra.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_set_file_compression.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_set_name.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_begin_write.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_buffer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_call.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_close.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_commit_write.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_crc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_deflate.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_error.Plo@am__quote@
@@ -459,42 +626,54 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_filep.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_free.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_function.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_is_deleted.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_layered.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_open.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_pkware.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_pop.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_read.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_remove.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_rollback_write.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_seek.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_seek_write.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_stat.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_supports.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_tell.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_tell_write.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_window.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_write.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_zip.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_source_zip_new.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_stat.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_stat_index.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_stat_init.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_strerror.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_string.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_unchange.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_unchange_all.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_unchange_archive.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_unchange_data.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip_utf-8.Plo@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .c.lo:
-@am__fastdepCC_TRUE@   $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LTCOMPILE) -c -o $@ $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
 mostlyclean-libtool:
        -rm -f *.lo
@@ -503,8 +682,11 @@ clean-libtool:
        -rm -rf .libs _libs
 install-includeHEADERS: $(include_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
        @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -518,13 +700,14 @@ uninstall-includeHEADERS:
        @$(NORMAL_UNINSTALL)
        @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       test -n "$$files" || exit 0; \
-       echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
-       cd "$(DESTDIR)$(includedir)" && rm -f $$files
-install-libincludeHEADERS: $(libinclude_HEADERS)
+       dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+install-nodist_libincludeHEADERS: $(nodist_libinclude_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(libincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libincludedir)"
-       @list='$(libinclude_HEADERS)'; test -n "$(libincludedir)" || list=; \
+       @list='$(nodist_libinclude_HEADERS)'; test -n "$(libincludedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libincludedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libincludedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -534,34 +717,21 @@ install-libincludeHEADERS: $(libinclude_HEADERS)
          $(INSTALL_HEADER) $$files "$(DESTDIR)$(libincludedir)" || exit $$?; \
        done
 
-uninstall-libincludeHEADERS:
+uninstall-nodist_libincludeHEADERS:
        @$(NORMAL_UNINSTALL)
-       @list='$(libinclude_HEADERS)'; test -n "$(libincludedir)" || list=; \
+       @list='$(nodist_libinclude_HEADERS)'; test -n "$(libincludedir)" || list=; \
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       test -n "$$files" || exit 0; \
-       echo " ( cd '$(DESTDIR)$(libincludedir)' && rm -f" $$files ")"; \
-       cd "$(DESTDIR)$(libincludedir)" && rm -f $$files
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+       dir='$(DESTDIR)$(libincludedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -573,15 +743,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -590,6 +756,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -643,10 +824,15 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -683,7 +869,8 @@ info: info-am
 
 info-am:
 
-install-data-am: install-includeHEADERS install-libincludeHEADERS
+install-data-am: install-includeHEADERS \
+       install-nodist_libincludeHEADERS
 
 install-dvi: install-dvi-am
 
@@ -730,25 +917,26 @@ ps: ps-am
 ps-am:
 
 uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES \
-       uninstall-libincludeHEADERS
+       uninstall-nodist_libincludeHEADERS
 
 .MAKE: all check install install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-       clean-libLTLIBRARIES clean-libtool ctags distclean \
-       distclean-compile distclean-generic distclean-libtool \
-       distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-includeHEADERS install-info \
-       install-info-am install-libLTLIBRARIES \
-       install-libincludeHEADERS install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+       clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \
+       ctags-am distclean distclean-compile distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am \
+       install-includeHEADERS install-info install-info-am \
+       install-libLTLIBRARIES install-man \
+       install-nodist_libincludeHEADERS install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
        maintainer-clean-generic mostlyclean mostlyclean-compile \
        mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags uninstall uninstall-am uninstall-includeHEADERS \
-       uninstall-libLTLIBRARIES uninstall-libincludeHEADERS
+       tags tags-am uninstall uninstall-am uninstall-includeHEADERS \
+       uninstall-libLTLIBRARIES uninstall-nodist_libincludeHEADERS
 
 
 zip_err_str.c: zip.h make_zip_err_str.sh
index 51ea9b9..8d98f23 100644 (file)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 #  make_zip_err_str.sh: create zip_err_str.c from zip.h
-#  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+#  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 #
 #  This file is part of libzip, a library to manipulate ZIP archives.
 #  The authors can be contacted at <libzip@nih.at>
@@ -53,8 +53,6 @@ cat <<EOF >> "$2.$$" || exit 1
 
 #include "zipint.h"
 
-\f
-
 const char * const _zip_err_str[] = {
 EOF
 
index 5623cd0..12e7b0a 100644 (file)
@@ -44,13 +44,13 @@ define_type()
 
     bits=`expr $bytes '*' 8`
     type="${short}int${bits}"
-    TYPE=`echo $type | tr a-z A-Z`
+    TYPE=`echo $type | tr '[a-z]' '[A-Z]'`
     if grep "define HAVE_${TYPE}_T" "$infile" > /dev/null
     then
        echo "typedef ${type}_t zip_${type}_t;" >> "$outfile"
        LTYPE="$TYPE"
     else
-       SHORT=`echo $short | tr a-z A-Z`
+       SHORT=`echo $short | tr '[a-z]' '[A-Z]'`
        if [ -z "$SHORT" ]
        then
            SHORT='S'
@@ -65,7 +65,7 @@ define_type()
            LTYPE="${SHORT}CHAR"
        else
            ctype=`sed -n "s/.define SIZEOF_\([A-Z_]*\) $bytes/\1/p" "$infile" \
-               | head -1 | tr A-Z_ 'a-z '`
+               | head -1 | tr '[A-Z_]' '[a-z ]'`
            if [ -z "$ctype" ]
            then
                echo "$0: no $bits bit type found" >&2
index 843d5e3..2ccd3a4 100644 (file)
@@ -48,7 +48,6 @@
 #define O_BINARY 0
 #endif
 
-\f
 
 int
 _zip_mkstemp(char *path)
index f8b55ac..27141b3 100644 (file)
--- a/lib/zip.h
+++ b/lib/zip.h
@@ -3,7 +3,7 @@
 
 /*
   zip.h -- exported declarations.
-  Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #ifndef ZIP_EXTERN
-#ifdef _WIN32
-#define ZIP_EXTERN __declspec(dllimport)
-#else
-#define ZIP_EXTERN
-#endif
+# ifndef ZIP_STATIC
+#  ifdef _WIN32
+#   define ZIP_EXTERN __declspec(dllimport)
+#  elif defined(__GNUC__) && __GNUC__ >= 4
+#   define ZIP_EXTERN __attribute__ ((visibility ("default")))
+#  else
+#   define ZIP_EXTERN
+#  endif
+# else
+#  define ZIP_EXTERN
+# endif
 #endif
 
 #ifdef __cplusplus
 extern "C" {
+#if 0
+} /* fix autoindent */
+#endif
 #endif
 
 #include <zipconf.h>
@@ -59,27 +67,37 @@ extern "C" {
 #define ZIP_CREATE           1
 #define ZIP_EXCL             2
 #define ZIP_CHECKCONS        4
+#define ZIP_TRUNCATE         8
+#define ZIP_RDONLY          16
 
 
 /* flags for zip_name_locate, zip_fopen, zip_stat, ... */
 
-#define ZIP_FL_NOCASE          1 /* ignore case on name lookup */
-#define ZIP_FL_NODIR           2 /* ignore directory component */
-#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_NOCASE          1u /* ignore case on name lookup */
+#define ZIP_FL_NODIR           2u /* ignore directory component */
+#define ZIP_FL_COMPRESSED      4u /* read compressed data */
+#define ZIP_FL_UNCHANGED       8u /* use original data, ignoring changes */
+#define ZIP_FL_RECOMPRESS      16u /* force recompression of data */
+#define ZIP_FL_ENCRYPTED       32u /* read encrypted data (implies ZIP_FL_COMPRESSED) */
+#define ZIP_FL_ENC_GUESS        0u /* guess string encoding (is default) */
+#define ZIP_FL_ENC_RAW         64u /* get unmodified string */
+#define ZIP_FL_ENC_STRICT     128u /* follow specification strictly */
+#define ZIP_FL_LOCAL         256u /* in local header */
+#define ZIP_FL_CENTRAL       512u /* in central directory */
+/*                           1024u    reserved for internal use */
+#define ZIP_FL_ENC_UTF_8     2048u /* string is UTF-8 encoded */
+#define ZIP_FL_ENC_CP437     4096u /* string is CP437 encoded */
+#define ZIP_FL_OVERWRITE     8192u /* zip_file_add: if file with name exists, overwrite (replace) it */
 
 /* archive global flags flags */
 
-#define ZIP_AFL_TORRENT                1 /* torrent zipped */
-#define ZIP_AFL_RDONLY         2 /* read only -- cannot be cleared */
+#define ZIP_AFL_RDONLY         2u /* read only -- cannot be cleared */
 
 
-/* flags for compression and encryption sources */
+/* create a new extra field */
 
-#define ZIP_CODEC_ENCODE       1 /* compress/encrypt */
+#define ZIP_EXTRA_FIELD_ALL    ZIP_UINT16_MAX
+#define ZIP_EXTRA_FIELD_NEW    ZIP_UINT16_MAX
 
 
 /* libzip error codes */
@@ -101,7 +119,7 @@ extern "C" {
 #define ZIP_ER_MEMORY        14  /* N Malloc failure */
 #define ZIP_ER_CHANGED       15  /* N Entry has been changed */
 #define ZIP_ER_COMPNOTSUPP   16  /* N Compression method not supported */
-#define ZIP_ER_EOF           17  /* N Premature EOF */
+#define ZIP_ER_EOF           17  /* N Premature end of file */
 #define ZIP_ER_INVAL         18  /* N Invalid argument */
 #define ZIP_ER_NOZIP         19  /* N Not a zip archive */
 #define ZIP_ER_INTERNAL      20  /* N Internal error */
@@ -112,6 +130,9 @@ extern "C" {
 #define ZIP_ER_RDONLY        25  /* N Read-only archive */ 
 #define ZIP_ER_NOPASSWD      26  /* N No password provided */
 #define ZIP_ER_WRONGPASSWD   27  /* N Wrong password provided */
+#define ZIP_ER_OPNOTSUPP     28  /* N Operation not supported */
+#define ZIP_ER_INUSE         29  /* N Resource still in use */
+#define ZIP_ER_TELL          30  /* S Tell error */
 
 /* type of system error value */
 
@@ -160,28 +181,100 @@ extern "C" {
 #endif
 #define ZIP_EM_UNKNOWN    0xffff  /* unknown algorithm */
 
-\f
+#define ZIP_OPSYS_DOS          0x00u
+#define ZIP_OPSYS_AMIGA                0x01u
+#define ZIP_OPSYS_OPENVMS      0x02u
+#define ZIP_OPSYS_UNIX         0x03u
+#define ZIP_OPSYS_VM_CMS       0x04u
+#define ZIP_OPSYS_ATARI_ST     0x05u
+#define ZIP_OPSYS_OS_2         0x06u
+#define ZIP_OPSYS_MACINTOSH    0x07u
+#define ZIP_OPSYS_Z_SYSTEM     0x08u
+#define ZIP_OPSYS_CPM          0x09u
+#define ZIP_OPSYS_WINDOWS_NTFS 0x0au
+#define ZIP_OPSYS_MVS          0x0bu
+#define ZIP_OPSYS_VSE          0x0cu
+#define ZIP_OPSYS_ACORN_RISC   0x0du
+#define ZIP_OPSYS_VFAT         0x0eu
+#define ZIP_OPSYS_ALTERNATE_MVS        0x0fu
+#define ZIP_OPSYS_BEOS         0x10u
+#define ZIP_OPSYS_TANDEM       0x11u
+#define ZIP_OPSYS_OS_400       0x12u
+#define ZIP_OPSYS_OS_X         0x13u
+
+#define ZIP_OPSYS_DEFAULT      ZIP_OPSYS_UNIX
+
 
 enum zip_source_cmd {
-    ZIP_SOURCE_OPEN,   /* prepare for reading */
-    ZIP_SOURCE_READ,   /* read data */
-    ZIP_SOURCE_CLOSE,  /* reading is done */
-    ZIP_SOURCE_STAT,   /* get meta information */
-    ZIP_SOURCE_ERROR,  /* get error information */
-    ZIP_SOURCE_FREE    /* cleanup and free resources */
+    ZIP_SOURCE_OPEN,            /* prepare for reading */
+    ZIP_SOURCE_READ,            /* read data */
+    ZIP_SOURCE_CLOSE,           /* reading is done */
+    ZIP_SOURCE_STAT,            /* get meta information */
+    ZIP_SOURCE_ERROR,           /* get error information */
+    ZIP_SOURCE_FREE,            /* cleanup and free resources */
+    ZIP_SOURCE_SEEK,            /* set position for reading */
+    ZIP_SOURCE_TELL,            /* get read position */
+    ZIP_SOURCE_BEGIN_WRITE,     /* prepare for writing */
+    ZIP_SOURCE_COMMIT_WRITE,    /* writing is done */
+    ZIP_SOURCE_ROLLBACK_WRITE,  /* discard written changes */
+    ZIP_SOURCE_WRITE,           /* write data */
+    ZIP_SOURCE_SEEK_WRITE,      /* set position for writing */
+    ZIP_SOURCE_TELL_WRITE,      /* get write position */
+    ZIP_SOURCE_SUPPORTS,        /* check whether source supports command */
+    ZIP_SOURCE_REMOVE           /* remove file */
 };
+typedef enum zip_source_cmd zip_source_cmd_t;
+
+#define ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd)    (1<<(cmd))
+
+#define ZIP_SOURCE_SUPPORTS_READABLE   (ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_OPEN) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_READ) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_CLOSE) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_STAT) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ERROR) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_FREE))
+
+#define ZIP_SOURCE_SUPPORTS_SEEKABLE   (ZIP_SOURCE_SUPPORTS_READABLE \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_TELL) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SUPPORTS))
+
+#define ZIP_SOURCE_SUPPORTS_WRITABLE    (ZIP_SOURCE_SUPPORTS_SEEKABLE \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_BEGIN_WRITE) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_COMMIT_WRITE) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ROLLBACK_WRITE) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_WRITE) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK_WRITE) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_TELL_WRITE) \
+                                         | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_REMOVE))
+
+/* for use by sources */
+struct zip_source_args_seek {
+    zip_int64_t offset;
+    int whence;
+};
+
+typedef struct zip_source_args_seek zip_source_args_seek_t;
+#define ZIP_SOURCE_GET_ARGS(type, data, len, error) ((len) < sizeof(type) ? zip_error_set((error), ZIP_ER_INVAL, 0), (type *)NULL : (type *)(data))
+
 
-#define ZIP_SOURCE_ERR_LOWER   -2
+/* error information */
+/* use zip_error_*() to access */
+struct zip_error {
+    int zip_err;       /* libzip error code (ZIP_ER_*) */
+    int sys_err;       /* copy of errno (E*) or zlib error code */
+    char *str;         /* string representation or NULL */
+};
 
-#define ZIP_STAT_NAME                  0x0001
-#define ZIP_STAT_INDEX                 0x0002
-#define ZIP_STAT_SIZE                  0x0004
-#define ZIP_STAT_COMP_SIZE             0x0008
-#define ZIP_STAT_MTIME                 0x0010
-#define ZIP_STAT_CRC                   0x0020
-#define ZIP_STAT_COMP_METHOD           0x0040
-#define ZIP_STAT_ENCRYPTION_METHOD     0x0080
-#define ZIP_STAT_FLAGS                 0x0100
+#define ZIP_STAT_NAME                  0x0001u
+#define ZIP_STAT_INDEX                 0x0002u
+#define ZIP_STAT_SIZE                  0x0004u
+#define ZIP_STAT_COMP_SIZE             0x0008u
+#define ZIP_STAT_MTIME                 0x0010u
+#define ZIP_STAT_CRC                   0x0020u
+#define ZIP_STAT_COMP_METHOD           0x0040u
+#define ZIP_STAT_ENCRYPTION_METHOD     0x0080u
+#define ZIP_STAT_FLAGS                 0x0100u
 
 struct zip_stat {
     zip_uint64_t valid;                        /* which fields have valid values */
@@ -200,72 +293,127 @@ struct zip;
 struct zip_file;
 struct zip_source;
 
-typedef zip_int64_t (*zip_source_callback)(void *, void *, zip_uint64_t,
-                                          enum zip_source_cmd);
+typedef struct zip zip_t;
+typedef struct zip_error zip_error_t;
+typedef struct zip_file zip_file_t;
+typedef struct zip_source zip_source_t;
+typedef struct zip_stat zip_stat_t;
+
+typedef zip_uint32_t zip_flags_t;    
 
-\f
+typedef zip_int64_t (*zip_source_callback)(void *, void *, zip_uint64_t, zip_source_cmd_t);
 
-ZIP_EXTERN zip_int64_t zip_add(struct zip *, const char *, struct zip_source *);
-ZIP_EXTERN zip_int64_t zip_add_dir(struct zip *, const char *);
-ZIP_EXTERN int zip_close(struct zip *);
-ZIP_EXTERN int zip_delete(struct zip *, zip_uint64_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);
+
+#ifndef ZIP_DISABLE_DEPRECATED
+ZIP_EXTERN zip_int64_t zip_add(zip_t *, const char *, zip_source_t *); /* use zip_file_add */
+ZIP_EXTERN zip_int64_t zip_add_dir(zip_t *, const char *); /* use zip_dir_add */
+ZIP_EXTERN const char *zip_get_file_comment(zip_t *, zip_uint64_t, int *, int); /* use zip_file_get_comment */
+ZIP_EXTERN int zip_get_num_files(zip_t *);  /* use zip_get_num_entries instead */
+ZIP_EXTERN int zip_rename(zip_t *, zip_uint64_t, const char *); /* use zip_file_rename */
+ZIP_EXTERN int zip_replace(zip_t *, zip_uint64_t, zip_source_t *); /* use zip_file_replace */
+ZIP_EXTERN int zip_set_file_comment(zip_t *, zip_uint64_t, const char *, int); /* use zip_file_set_comment */
+ZIP_EXTERN int zip_error_get_sys_type(int); /* use zip_error_system_type */
+ZIP_EXTERN void zip_error_get(zip_t *, int *, int *); /* use zip_get_error, zip_error_code_zip / zip_error_code_system */
 ZIP_EXTERN int zip_error_to_str(char *, zip_uint64_t, int, int);
-ZIP_EXTERN int zip_fclose(struct zip_file *);
-ZIP_EXTERN struct zip *zip_fdopen(int, int, int *);
-ZIP_EXTERN void zip_file_error_clear(struct zip_file *);
-ZIP_EXTERN void zip_file_error_get(struct zip_file *, int *, int *);
-ZIP_EXTERN const char *zip_file_strerror(struct zip_file *);
-ZIP_EXTERN struct zip_file *zip_fopen(struct zip *, const char *, int);
-ZIP_EXTERN struct zip_file *zip_fopen_encrypted(struct zip *, const char *,
-                                               int, const char *);
-ZIP_EXTERN struct zip_file *zip_fopen_index(struct zip *, zip_uint64_t, int);
-ZIP_EXTERN struct zip_file *zip_fopen_index_encrypted(struct zip *,
-                                                     zip_uint64_t, int,
-                                                     const char *);
-ZIP_EXTERN zip_int64_t zip_fread(struct zip_file *, void *, zip_uint64_t);
-ZIP_EXTERN const char *zip_get_archive_comment(struct zip *, int *, int);
-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 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 */
-ZIP_EXTERN int zip_name_locate(struct zip *, const char *, int);
-ZIP_EXTERN struct zip *zip_open(const char *, int, int *);
-ZIP_EXTERN int zip_rename(struct zip *, zip_uint64_t, const char *);
-ZIP_EXTERN int zip_replace(struct zip *, zip_uint64_t, struct zip_source *);
-ZIP_EXTERN int zip_set_archive_comment(struct zip *, const char *, int);
-ZIP_EXTERN int zip_set_archive_flag(struct zip *, int, int);
-ZIP_EXTERN int zip_set_default_password(struct zip *, const char *);
-ZIP_EXTERN int zip_set_file_comment(struct zip *, zip_uint64_t,
-                                   const char *, int);
-ZIP_EXTERN int zip_set_file_extra(struct zip *, zip_uint64_t,
-                                 const char *, int);
-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 *,
-                                             zip_uint64_t, zip_int64_t);
-ZIP_EXTERN struct zip_source *zip_source_filep(struct zip *, FILE *,
-                                              zip_uint64_t, zip_int64_t);
-ZIP_EXTERN void zip_source_free(struct zip_source *);
-ZIP_EXTERN struct zip_source *zip_source_function(struct zip *,
-                                                 zip_source_callback, void *);
-ZIP_EXTERN struct zip_source *zip_source_zip(struct zip *, struct zip *,
-                                            zip_uint64_t, int,
-                                            zip_uint64_t, zip_int64_t);
-ZIP_EXTERN int zip_stat(struct zip *, const char *, int, struct zip_stat *);
-ZIP_EXTERN int zip_stat_index(struct zip *, zip_uint64_t, int,
-                             struct zip_stat *);
-ZIP_EXTERN void zip_stat_init(struct zip_stat *);
-ZIP_EXTERN const char *zip_strerror(struct zip *);
-ZIP_EXTERN int zip_unchange(struct zip *, zip_uint64_t);
-ZIP_EXTERN int zip_unchange_all(struct zip *);
-ZIP_EXTERN int zip_unchange_archive(struct zip *);
+ZIP_EXTERN void zip_file_error_get(zip_file_t *, int *, int *); /* use zip_file_get_error, zip_error_code_zip / zip_error_code_system */
+#endif
+
+ZIP_EXTERN int zip_archive_set_tempdir(zip_t *, const char *);
+ZIP_EXTERN int zip_close(zip_t *);
+ZIP_EXTERN int zip_delete(zip_t *, zip_uint64_t);
+ZIP_EXTERN zip_int64_t zip_dir_add(zip_t *, const char *, zip_flags_t);
+ZIP_EXTERN void zip_discard(zip_t *);
+
+ZIP_EXTERN zip_error_t *zip_get_error(zip_t *);
+ZIP_EXTERN void zip_error_clear(zip_t *);
+ZIP_EXTERN int zip_error_code_zip(const zip_error_t *);
+ZIP_EXTERN int zip_error_code_system(const zip_error_t *);
+ZIP_EXTERN void zip_error_fini(zip_error_t *);
+ZIP_EXTERN void zip_error_init(zip_error_t *);
+ZIP_EXTERN void zip_error_init_with_code(zip_error_t *, int);
+ZIP_EXTERN void zip_error_set(zip_error_t *, int, int);
+ZIP_EXTERN const char *zip_error_strerror(zip_error_t *);
+ZIP_EXTERN int zip_error_system_type(const zip_error_t *);
+ZIP_EXTERN zip_int64_t zip_error_to_data(const zip_error_t *, void *, zip_uint64_t);
+
+ZIP_EXTERN int zip_fclose(zip_file_t *);
+ZIP_EXTERN zip_t *zip_fdopen(int, int, int *);
+ZIP_EXTERN zip_int64_t zip_file_add(zip_t *, const char *, zip_source_t *, zip_flags_t);
+ZIP_EXTERN void zip_file_error_clear(zip_file_t *);
+ZIP_EXTERN int zip_file_extra_field_delete(zip_t *, zip_uint64_t, zip_uint16_t, zip_flags_t);
+ZIP_EXTERN int zip_file_extra_field_delete_by_id(zip_t *, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_flags_t);
+ZIP_EXTERN int zip_file_extra_field_set(zip_t *, zip_uint64_t, zip_uint16_t, zip_uint16_t, const zip_uint8_t *, zip_uint16_t, zip_flags_t);
+ZIP_EXTERN zip_int16_t zip_file_extra_fields_count(zip_t *, zip_uint64_t, zip_flags_t);
+ZIP_EXTERN zip_int16_t zip_file_extra_fields_count_by_id(zip_t *, zip_uint64_t, zip_uint16_t, zip_flags_t);
+ZIP_EXTERN const zip_uint8_t *zip_file_extra_field_get(zip_t *, zip_uint64_t, zip_uint16_t, zip_uint16_t *, zip_uint16_t *, zip_flags_t);
+ZIP_EXTERN const zip_uint8_t *zip_file_extra_field_get_by_id(zip_t *, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_uint16_t *, zip_flags_t);
+ZIP_EXTERN const char *zip_file_get_comment(zip_t *, zip_uint64_t, zip_uint32_t *, zip_flags_t);
+ZIP_EXTERN zip_error_t *zip_file_get_error(zip_file_t *);
+ZIP_EXTERN int zip_file_get_external_attributes(zip_t *, zip_uint64_t, zip_flags_t, zip_uint8_t *, zip_uint32_t *);
+ZIP_EXTERN int zip_file_rename(zip_t *, zip_uint64_t, const char *, zip_flags_t);
+ZIP_EXTERN int zip_file_replace(zip_t *, zip_uint64_t, zip_source_t *, zip_flags_t);
+ZIP_EXTERN int zip_file_set_comment(zip_t *, zip_uint64_t, const char *, zip_uint16_t, zip_flags_t);
+ZIP_EXTERN int zip_file_set_external_attributes(zip_t *, zip_uint64_t, zip_flags_t, zip_uint8_t, zip_uint32_t);
+ZIP_EXTERN int zip_file_set_mtime(zip_t *, zip_uint64_t, time_t, zip_flags_t);
+ZIP_EXTERN const char *zip_file_strerror(zip_file_t *);
+ZIP_EXTERN zip_file_t *zip_fopen(zip_t *, const char *, zip_flags_t);
+ZIP_EXTERN zip_file_t *zip_fopen_encrypted(zip_t *, const char *, zip_flags_t, const char *);
+ZIP_EXTERN zip_file_t *zip_fopen_index(zip_t *, zip_uint64_t, zip_flags_t);
+ZIP_EXTERN zip_file_t *zip_fopen_index_encrypted(zip_t *, zip_uint64_t, zip_flags_t, const char *);
+ZIP_EXTERN zip_int64_t zip_fread(zip_file_t *, void *, zip_uint64_t);
+ZIP_EXTERN const char *zip_get_archive_comment(zip_t *, int *, zip_flags_t);
+ZIP_EXTERN int zip_get_archive_flag(zip_t *, zip_flags_t, zip_flags_t);
+ZIP_EXTERN const char *zip_get_name(zip_t *, zip_uint64_t, zip_flags_t);
+ZIP_EXTERN zip_int64_t zip_get_num_entries(zip_t *, zip_flags_t);
+ZIP_EXTERN zip_int64_t zip_name_locate(zip_t *, const char *, zip_flags_t);
+ZIP_EXTERN zip_t *zip_open(const char *, int, int *);
+ZIP_EXTERN zip_t *zip_open_from_source(zip_source_t *, int, zip_error_t *);
+ZIP_EXTERN int zip_set_archive_comment(zip_t *, const char *, zip_uint16_t);
+ZIP_EXTERN int zip_set_archive_flag(zip_t *, zip_flags_t, int);
+ZIP_EXTERN int zip_set_default_password(zip_t *, const char *);
+ZIP_EXTERN int zip_set_file_compression(zip_t *, zip_uint64_t, zip_int32_t, zip_uint32_t);
+ZIP_EXTERN int zip_source_begin_write(zip_source_t *);
+ZIP_EXTERN zip_source_t *zip_source_buffer(zip_t *, const void *, zip_uint64_t, int);
+ZIP_EXTERN zip_source_t *zip_source_buffer_create(const void *, zip_uint64_t, int, zip_error_t *);
+ZIP_EXTERN int zip_source_close(zip_source_t *);
+ZIP_EXTERN int zip_source_commit_write(zip_source_t *);
+ZIP_EXTERN zip_error_t *zip_source_error(zip_source_t *src);
+ZIP_EXTERN zip_source_t *zip_source_file(zip_t *, const char *, zip_uint64_t, zip_int64_t);
+ZIP_EXTERN zip_source_t *zip_source_file_create(const char *, zip_uint64_t, zip_int64_t, zip_error_t *);
+ZIP_EXTERN zip_source_t *zip_source_filep(zip_t *, FILE *, zip_uint64_t, zip_int64_t);
+ZIP_EXTERN zip_source_t *zip_source_filep_create(FILE *, zip_uint64_t, zip_int64_t, zip_error_t *);
+ZIP_EXTERN void zip_source_free(zip_source_t *);
+ZIP_EXTERN zip_source_t *zip_source_function(zip_t *, zip_source_callback, void *);
+ZIP_EXTERN zip_source_t *zip_source_function_create(zip_source_callback, void *, zip_error_t *);
+ZIP_EXTERN int zip_source_is_deleted(zip_source_t *);
+ZIP_EXTERN void zip_source_keep(zip_source_t *);
+ZIP_EXTERN zip_int64_t zip_source_make_command_bitmap(zip_source_cmd_t, ...);
+ZIP_EXTERN int zip_source_open(zip_source_t *);
+ZIP_EXTERN zip_int64_t zip_source_read(zip_source_t *, void *, zip_uint64_t);
+ZIP_EXTERN void zip_source_rollback_write(zip_source_t *);
+ZIP_EXTERN int zip_source_seek(zip_source_t *, zip_int64_t, int);
+ZIP_EXTERN zip_int64_t zip_source_seek_compute_offset(zip_uint64_t, zip_uint64_t, void *, zip_uint64_t, zip_error_t *);
+ZIP_EXTERN int zip_source_seek_write(zip_source_t *, zip_int64_t, int);
+ZIP_EXTERN int zip_source_stat(zip_source_t *, zip_stat_t *);
+ZIP_EXTERN zip_int64_t zip_source_tell(zip_source_t *);
+ZIP_EXTERN zip_int64_t zip_source_tell_write(zip_source_t *);
+#ifdef _WIN32
+ZIP_EXTERN zip_source_t *zip_source_win32a(zip_t *, const char *, zip_uint64_t, zip_int64_t);
+ZIP_EXTERN zip_source_t *zip_source_win32a_create(const char *, zip_uint64_t, zip_int64_t, zip_error_t *);
+ZIP_EXTERN zip_source_t *zip_source_win32handle(zip_t *, void *, zip_uint64_t, zip_int64_t);
+ZIP_EXTERN zip_source_t *zip_source_win32handle_create(void *, zip_uint64_t, zip_int64_t, zip_error_t *);
+ZIP_EXTERN zip_source_t *zip_source_win32w(zip_t *, const wchar_t *, zip_uint64_t, zip_int64_t);
+ZIP_EXTERN zip_source_t *zip_source_win32w_create(const wchar_t *, zip_uint64_t, zip_int64_t, zip_error_t *);
+#endif
+ZIP_EXTERN zip_int64_t zip_source_write(zip_source_t *, const void *, zip_uint64_t);
+ZIP_EXTERN zip_source_t *zip_source_zip(zip_t *, zip_t *, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t);
+ZIP_EXTERN int zip_stat(zip_t *, const char *, zip_flags_t, zip_stat_t *);
+ZIP_EXTERN int zip_stat_index(zip_t *, zip_uint64_t, zip_flags_t, zip_stat_t *);
+ZIP_EXTERN void zip_stat_init(zip_stat_t *);
+ZIP_EXTERN const char *zip_strerror(zip_t *);
+ZIP_EXTERN int zip_unchange(zip_t *, zip_uint64_t);
+ZIP_EXTERN int zip_unchange_all(zip_t *);
+ZIP_EXTERN int zip_unchange_archive(zip_t *);
 
 #ifdef __cplusplus
 }
index 6a310a8..d1be133 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_add.c -- add file via callback function
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
+#define _ZIP_COMPILING_DEPRECATED
 #include "zipint.h"
 
-\f
 
 /*
   NOTE: Return type is signed so we can return -1 on error.
 */
 
 ZIP_EXTERN zip_int64_t
-zip_add(struct zip *za, const char *name, struct zip_source *source)
+zip_add(zip_t *za, const char *name, zip_source_t *source)
 {
-    if (name == NULL || source == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-       return -1;
-    }
-       
-    return _zip_replace(za, ZIP_UINT64_MAX, name, source);
+    return zip_file_add(za, name, source, 0);
 }
index 28a8ad1..14bdeda 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_add_dir.c -- add directory
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
-
-#include <stdlib.h>
-#include <string.h>
 
+#define _ZIP_COMPILING_DEPRECATED
 #include "zipint.h"
 
-\f
 
 /* NOTE: Signed due to -1 on error.  See zip_add.c for more details. */
 
 ZIP_EXTERN zip_int64_t
-zip_add_dir(struct zip *za, const char *name)
+zip_add_dir(zip_t *za, const char *name)
 {
-    int len;
-    zip_int64_t ret;
-    char *s;
-    struct zip_source *source;
-
-    if (ZIP_IS_RDONLY(za)) {
-       _zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
-       return -1;
-    }
-
-    if (name == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-       return -1;
-    }
-
-    s = NULL;
-    len = strlen(name);
-
-    if (name[len-1] != '/') {
-       if ((s=(char *)malloc(len+2)) == NULL) {
-           _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
-           return -1;
-       }
-       strcpy(s, name);
-       s[len] = '/';
-       s[len+1] = '\0';
-    }
-
-    if ((source=zip_source_buffer(za, NULL, 0, 0)) == NULL) {
-       free(s);
-       return -1;
-    }
-       
-    ret = _zip_replace(za, -1, s ? s : name, source);
-
-    free(s);
-    if (ret < 0)
-       zip_source_free(source);
-
-    return ret;
+    return zip_dir_add(za, name, 0);
 }
diff --git a/lib/zip_add_entry.c b/lib/zip_add_entry.c
new file mode 100644 (file)
index 0000000..24dbdaf
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+  zip_add_entry.c -- create and init struct zip_entry
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <stdlib.h>
+
+#include "zipint.h"
+
+
+/* NOTE: Signed due to -1 on error.  See zip_add.c for more details. */
+
+zip_int64_t
+_zip_add_entry(zip_t *za)
+{
+    zip_uint64_t idx;
+
+    if (za->nentry+1 >= za->nentry_alloc) {
+       zip_entry_t *rentries;
+       zip_uint64_t nalloc = za->nentry_alloc + 16;
+       zip_uint64_t realloc_size = sizeof(struct zip_entry) * (size_t)nalloc;
+
+       if (sizeof(struct zip_entry) * (size_t)za->nentry_alloc > realloc_size) {
+           zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+           return -1;
+       }
+       rentries = (zip_entry_t *)realloc(za->entry, sizeof(struct zip_entry) * (size_t)nalloc);
+       if (!rentries) {
+           zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+           return -1;
+       }
+       za->entry = rentries;
+       za->nentry_alloc = nalloc;
+    }
+
+    idx = za->nentry++;
+
+    _zip_entry_init(za->entry+idx);
+
+    return (zip_int64_t)idx;
+}
diff --git a/lib/zip_buffer.c b/lib/zip_buffer.c
new file mode 100644 (file)
index 0000000..3d79b09
--- /dev/null
@@ -0,0 +1,310 @@
+/*
+ zip_buffer.c -- bounds checked access to memory buffer
+ Copyright (C) 2014 Dieter Baron and Thomas Klausner
+ This file is part of libzip, a library to manipulate ZIP archives.
+ The authors can be contacted at <libzip@nih.at>
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 3. The names of the authors may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "zipint.h"
+
+zip_uint8_t *
+_zip_buffer_data(zip_buffer_t *buffer)
+{
+    return buffer->data;
+}
+
+
+void
+_zip_buffer_free(zip_buffer_t *buffer)
+{
+    if (buffer == NULL) {
+        return;
+    }
+    
+    if (buffer->free_data) {
+        free(buffer->data);
+    }
+    
+    free(buffer);
+}
+
+
+bool
+_zip_buffer_eof(zip_buffer_t *buffer)
+{
+    return buffer->ok && buffer->offset == buffer->size;
+}
+
+
+zip_uint8_t *
+_zip_buffer_get(zip_buffer_t *buffer, zip_uint64_t length)
+{
+    zip_uint8_t *data;
+    
+    if (!buffer->ok || buffer->offset + length < length || buffer->offset + length > buffer->size) {
+        buffer->ok = false;
+        return NULL;
+    }
+    
+    data = buffer->data + buffer->offset;
+    buffer->offset += length;
+    return data;
+}
+
+
+zip_uint16_t
+_zip_buffer_get_16(zip_buffer_t *buffer)
+{
+    zip_uint8_t *data = _zip_buffer_get(buffer, 2);
+    
+    if (data == NULL) {
+        return 0;
+    }
+    
+    return (zip_uint16_t)(data[0] + (data[1] << 8));
+}
+
+
+zip_uint32_t
+_zip_buffer_get_32(zip_buffer_t *buffer)
+{
+    zip_uint8_t *data = _zip_buffer_get(buffer, 4);
+    
+    if (data == NULL) {
+        return 0;
+    }
+    
+    return ((((((zip_uint32_t)data[3] << 8) + data[2]) << 8) + data[1]) << 8) + data[0];
+}
+
+
+zip_uint64_t
+_zip_buffer_get_64(zip_buffer_t *buffer)
+{
+    zip_uint8_t *data = _zip_buffer_get(buffer, 8);
+    
+    if (data == NULL) {
+        return 0;
+    }
+
+    return ((zip_uint64_t)data[7] << 56) + ((zip_uint64_t)data[6] << 48) + ((zip_uint64_t)data[5] << 40) + ((zip_uint64_t)data[4] << 32) + ((zip_uint64_t)data[3] << 24) + ((zip_uint64_t)data[2] << 16) + ((zip_uint64_t)data[1] << 8) + (zip_uint64_t)data[0];
+}
+
+
+
+zip_uint8_t
+_zip_buffer_get_8(zip_buffer_t *buffer)
+{
+    zip_uint8_t *data = _zip_buffer_get(buffer, 1);
+    
+    if (data == NULL) {
+        return 0;
+    }
+    
+    return data[0];
+}
+
+
+zip_uint64_t
+_zip_buffer_left(zip_buffer_t *buffer)
+{
+    return buffer->ok ? buffer->size - buffer->offset : 0;
+}
+
+
+zip_buffer_t *
+_zip_buffer_new(zip_uint8_t *data, zip_uint64_t size)
+{
+    bool free_data = (data == NULL);
+    zip_buffer_t *buffer;
+    
+    if (data == NULL) {
+        if ((data = (zip_uint8_t *)malloc(size)) == NULL) {
+            return NULL;
+        }
+    }
+
+    if ((buffer = (zip_buffer_t *)malloc(sizeof(*buffer))) == NULL) {
+        if (free_data) {
+            free(data);
+        }
+        return NULL;
+    }
+    
+    buffer->ok = true;
+    buffer->data = data;
+    buffer->size = size;
+    buffer->offset = 0;
+    buffer->free_data = free_data;
+    
+    return buffer;
+}
+
+
+zip_buffer_t *
+_zip_buffer_new_from_source(zip_source_t *src, zip_uint64_t size, zip_uint8_t *buf, zip_error_t *error)
+{
+    zip_buffer_t *buffer;
+    
+    if ((buffer = _zip_buffer_new(buf, size)) == NULL) {
+        zip_error_set(error, ZIP_ER_MEMORY, 0);
+        return NULL;
+    }
+    
+    if (_zip_read(src, buffer->data, size, error) < 0) {
+        _zip_buffer_free(buffer);
+        return NULL;
+    }
+    
+    return buffer;
+}
+
+
+zip_uint64_t
+_zip_buffer_offset(zip_buffer_t *buffer)
+{
+    return buffer->ok ? buffer->offset : 0;
+}
+
+
+bool
+_zip_buffer_ok(zip_buffer_t *buffer)
+{
+    return buffer->ok;
+}
+
+
+int
+_zip_buffer_put(zip_buffer_t *buffer, const void *src, size_t length)
+{
+    zip_uint8_t *dst = _zip_buffer_get(buffer, length);
+    
+    if (dst == NULL) {
+        return -1;
+    }
+    
+    memcpy(dst, src, length);
+    return 0;
+}
+
+
+int
+_zip_buffer_put_16(zip_buffer_t *buffer, zip_uint16_t i)
+{
+    zip_uint8_t *data = _zip_buffer_get(buffer, 2);
+    
+    if (data == NULL) {
+        return -1;
+    }
+
+    data[0] = (zip_uint8_t)(i & 0xff);
+    data[1] = (zip_uint8_t)((i >> 8) & 0xff);
+    
+    return 0;
+}
+
+
+int
+_zip_buffer_put_32(zip_buffer_t *buffer, zip_uint32_t i)
+{
+    zip_uint8_t *data = _zip_buffer_get(buffer, 4);
+    
+    if (data == NULL) {
+        return -1;
+    }
+    
+    data[0] = (zip_uint8_t)(i & 0xff);
+    data[1] = (zip_uint8_t)((i >> 8) & 0xff);
+    data[2] = (zip_uint8_t)((i >> 16) & 0xff);
+    data[3] = (zip_uint8_t)((i >> 24) & 0xff);
+    
+    return 0;
+}
+
+
+int
+_zip_buffer_put_64(zip_buffer_t *buffer, zip_uint64_t i)
+{
+    zip_uint8_t *data = _zip_buffer_get(buffer, 8);
+    
+    if (data == NULL) {
+        return -1;
+    }
+    
+    data[0] = (zip_uint8_t)(i & 0xff);
+    data[1] = (zip_uint8_t)((i >> 8) & 0xff);
+    data[2] = (zip_uint8_t)((i >> 16) & 0xff);
+    data[3] = (zip_uint8_t)((i >> 24) & 0xff);
+    data[4] = (zip_uint8_t)((i >> 32) & 0xff);
+    data[5] = (zip_uint8_t)((i >> 40) & 0xff);
+    data[6] = (zip_uint8_t)((i >> 48) & 0xff);
+    data[7] = (zip_uint8_t)((i >> 56) & 0xff);
+    
+    return 0;
+}
+
+
+int
+_zip_buffer_put_8(zip_buffer_t *buffer, zip_uint8_t i)
+{
+    zip_uint8_t *data = _zip_buffer_get(buffer, 1);
+    
+    if (data == NULL) {
+        return -1;
+    }
+    
+    data[0] = i;
+    
+    return 0;
+}
+
+
+int
+_zip_buffer_set_offset(zip_buffer_t *buffer, zip_uint64_t offset)
+{
+    if (offset > buffer->size) {
+        buffer->ok = false;
+        return -1;
+    }
+    
+    buffer->ok = true;
+    buffer->offset = offset;
+    
+    return 0;
+}
+
+
+zip_uint64_t
+_zip_buffer_size(zip_buffer_t *buffer)
+{
+    return buffer->size;
+}
index f4ae2a4..a13e446 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_close.c -- close zip archive and update changes
-  Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
 #include <errno.h>
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #include <fcntl.h>
 #endif
 
-static int add_data(struct zip *, struct zip_source *, struct zip_dirent *,
-                   FILE *);
-static int copy_data(FILE *, off_t, FILE *, struct zip_error *);
-static int copy_source(struct zip *, struct zip_source *, FILE *);
-static int write_cdir(struct zip *, struct zip_cdir *, FILE *);
-static int _zip_cdir_set_comment(struct zip_cdir *, struct zip *);
-static char *_zip_create_temp_output(struct zip *, FILE **);
-static int _zip_torrentzip_cmp(const void *, const void *);
 
-\f
+/* max deflate size increase: size + ceil(size/16k)*5+6 */
+#define MAX_DEFLATE_SIZE_32    4293656963u
 
-struct filelist {
-    int idx;
-    const char *name;
-};
+static int add_data(zip_t *, zip_source_t *, zip_dirent_t *);
+static int copy_data(zip_t *, zip_uint64_t);
+static int copy_source(zip_t *, zip_source_t *);
+static int write_cdir(zip_t *, const zip_filelist_t *, zip_uint64_t);
 
-\f
 
 ZIP_EXTERN int
-zip_close(struct zip *za)
+zip_close(zip_t *za)
 {
-    int survivors;
-    int i, j, error;
-    char *temp;
-    FILE *out;
-#ifndef _WIN32
-    mode_t mask;
-#endif
-    struct zip_cdir *cd;
-    struct zip_dirent de;
-    struct filelist *filelist;
-    int reopen_on_error;
-    int new_torrentzip;
-
-    reopen_on_error = 0;
+    zip_uint64_t i, j, survivors;
+    zip_int64_t off;
+    int error;
+    zip_filelist_t *filelist;
+    int changed;
 
     if (za == NULL)
        return -1;
 
-    if (!_zip_changed(za, &survivors)) {
-       _zip_free(za);
-       return 0;
-    }
+    changed = _zip_changed(za, &survivors);
 
     /* don't create zip files with no entries */
     if (survivors == 0) {
-       if (za->zn && za->zp) {
-           if (remove(za->zn) != 0) {
-               _zip_error_set(&za->error, ZIP_ER_REMOVE, errno);
+       if ((za->open_flags & ZIP_TRUNCATE) || changed) {
+           if (zip_source_remove(za->src) < 0) {
+               _zip_error_set_from_source(&za->error, za->src);
                return -1;
            }
        }
-       _zip_free(za);
+       zip_discard(za);
        return 0;
     }         
 
-    if ((filelist=(struct filelist *)malloc(sizeof(filelist[0])*survivors))
-       == NULL)
-       return -1;
-
-    if ((cd=_zip_cdir_new(survivors, &za->error)) == NULL) {
-       free(filelist);
-       return -1;
+    if (!changed) {
+       zip_discard(za);
+       return 0;
     }
 
-    for (i=0; i<survivors; i++)
-       _zip_dirent_init(&cd->entry[i]);
-
-    /* archive comment is special for torrentzip */
-    if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) {
-       cd->comment = _zip_memdup(TORRENT_SIG "XXXXXXXX",
-                                 TORRENT_SIG_LEN + TORRENT_CRC_LEN,
-                                 &za->error);
-       if (cd->comment == NULL) {
-           _zip_cdir_free(cd);
-           free(filelist);
-           return -1;
-       }
-       cd->comment_len = TORRENT_SIG_LEN + TORRENT_CRC_LEN;
-    }
-    else if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, ZIP_FL_UNCHANGED) == 0) {
-       if (_zip_cdir_set_comment(cd, za) == -1) {
-           _zip_cdir_free(cd);
-           free(filelist);
-           return -1;
-       }
+    if (survivors > za->nentry) {
+        zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+        return -1;
     }
-
-    if ((temp=_zip_create_temp_output(za, &out)) == NULL) {
-       _zip_cdir_free(cd);
-       free(filelist);
+    
+    if ((filelist=(zip_filelist_t *)malloc(sizeof(filelist[0])*(size_t)survivors)) == NULL)
        return -1;
-    }
-
 
     /* create list of files with index into original archive  */
     for (i=j=0; i<za->nentry; i++) {
-       if (za->entry[i].state == ZIP_ST_DELETED)
+       if (za->entry[i].deleted)
            continue;
 
+        if (j >= survivors) {
+            free(filelist);
+            zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+            return -1;
+        }
+        
        filelist[j].idx = i;
-       filelist[j].name = zip_get_name(za, i, 0);
        j++;
     }
-    if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0))
-       qsort(filelist, survivors, sizeof(filelist[0]),
-             _zip_torrentzip_cmp);
+    if (j < survivors) {
+        free(filelist);
+        zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+        return -1;
+    }
 
-    new_torrentzip = (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 1
-                     && zip_get_archive_flag(za, ZIP_AFL_TORRENT,
-                                             ZIP_FL_UNCHANGED) == 0);
+    if (zip_source_begin_write(za->src) < 0) {
+       _zip_error_set_from_source(&za->error, za->src);
+       free(filelist);
+       return -1;
+    }
+    
     error = 0;
     for (j=0; j<survivors; j++) {
+       int new_data;
+       zip_entry_t *entry;
+       zip_dirent_t *de;
+
        i = filelist[j].idx;
+       entry = za->entry+i;
 
-       /* create new local directory entry */
-       if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) {
-           _zip_dirent_init(&de);
-
-           if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0))
-               _zip_dirent_torrent_normalize(&de);
-               
-           /* use it as central directory entry */
-           memcpy(cd->entry+j, &de, sizeof(cd->entry[j]));
-
-           /* set/update file name */
-           if (za->entry[i].ch_filename == NULL) {
-               if (za->entry[i].state == ZIP_ST_ADDED) {
-                   de.filename = strdup("-");
-                   de.filename_len = 1;
-                   cd->entry[j].filename = "-";
-                   cd->entry[j].filename_len = 1;
-               }
-               else {
-                   de.filename = strdup(za->cdir->entry[i].filename);
-                   de.filename_len = strlen(de.filename);
-                   cd->entry[j].filename = za->cdir->entry[i].filename;
-                   cd->entry[j].filename_len = de.filename_len;
-               }
-           }
-       }
-       else {
-           /* copy existing directory entries */
-           if (fseeko(za->zp, za->cdir->entry[i].offset, SEEK_SET) != 0) {
-               _zip_error_set(&za->error, ZIP_ER_SEEK, errno);
-               error = 1;
-               break;
-           }
-           if (_zip_dirent_read(&de, za->zp, NULL, NULL, 1,
-                                &za->error) != 0) {
-               error = 1;
-               break;
-           }
-           memcpy(cd->entry+j, za->cdir->entry+i, sizeof(cd->entry[j]));
-           if (de.bitflags & ZIP_GPBF_DATA_DESCRIPTOR) {
-               de.crc = za->cdir->entry[i].crc;
-               de.comp_size = za->cdir->entry[i].comp_size;
-               de.uncomp_size = za->cdir->entry[i].uncomp_size;
-               de.bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR;
-               cd->entry[j].bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR;
-           }
-       }
+       new_data = (ZIP_ENTRY_DATA_CHANGED(entry) || ZIP_ENTRY_CHANGED(entry, ZIP_DIRENT_COMP_METHOD));
 
-       if (za->entry[i].ch_filename) {
-           free(de.filename);
-           if ((de.filename=strdup(za->entry[i].ch_filename)) == NULL) {
-               error = 1;
-               break;
-           }
-           de.filename_len = strlen(de.filename);
-           cd->entry[j].filename = za->entry[i].ch_filename;
-           cd->entry[j].filename_len = de.filename_len;
-       }
-
-       if (za->entry[i].ch_extra_len != -1) {
-           free(de.extrafield);
-           if ((de.extrafield=malloc(za->entry[i].ch_extra_len)) == NULL) {
-               error = 1;
-               break;
+       /* create new local directory entry */
+       if (entry->changes == NULL) {
+           if ((entry->changes=_zip_dirent_clone(entry->orig)) == NULL) {
+                zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+                error = 1;
+                break;
            }
-           memcpy(de.extrafield, za->entry[i].ch_extra, za->entry[i].ch_extra_len);
-           de.extrafield_len = za->entry[i].ch_extra_len;
-           /* as the rest of cd entries, its malloc/free is done by za */
-           /* TODO unsure if this should also be set in the CD --
-            * not done for now
-           cd->entry[j].extrafield = za->entry[i].ch_extra;
-           cd->entry[j].extrafield_len = za->entry[i].ch_extra_len;
-           */
        }
+       de = entry->changes;
 
-       if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0
-           && za->entry[i].ch_comment_len != -1) {
-           /* as the rest of cd entries, its malloc/free is done by za */
-           cd->entry[j].comment = za->entry[i].ch_comment;
-           cd->entry[j].comment_len = za->entry[i].ch_comment_len;
+       if (_zip_read_local_ef(za, i) < 0) {
+           error = 1;
+           break;
        }
 
-       cd->entry[j].offset = ftello(out);
+        if ((off = zip_source_tell_write(za->src)) < 0) {
+            error = 1;
+            break;
+        }
+        de->offset = (zip_uint64_t)off;
 
-       if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) {
-           struct zip_source *zs;
+       if (new_data) {
+           zip_source_t *zs;
 
            zs = NULL;
-           if (!ZIP_ENTRY_DATA_CHANGED(za->entry+i)) {
-               if ((zs=zip_source_zip(za, za, i, ZIP_FL_RECOMPRESS, 0, -1))
-                   == NULL) {
+           if (!ZIP_ENTRY_DATA_CHANGED(entry)) {
+               if ((zs=_zip_source_zip_new(za, za, i, ZIP_FL_UNCHANGED, 0, 0, NULL)) == NULL) {
                    error = 1;
                    break;
                }
            }
 
-           if (add_data(za, zs ? zs : za->entry[i].source, &de, out) < 0) {
+           /* add_data writes dirent */
+           if (add_data(za, zs ? zs : entry->source, de) < 0) {
                error = 1;
                if (zs)
                    zip_source_free(zs);
@@ -268,199 +178,233 @@ zip_close(struct zip *za)
            }
            if (zs)
                zip_source_free(zs);
-           
-           cd->entry[j].last_mod = de.last_mod;
-           cd->entry[j].comp_method = de.comp_method;
-           cd->entry[j].comp_size = de.comp_size;
-           cd->entry[j].uncomp_size = de.uncomp_size;
-           cd->entry[j].crc = de.crc;
        }
        else {
-           if (_zip_dirent_write(&de, out, 1, &za->error) < 0) {
+           zip_uint64_t offset;
+
+           /* when copying data, all sizes are known -> no data descriptor needed */
+           de->bitflags &= (zip_uint16_t)~ZIP_GPBF_DATA_DESCRIPTOR;
+           if (_zip_dirent_write(za, de, ZIP_FL_LOCAL) < 0) {
+               error = 1;
+               break;
+           }
+           if ((offset=_zip_file_get_offset(za, i, &za->error)) == 0) {
                error = 1;
                break;
            }
-           /* we just read the local dirent, file is at correct position */
-           if (copy_data(za->zp, cd->entry[j].comp_size, out,
-                         &za->error) < 0) {
+           if (zip_source_seek(za->src, (zip_int64_t)offset, SEEK_SET) < 0) {
+               _zip_error_set_from_source(&za->error, za->src);
+               error = 1;
+               break;
+           }
+           if (copy_data(za, de->comp_size) < 0) {
                error = 1;
                break;
            }
        }
+    }
 
-       _zip_dirent_finalize(&de);
+    if (!error) {
+       if (write_cdir(za, filelist, survivors) < 0)
+           error = 1;
     }
 
     free(filelist);
 
     if (!error) {
-       if (write_cdir(za, cd, out) < 0)
+       if (zip_source_commit_write(za->src) != 0) {
+           _zip_error_set_from_source(&za->error, za->src);
            error = 1;
+       }
     }
-   
-    /* pointers in cd entries are owned by za */
-    cd->nentry = 0;
-    _zip_cdir_free(cd);
 
     if (error) {
-       _zip_dirent_finalize(&de);
-       fclose(out);
-       remove(temp);
-       free(temp);
+       zip_source_rollback_write(za->src);
        return -1;
     }
 
-    if (fclose(out) != 0) {
-       _zip_error_set(&za->error, ZIP_ER_CLOSE, errno);
-       remove(temp);
-       free(temp);
-       return -1;
-    }
-    
-    if (za->zp) {
-       fclose(za->zp);
-       za->zp = NULL;
-       reopen_on_error = 1;
-    }
-    if (_zip_rename(temp, za->zn) != 0) {
-       _zip_error_set(&za->error, ZIP_ER_RENAME, errno);
-       remove(temp);
-       free(temp);
-       if (reopen_on_error) {
-           /* ignore errors, since we're already in an error case */
-           za->zp = fopen(za->zn, "rb");
-       }
-       return -1;
-    }
-#ifndef _WIN32
-    mask = umask(0);
-    umask(mask);
-    chmod(za->zn, 0666&~mask);
-#endif
-
-    _zip_free(za);
-    free(temp);
+    zip_discard(za);
     
     return 0;
 }
 
-\f
 
 static int
-add_data(struct zip *za, struct zip_source *src, struct zip_dirent *de,
-        FILE *ft)
+add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de)
 {
-    off_t offstart, offdata, offend;
+    zip_int64_t offstart, offdata, offend;
     struct zip_stat st;
-    struct zip_source *s2;
-    zip_compression_implementation comp_impl;
+    zip_source_t *s2;
     int ret;
+    int is_zip64;
+    zip_flags_t flags;
     
     if (zip_source_stat(src, &st) < 0) {
        _zip_error_set_from_source(&za->error, src);
        return -1;
     }
 
-    offstart = ftello(ft);
+    if ((st.valid & ZIP_STAT_COMP_METHOD) == 0) {
+       st.valid |= ZIP_STAT_COMP_METHOD;
+       st.comp_method = ZIP_CM_STORE;
+    }
 
-    if (_zip_dirent_write(de, ft, 1, &za->error) < 0)
-       return -1;
+    if (ZIP_CM_IS_DEFAULT(de->comp_method) && st.comp_method != ZIP_CM_STORE)
+       de->comp_method = st.comp_method;
+    else if (de->comp_method == ZIP_CM_STORE && (st.valid & ZIP_STAT_SIZE)) {
+       st.valid |= ZIP_STAT_COMP_SIZE;
+       st.comp_size = st.size;
+    }
+    else {
+       /* we'll recompress */
+       st.valid &= ~ZIP_STAT_COMP_SIZE;
+    }
 
-    if ((s2=zip_source_crc(za, src, 0)) == NULL) {
-       zip_source_pop(s2);
-       return -1;
+
+    flags = ZIP_EF_LOCAL;
+
+    if ((st.valid & ZIP_STAT_SIZE) == 0)
+       flags |= ZIP_FL_FORCE_ZIP64;
+    else {
+       de->uncomp_size = st.size;
+       
+       if ((st.valid & ZIP_STAT_COMP_SIZE) == 0) {
+           if (( ((de->comp_method == ZIP_CM_DEFLATE || ZIP_CM_IS_DEFAULT(de->comp_method)) && st.size > MAX_DEFLATE_SIZE_32)
+                 || (de->comp_method != ZIP_CM_STORE && de->comp_method != ZIP_CM_DEFLATE && !ZIP_CM_IS_DEFAULT(de->comp_method))))
+               flags |= ZIP_FL_FORCE_ZIP64;
+       }
+       else
+           de->comp_size = st.comp_size;
     }
-    
-    /* XXX: deflate 0-byte files for torrentzip? */
-    if (((st.valid & ZIP_STAT_COMP_METHOD) == 0
-        || st.comp_method == ZIP_CM_STORE)
-       && ((st.valid & ZIP_STAT_SIZE) == 0 || st.size != 0)) {
-       comp_impl = NULL;
-       if ((comp_impl=zip_get_compression_implementation(ZIP_CM_DEFLATE))
-           == NULL) {
-           _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0);
-           zip_source_pop(s2);
-           return -1;
+
+    if ((offstart = zip_source_tell_write(za->src)) < 0) {
+        return -1;
+    }
+
+    /* as long as we don't support non-seekable output, clear data descriptor bit */
+    de->bitflags &= (zip_uint16_t)~ZIP_GPBF_DATA_DESCRIPTOR;
+    if ((is_zip64=_zip_dirent_write(za, de, flags)) < 0)
+       return -1;
+
+
+    if (st.comp_method == ZIP_CM_STORE || (ZIP_CM_IS_DEFAULT(de->comp_method) && st.comp_method != de->comp_method)) {
+       zip_source_t *s_store, *s_crc;
+       zip_compression_implementation comp_impl;
+       
+       if (st.comp_method != ZIP_CM_STORE) {
+           if ((comp_impl=_zip_get_compression_implementation(st.comp_method)) == NULL) {
+               zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0);
+               return -1;
+           }
+           if ((s_store=comp_impl(za, src, st.comp_method, ZIP_CODEC_DECODE)) == NULL) {
+               /* error set by comp_impl */
+               return -1;
+           }
        }
-       if ((s2=comp_impl(za, s2, ZIP_CM_DEFLATE, ZIP_CODEC_ENCODE))
-           == NULL) {
-           /* XXX: set error? */
-           zip_source_pop(s2);
+       else {
+           /* to have the same reference count to src as in the case where it's not stored */
+           zip_source_keep(src);
+           s_store = src;
+       }
+
+       s_crc = zip_source_crc(za, s_store, 0);
+       zip_source_free(s_store);
+       if (s_crc == NULL) {
            return -1;
        }
+
+       if (de->comp_method != ZIP_CM_STORE && ((st.valid & ZIP_STAT_SIZE) == 0 || st.size != 0)) {
+           if ((comp_impl=_zip_get_compression_implementation(de->comp_method)) == NULL) {
+               zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0);
+               zip_source_free(s_crc);
+               return -1;
+           }
+           s2 = comp_impl(za, s_crc, de->comp_method, ZIP_CODEC_ENCODE);
+           zip_source_free(s_crc);
+           if (s2 == NULL) {
+               return -1;
+           }
+       }
+       else {
+           s2 = s_crc;
+       }
     }
-    else
+    else {
+       zip_source_keep(src);
        s2 = src;
+    }
 
-    offdata = ftello(ft);
-       
-    ret = copy_source(za, s2, ft);
+    if ((offdata = zip_source_tell_write(za->src)) < 0) {
+        return -1;
+    }
+
+    ret = copy_source(za, s2);
        
     if (zip_source_stat(s2, &st) < 0)
        ret = -1;
-    
-    while (s2 != src) {
-       if ((s2=zip_source_pop(s2)) == NULL) {
-           /* XXX: set erorr */
-           ret = -1;
-           break;
-       }
-    }
+
+    zip_source_free(s2);
 
     if (ret < 0)
        return -1;
 
-    offend = ftello(ft);
+    if ((offend = zip_source_tell_write(za->src)) < 0) {
+        return -1;
+    }
 
-    if (fseeko(ft, offstart, SEEK_SET) < 0) {
-       _zip_error_set(&za->error, ZIP_ER_SEEK, errno);
+    if (zip_source_seek_write(za->src, offstart, SEEK_SET) < 0) {
+       _zip_error_set_from_source(&za->error, za->src);
        return -1;
     }
 
-    de->last_mod = st.mtime;
+    if ((st.valid & (ZIP_STAT_COMP_METHOD|ZIP_STAT_CRC|ZIP_STAT_SIZE)) != (ZIP_STAT_COMP_METHOD|ZIP_STAT_CRC|ZIP_STAT_SIZE)) {
+       zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+       return -1;
+    }
+
+    if ((de->changed & ZIP_DIRENT_LAST_MOD) == 0) {
+        if (st.valid & ZIP_STAT_MTIME)
+            de->last_mod = st.mtime;
+        else
+            time(&de->last_mod);
+    }
     de->comp_method = st.comp_method;
     de->crc = st.crc;
     de->uncomp_size = st.size;
-    de->comp_size = offend - offdata;
-
-    if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0))
-       _zip_dirent_torrent_normalize(de);
+    de->comp_size = (zip_uint64_t)(offend - offdata);
 
-    if (_zip_dirent_write(de, ft, 1, &za->error) < 0)
+    if ((ret=_zip_dirent_write(za, de, flags)) < 0)
        return -1;
-    
-    if (fseeko(ft, offend, SEEK_SET) < 0) {
-       _zip_error_set(&za->error, ZIP_ER_SEEK, errno);
+    if (is_zip64 != ret) {
+       /* Zip64 mismatch between preliminary file header written before data and final file header written afterwards */
+       zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+       return -1;
+    }
+
+   
+    if (zip_source_seek_write(za->src, offend, SEEK_SET) < 0) {
+       _zip_error_set_from_source(&za->error, za->src);
        return -1;
     }
 
     return 0;
 }
 
-\f
 
 static int
-copy_data(FILE *fs, off_t len, FILE *ft, struct zip_error *error)
+copy_data(zip_t *za, zip_uint64_t len)
 {
-    char buf[BUFSIZE];
-    int n, nn;
-
-    if (len == 0)
-       return 0;
+    zip_uint8_t buf[BUFSIZE];
+    size_t n;
 
     while (len > 0) {
-       nn = len > sizeof(buf) ? sizeof(buf) : len;
-       if ((n=fread(buf, 1, nn, fs)) < 0) {
-           _zip_error_set(error, ZIP_ER_READ, errno);
-           return -1;
-       }
-       else if (n == 0) {
-           _zip_error_set(error, ZIP_ER_EOF, 0);
+       n = len > sizeof(buf) ? sizeof(buf) : len;
+       if (_zip_read(za->src, buf, n, &za->error) < 0) {
            return -1;
        }
 
-       if (fwrite(buf, 1, n, ft) != (size_t)n) {
-           _zip_error_set(error, ZIP_ER_WRITE, errno);
+       if (_zip_write(za, buf, n) < 0) {
            return -1;
        }
        
@@ -470,12 +414,11 @@ copy_data(FILE *fs, off_t len, FILE *ft, struct zip_error *error)
     return 0;
 }
 
-\f
 
 static int
-copy_source(struct zip *za, struct zip_source *src, FILE *ft)
+copy_source(zip_t *za, zip_source_t *src)
 {
-    char buf[BUFSIZE];
+    zip_uint8_t buf[BUFSIZE];
     zip_int64_t n;
     int ret;
 
@@ -486,105 +429,60 @@ copy_source(struct zip *za, struct zip_source *src, FILE *ft)
 
     ret = 0;
     while ((n=zip_source_read(src, buf, sizeof(buf))) > 0) {
-       if (fwrite(buf, 1, n, ft) != (size_t)n) {
-           _zip_error_set(&za->error, ZIP_ER_WRITE, errno);
+       if (_zip_write(za, buf, (zip_uint64_t)n) < 0) {
            ret = -1;
            break;
        }
     }
     
     if (n < 0) {
-       if (ret == 0)
-           _zip_error_set_from_source(&za->error, src);
+       _zip_error_set_from_source(&za->error, src);
        ret = -1;
-    }  
+    }
 
     zip_source_close(src);
     
     return ret;
 }
 
-\f
 
 static int
-write_cdir(struct zip *za, struct zip_cdir *cd, FILE *out)
+write_cdir(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivors)
 {
-    off_t offset;
-    uLong crc;
-    char buf[TORRENT_CRC_LEN+1];
-    
-    if (_zip_cdir_write(cd, out, &za->error) < 0)
-       return -1;
+    zip_int64_t cd_start, end, size;
     
-    if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0)
-       return 0;
-
-
-    /* fix up torrentzip comment */
-
-    offset = ftello(out);
-
-    if (_zip_filerange_crc(out, cd->offset, cd->size, &crc, &za->error) < 0)
-       return -1;
-
-    snprintf(buf, sizeof(buf), "%08lX", (long)crc);
-
-    if (fseeko(out, offset-TORRENT_CRC_LEN, SEEK_SET) < 0) {
-       _zip_error_set(&za->error, ZIP_ER_SEEK, errno);
-       return -1;
+    if ((cd_start = zip_source_tell_write(za->src)) < 0) {
+        return -1;
     }
 
-    if (fwrite(buf, TORRENT_CRC_LEN, 1, out) != 1) {
-       _zip_error_set(&za->error, ZIP_ER_WRITE, errno);
+    if ((size=_zip_cdir_write(za, filelist, survivors)) < 0) {
        return -1;
     }
-
-    return 0;
-}
-
-\f
-
-static int
-_zip_cdir_set_comment(struct zip_cdir *dest, struct zip *src)
-{
-    if (src->ch_comment_len != -1) {
-       dest->comment = _zip_memdup(src->ch_comment,
-                                   src->ch_comment_len, &src->error);
-       if (dest->comment == NULL)
-           return -1;
-       dest->comment_len = src->ch_comment_len;
-    } else {
-       if (src->cdir && src->cdir->comment) {
-           dest->comment = _zip_memdup(src->cdir->comment,
-                                       src->cdir->comment_len, &src->error);
-           if (dest->comment == NULL)
-               return -1;
-           dest->comment_len = src->cdir->comment_len;
-       }
+    
+    if ((end = zip_source_tell_write(za->src)) < 0) {
+        return -1;
     }
 
     return 0;
 }
 
-\f
 
 int
-_zip_changed(struct zip *za, int *survivorsp)
+_zip_changed(const zip_t *za, zip_uint64_t *survivorsp)
 {
-    int changed, i, survivors;
+    int changed;
+    zip_uint64_t i, survivors;
 
-    changed = survivors = 0;
+    changed = 0;
+    survivors = 0;
 
-    if (za->ch_comment_len != -1
-       || za->ch_flags != za->flags)
+    if (za->comment_changed || za->ch_flags != za->flags)
        changed = 1;
 
     for (i=0; i<za->nentry; i++) {
-       if ((za->entry[i].state != ZIP_ST_UNCHANGED)
-           || (za->entry[i].ch_extra_len != -1)
-           || (za->entry[i].ch_comment_len != -1))
+       if (za->entry[i].deleted || za->entry[i].source || (za->entry[i].changes && za->entry[i].changes->changed != 0))
            changed = 1;
-       if (za->entry[i].state != ZIP_ST_DELETED)
+       if (!za->entry[i].deleted)
            survivors++;
     }
 
@@ -593,54 +491,3 @@ _zip_changed(struct zip *za, int *survivorsp)
 
     return changed;
 }
-
-\f
-
-static char *
-_zip_create_temp_output(struct zip *za, FILE **outp)
-{
-    char *temp;
-    int tfd;
-    FILE *tfp;
-    
-    if ((temp=(char *)malloc(strlen(za->zn)+8)) == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
-       return NULL;
-    }
-
-    sprintf(temp, "%s.XXXXXX", za->zn);
-
-    if ((tfd=mkstemp(temp)) == -1) {
-       _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno);
-       free(temp);
-       return NULL;
-    }
-    
-    if ((tfp=fdopen(tfd, "r+b")) == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno);
-       close(tfd);
-       remove(temp);
-       free(temp);
-       return NULL;
-    }
-
-#ifdef _WIN32
-    /*
-      According to Pierre Joye, Windows in some environments per
-      default creates text files, so force binary mode.
-    */
-    _setmode(_fileno(tfp), _O_BINARY );
-#endif
-
-    *outp = tfp;
-    return temp;
-}
-
-\f
-
-static int
-_zip_torrentzip_cmp(const void *a, const void *b)
-{
-    return strcasecmp(((const struct filelist *)a)->name,
-                     ((const struct filelist *)b)->name);
-}
index 8178ebb..b3e7abb 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_delete.c -- delete file from zip archive
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_delete(struct zip *za, zip_uint64_t idx)
+zip_delete(zip_t *za, zip_uint64_t idx)
 {
     if (idx >= za->nentry) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
        return -1;
     }
 
     if (ZIP_IS_RDONLY(za)) {
-       _zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
        return -1;
     }
 
@@ -55,9 +53,8 @@ zip_delete(struct zip *za, zip_uint64_t idx)
     if (_zip_unchange(za, idx, 1) != 0)
        return -1;
 
-    za->entry[idx].state = ZIP_ST_DELETED;
+    za->entry[idx].deleted = 1;
 
     return 0;
 }
 
-\f
similarity index 57%
rename from regress/add_dir.c
rename to lib/zip_dir_add.c
index ddd6758..f535b21 100644 (file)
@@ -1,6 +1,6 @@
 /*
-  add_dir.c -- test case for adding file from buffer to archive
-  Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
+  zip_dir_add.c -- add directory
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
-#include <errno.h>
-#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
-#include "zip.h"
+#include "zipint.h"
 
-const char *dir[2] = {
-    "testdir/",
-    "testdir-noslash"
-};
 
-const char *prg;
+/* NOTE: Signed due to -1 on error.  See zip_add.c for more details. */
 
-int
-main(int argc, char *argv[])
+ZIP_EXTERN zip_int64_t
+zip_dir_add(zip_t *za, const char *name, zip_flags_t flags)
 {
-    const char *archive;
-    struct zip *za;
-    char buf[100];
-    size_t i;
-    int err;
+    size_t len;
+    zip_int64_t idx;
+    char *s;
+    zip_source_t *source;
 
-    prg = argv[0];
-
-    if (argc != 2) {
-       fprintf(stderr, "usage: %s archive\n", prg);
-       return 1;
+    if (ZIP_IS_RDONLY(za)) {
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+       return -1;
     }
 
-    archive = argv[1];
-    
-    if ((za=zip_open(archive, ZIP_CREATE, &err)) == NULL) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't open zip archive %s: %s\n", prg,
-               archive, buf);
-       return 1;
+    if (name == NULL) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
     }
 
-    for (i=0; i<sizeof(dir)/sizeof(dir[0]); i++) {
-       if (zip_add_dir(za, dir[i]) == -1) {
-           fprintf(stderr, "%s: can't add file `%s': %s\n", prg,
-                   dir[i], zip_strerror(za));
-           return 1;
+    s = NULL;
+    len = strlen(name);
+
+    if (name[len-1] != '/') {
+       if ((s=(char *)malloc(len+2)) == NULL) {
+           zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+           return -1;
        }
+       strcpy(s, name);
+       s[len] = '/';
+       s[len+1] = '\0';
+    }
+
+    if ((source=zip_source_buffer(za, NULL, 0, 0)) == NULL) {
+       free(s);
+       return -1;
     }
+       
+    idx = _zip_file_replace(za, ZIP_UINT64_MAX, s ? s : name, source, flags);
+
+    free(s);
 
-    if (zip_close(za) == -1) {
-       fprintf(stderr, "%s: can't close zip archive %s\n", prg,
-               archive);
-       return 1;
+    if (idx < 0)
+       zip_source_free(source);
+    else {
+       if (zip_file_set_external_attributes(za, (zip_uint64_t)idx, 0, ZIP_OPSYS_DEFAULT, ZIP_EXT_ATTRIB_DEFAULT_DIR) < 0) {
+           zip_delete(za, (zip_uint64_t)idx);
+           return -1;
+       }
     }
 
-    return 0;
+    return idx;
 }
index b5b9d27..7b7cdb4 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_dirent.c -- read directory entry (local or central), clean dirent
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -31,7 +31,6 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdio.h>
 #include <stdlib.h>
 
 #include "zipint.h"
 
-static time_t _zip_d2u_time(int, int);
-static char *_zip_readfpstr(FILE *, unsigned int, int, struct zip_error *);
-static char *_zip_readstr(unsigned char **, int, int, struct zip_error *);
-static void _zip_write2(unsigned short, FILE *);
-static void _zip_write4(unsigned int, FILE *);
+static time_t _zip_d2u_time(zip_uint16_t, zip_uint16_t);
+static zip_string_t *_zip_dirent_process_ef_utf_8(const zip_dirent_t *de, zip_uint16_t id, zip_string_t *str);
+static zip_extra_field_t *_zip_ef_utf8(zip_uint16_t, zip_string_t *, zip_error_t *);
 
-\f
 
 void
-_zip_cdir_free(struct zip_cdir *cd)
+_zip_cdir_free(zip_cdir_t *cd)
 {
-    int i;
+    zip_uint64_t i;
 
     if (!cd)
        return;
 
     for (i=0; i<cd->nentry; i++)
-       _zip_dirent_finalize(cd->entry+i);
-    free(cd->comment);
+       _zip_entry_finalize(cd->entry+i);
     free(cd->entry);
+    _zip_string_free(cd->comment);
     free(cd);
 }
 
-\f
-
-int
-_zip_cdir_grow(struct zip_cdir *cd, int nentry, struct zip_error *error)
-{
-    struct zip_dirent *entry;
-
-    if (nentry < cd->nentry) {
-       _zip_error_set(error, ZIP_ER_INTERNAL, 0);
-       return -1;
-    }
-
-    if ((entry=((struct zip_dirent *)
-               realloc(cd->entry, sizeof(*(cd->entry))*nentry))) == NULL) {
-       _zip_error_set(error, ZIP_ER_MEMORY, 0);
-       return -1;
-    }
-
-    cd->nentry = nentry;
-    cd->entry = entry;
-
-    return 0;
-}
-
-\f
 
-struct zip_cdir *
-_zip_cdir_new(int nentry, struct zip_error *error)
+zip_cdir_t *
+_zip_cdir_new(zip_uint64_t nentry, zip_error_t *error)
 {
-    struct zip_cdir *cd;
+    zip_cdir_t *cd;
+    zip_uint64_t i;
     
-    if ((cd=(struct zip_cdir *)malloc(sizeof(*cd))) == NULL) {
-       _zip_error_set(error, ZIP_ER_MEMORY, 0);
+    if ((cd=(zip_cdir_t *)malloc(sizeof(*cd))) == NULL) {
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
        return NULL;
     }
 
-    if ((cd->entry=(struct zip_dirent *)malloc(sizeof(*(cd->entry))*nentry))
-       == NULL) {
-       _zip_error_set(error, ZIP_ER_MEMORY, 0);
+    if (nentry == 0)
+       cd->entry = NULL;
+    else if ((nentry > SIZE_MAX/sizeof(*(cd->entry))) || (cd->entry=(zip_entry_t *)malloc(sizeof(*(cd->entry))*(size_t)nentry)) == NULL) {
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
        free(cd);
        return NULL;
     }
 
-    /* entries must be initialized by caller */
+    for (i=0; i<nentry; i++)
+       _zip_entry_init(cd->entry+i);
 
-    cd->nentry = nentry;
+    cd->nentry = cd->nentry_alloc = nentry;
     cd->size = cd->offset = 0;
     cd->comment = NULL;
-    cd->comment_len = 0;
 
     return cd;
 }
 
-\f
 
-int
-_zip_cdir_write(struct zip_cdir *cd, FILE *fp, struct zip_error *error)
+zip_int64_t
+_zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivors)
 {
-    int i;
+    zip_uint64_t offset, size;
+    zip_string_t *comment;
+    zip_uint8_t buf[EOCDLEN + EOCD64LEN + EOCD64LOCLEN];
+    zip_buffer_t *buffer;
+    zip_int64_t off;
+    zip_uint64_t i;
+    bool is_zip64;
+    int ret;
+
+    if ((off = zip_source_tell_write(za->src)) < 0) {
+        _zip_error_set_from_source(&za->error, za->src);
+        return -1;
+    }
+    offset = (zip_uint64_t)off;
+
+    is_zip64 = 0;
 
-    cd->offset = ftello(fp);
+    for (i=0; i<survivors; i++) {
+       zip_entry_t *entry = za->entry+filelist[i].idx;
 
-    for (i=0; i<cd->nentry; i++) {
-       if (_zip_dirent_write(cd->entry+i, fp, 0, error) != 0)
+       if ((ret=_zip_dirent_write(za, entry->changes ? entry->changes : entry->orig, ZIP_FL_CENTRAL)) < 0)
            return -1;
+       if (ret)
+           is_zip64 = true;
     }
 
-    cd->size = ftello(fp) - cd->offset;
+    if ((off = zip_source_tell_write(za->src)) < 0) {
+        _zip_error_set_from_source(&za->error, za->src);
+        return -1;
+    }
+    size = (zip_uint64_t)off - offset;
+
+    if (offset > ZIP_UINT32_MAX || survivors > ZIP_UINT16_MAX)
+       is_zip64 = true;
+
+
+    if ((buffer = _zip_buffer_new(buf, sizeof(buf))) == NULL) {
+        zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+        return -1;
+    }
+    
+    if (is_zip64) {
+       _zip_buffer_put(buffer, EOCD64_MAGIC, 4);
+        _zip_buffer_put_64(buffer, EOCD64LEN-12);
+       _zip_buffer_put_16(buffer, 45);
+       _zip_buffer_put_16(buffer, 45);
+       _zip_buffer_put_32(buffer, 0);
+       _zip_buffer_put_32(buffer, 0);
+       _zip_buffer_put_64(buffer, survivors);
+       _zip_buffer_put_64(buffer, survivors);
+       _zip_buffer_put_64(buffer, size);
+       _zip_buffer_put_64(buffer, offset);
+       _zip_buffer_put(buffer, EOCD64LOC_MAGIC, 4);
+       _zip_buffer_put_32(buffer, 0);
+       _zip_buffer_put_64(buffer, offset+size);
+       _zip_buffer_put_32(buffer, 1);
+    }
     
-    /* clearerr(fp); */
-    fwrite(EOCD_MAGIC, 1, 4, fp);
-    _zip_write4(0, fp);
-    _zip_write2((unsigned short)cd->nentry, fp);
-    _zip_write2((unsigned short)cd->nentry, fp);
-    _zip_write4(cd->size, fp);
-    _zip_write4(cd->offset, fp);
-    _zip_write2(cd->comment_len, fp);
-    fwrite(cd->comment, 1, cd->comment_len, fp);
+    _zip_buffer_put(buffer, EOCD_MAGIC, 4);
+    _zip_buffer_put_32(buffer, 0);
+    _zip_buffer_put_16(buffer, (zip_uint16_t)(survivors >= ZIP_UINT16_MAX ? ZIP_UINT16_MAX : survivors));
+    _zip_buffer_put_16(buffer, (zip_uint16_t)(survivors >= ZIP_UINT16_MAX ? ZIP_UINT16_MAX : survivors));
+    _zip_buffer_put_32(buffer, size >= ZIP_UINT32_MAX ? ZIP_UINT32_MAX : (zip_uint32_t)size);
+    _zip_buffer_put_32(buffer, offset >= ZIP_UINT32_MAX ? ZIP_UINT32_MAX : (zip_uint32_t)offset);
+
+    comment = za->comment_changed ? za->comment_changes : za->comment_orig;
 
-    if (ferror(fp)) {
-       _zip_error_set(error, ZIP_ER_WRITE, errno);
+    _zip_buffer_put_16(buffer, (zip_uint16_t)(comment ? comment->length : 0));
+    
+    if (!_zip_buffer_ok(buffer)) {
+        zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+        _zip_buffer_free(buffer);
+        return -1;
+    }
+
+    if (_zip_write(za, _zip_buffer_data(buffer), _zip_buffer_offset(buffer)) < 0) {
+        _zip_buffer_free(buffer);
        return -1;
     }
 
-    return 0;
+    _zip_buffer_free(buffer);
+
+    if (comment) {
+       if (_zip_write(za, comment->raw, comment->length) < 0) {
+           return -1;
+       }
+    }
+
+    return (zip_int64_t)size;
+}
+
+
+zip_dirent_t *
+_zip_dirent_clone(const zip_dirent_t *sde)
+{
+    zip_dirent_t *tde;
+
+    if ((tde=(zip_dirent_t *)malloc(sizeof(*tde))) == NULL)
+       return NULL;
+
+    if (sde)
+       memcpy(tde, sde, sizeof(*sde));
+    else
+       _zip_dirent_init(tde);
+    
+    tde->changed = 0;
+    tde->cloned = 1;
+
+    return tde;
 }
 
-\f
 
 void
-_zip_dirent_finalize(struct zip_dirent *zde)
+_zip_dirent_finalize(zip_dirent_t *zde)
 {
-    free(zde->filename);
-    zde->filename = NULL;
-    free(zde->extrafield);
-    zde->extrafield = NULL;
-    free(zde->comment);
-    zde->comment = NULL;
+    if (!zde->cloned || zde->changed & ZIP_DIRENT_FILENAME) {
+       _zip_string_free(zde->filename);
+       zde->filename = NULL;
+    }
+    if (!zde->cloned || zde->changed & ZIP_DIRENT_EXTRA_FIELD) {
+       _zip_ef_free(zde->extra_fields);
+       zde->extra_fields = NULL;
+    }
+    if (!zde->cloned || zde->changed & ZIP_DIRENT_COMMENT) {
+       _zip_string_free(zde->comment);
+       zde->comment = NULL;
+    }
 }
 
-\f
 
 void
-_zip_dirent_init(struct zip_dirent *de)
+_zip_dirent_free(zip_dirent_t *zde)
 {
-    de->version_madeby = 0;
+    if (zde == NULL)
+       return;
+
+    _zip_dirent_finalize(zde);
+    free(zde);
+}
+
+
+void
+_zip_dirent_init(zip_dirent_t *de)
+{
+    de->changed = 0;
+    de->local_extra_fields_read = 0;
+    de->cloned = 0;
+
+    de->version_madeby = 20 | (ZIP_OPSYS_DEFAULT << 8);
     de->version_needed = 20; /* 2.0 */
     de->bitflags = 0;
-    de->comp_method = 0;
+    de->comp_method = ZIP_CM_DEFAULT;
     de->last_mod = 0;
     de->crc = 0;
     de->comp_size = 0;
     de->uncomp_size = 0;
     de->filename = NULL;
-    de->filename_len = 0;
-    de->extrafield = NULL;
-    de->extrafield_len = 0;
+    de->extra_fields = NULL;
     de->comment = NULL;
-    de->comment_len = 0;
     de->disk_number = 0;
     de->int_attrib = 0;
-    de->ext_attrib = 0;
+    de->ext_attrib = ZIP_EXT_ATTRIB_DEFAULT;
     de->offset = 0;
 }
 
-\f
+
+bool
+_zip_dirent_needs_zip64(const zip_dirent_t *de, zip_flags_t flags)
+{
+    if (de->uncomp_size >= ZIP_UINT32_MAX || de->comp_size >= ZIP_UINT32_MAX
+       || ((flags & ZIP_FL_CENTRAL) && de->offset >= ZIP_UINT32_MAX))
+       return true;
+
+    return false;
+}
+
+
+zip_dirent_t *
+_zip_dirent_new(void)
+{
+    zip_dirent_t *de;
+
+    if ((de=(zip_dirent_t *)malloc(sizeof(*de))) == NULL)
+       return NULL;
+
+    _zip_dirent_init(de);
+    return de;
+}
+
 
 /* _zip_dirent_read(zde, fp, bufp, left, localp, error):
    Fills the zip directory entry zde.
 
-   If bufp is non-NULL, data is taken from there and bufp is advanced
-   by the amount of data used; otherwise data is read from fp as needed.
+   If buffer is non-NULL, data is taken from there; otherwise data is read from fp as needed.
    
-   if leftp is non-NULL, no more bytes than specified by it are used,
-   and *leftp is reduced by the number of bytes used.
-
-   If local != 0, it reads a local header instead of a central
-   directory entry.
+   If local is true, it reads a local header instead of a central directory entry.
 
-   Returns 0 if successful. On error, error is filled in and -1 is
-   returned.
-
-   XXX: leftp and file position undefined on error.
+   Returns size of dirent read if successful. On error, error is filled in and -1 is returned.
 */
 
-int
-_zip_dirent_read(struct zip_dirent *zde, FILE *fp,
-                unsigned char **bufp, zip_uint32_t *leftp, int local,
-                struct zip_error *error)
+zip_int64_t
+_zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, bool local, zip_error_t *error)
 {
-    unsigned char buf[CDENTRYSIZE];
-    unsigned char *cur;
-    unsigned short dostime, dosdate;
-    zip_uint32_t size;
+    zip_uint8_t buf[CDENTRYSIZE];
+    zip_uint16_t dostime, dosdate;
+    zip_uint32_t size, variable_size;
+    zip_uint16_t filename_len, comment_len, ef_len;
 
-    if (local)
-       size = LENTRYSIZE;
-    else
-       size = CDENTRYSIZE;
-
-    if (leftp && (*leftp < size)) {
-       _zip_error_set(error, ZIP_ER_NOZIP, 0);
-       return -1;
-    }
+    bool from_buffer = (buffer != NULL);
+    
+    size = local ? LENTRYSIZE : CDENTRYSIZE;
 
-    if (bufp) {
-       /* use data from buffer */
-       cur = *bufp;
+    if (buffer) {
+        if (_zip_buffer_left(buffer) < size) {
+            zip_error_set(error, ZIP_ER_NOZIP, 0);
+            return -1;
+        }
     }
     else {
-       /* read entry from disk */
-       if ((fread(buf, 1, size, fp)<size)) {
-           _zip_error_set(error, ZIP_ER_READ, errno);
-           return -1;
-       }
-       cur = buf;
+        if ((buffer = _zip_buffer_new_from_source(src, size, buf, error)) == NULL) {
+            return -1;
+        }
     }
 
-    if (memcmp(cur, (local ? LOCAL_MAGIC : CENTRAL_MAGIC), 4) != 0) {
-       _zip_error_set(error, ZIP_ER_NOZIP, 0);
+    if (memcmp(_zip_buffer_get(buffer, 4), (local ? LOCAL_MAGIC : CENTRAL_MAGIC), 4) != 0) {
+       zip_error_set(error, ZIP_ER_NOZIP, 0);
+        if (!from_buffer) {
+            _zip_buffer_free(buffer);
+        }
        return -1;
     }
-    cur += 4;
 
-    
     /* convert buffercontents to zip_dirent */
-    
+
+    _zip_dirent_init(zde);
     if (!local)
-       zde->version_madeby = _zip_read2(&cur);
+       zde->version_madeby = _zip_buffer_get_16(buffer);
     else
        zde->version_madeby = 0;
-    zde->version_needed = _zip_read2(&cur);
-    zde->bitflags = _zip_read2(&cur);
-    zde->comp_method = _zip_read2(&cur);
+    zde->version_needed = _zip_buffer_get_16(buffer);
+    zde->bitflags = _zip_buffer_get_16(buffer);
+    zde->comp_method = _zip_buffer_get_16(buffer);
     
     /* convert to time_t */
-    dostime = _zip_read2(&cur);
-    dosdate = _zip_read2(&cur);
+    dostime = _zip_buffer_get_16(buffer);
+    dosdate = _zip_buffer_get_16(buffer);
     zde->last_mod = _zip_d2u_time(dostime, dosdate);
     
-    zde->crc = _zip_read4(&cur);
-    zde->comp_size = _zip_read4(&cur);
-    zde->uncomp_size = _zip_read4(&cur);
+    zde->crc = _zip_buffer_get_32(buffer);
+    zde->comp_size = _zip_buffer_get_32(buffer);
+    zde->uncomp_size = _zip_buffer_get_32(buffer);
     
-    zde->filename_len = _zip_read2(&cur);
-    zde->extrafield_len = _zip_read2(&cur);
+    filename_len = _zip_buffer_get_16(buffer);
+    ef_len = _zip_buffer_get_16(buffer);
     
     if (local) {
-       zde->comment_len = 0;
+       comment_len = 0;
        zde->disk_number = 0;
        zde->int_attrib = 0;
        zde->ext_attrib = 0;
        zde->offset = 0;
     } else {
-       zde->comment_len = _zip_read2(&cur);
-       zde->disk_number = _zip_read2(&cur);
-       zde->int_attrib = _zip_read2(&cur);
-       zde->ext_attrib = _zip_read4(&cur);
-       zde->offset = _zip_read4(&cur);
+       comment_len = _zip_buffer_get_16(buffer);
+       zde->disk_number = _zip_buffer_get_16(buffer);
+       zde->int_attrib = _zip_buffer_get_16(buffer);
+       zde->ext_attrib = _zip_buffer_get_32(buffer);
+       zde->offset = _zip_buffer_get_32(buffer);
+    }
+    
+    if (!_zip_buffer_ok(buffer)) {
+        zip_error_set(error, ZIP_ER_INTERNAL, 0);
+        if (!from_buffer) {
+            _zip_buffer_free(buffer);
+        }
+        return -1;
     }
 
     zde->filename = NULL;
-    zde->extrafield = NULL;
+    zde->extra_fields = NULL;
     zde->comment = NULL;
 
-    size += zde->filename_len+zde->extrafield_len+zde->comment_len;
+    variable_size = (zip_uint32_t)filename_len+(zip_uint32_t)ef_len+(zip_uint32_t)comment_len;
 
-    if (leftp && (*leftp < size)) {
-       _zip_error_set(error, ZIP_ER_NOZIP, 0);
-       return -1;
+    if (from_buffer) {
+        if (_zip_buffer_left(buffer) < variable_size) {
+            zip_error_set(error, ZIP_ER_INCONS, 0);
+            return -1;
+        }
+    }
+    else {
+        _zip_buffer_free(buffer);
+        
+        if ((buffer = _zip_buffer_new_from_source(src, variable_size, NULL, error)) == NULL) {
+            return -1;
+        }
     }
 
-    if (bufp) {
-       if (zde->filename_len) {
-           zde->filename = _zip_readstr(&cur, zde->filename_len, 1, error);
-           if (!zde->filename)
-                   return -1;
-       }
-
-       if (zde->extrafield_len) {
-           zde->extrafield = _zip_readstr(&cur, zde->extrafield_len, 0,
-                                          error);
-           if (!zde->extrafield)
+    if (filename_len) {
+       zde->filename = _zip_read_string(buffer, src, filename_len, 1, error);
+        if (!zde->filename) {
+            if (zip_error_code_zip(error) == ZIP_ER_EOF) {
+                zip_error_set(error, ZIP_ER_INCONS, 0);
+            }
+            if (!from_buffer) {
+                _zip_buffer_free(buffer);
+            }
+           return -1;
+        }
+
+       if (zde->bitflags & ZIP_GPBF_ENCODING_UTF_8) {
+           if (_zip_guess_encoding(zde->filename, ZIP_ENCODING_UTF8_KNOWN) == ZIP_ENCODING_ERROR) {
+               zip_error_set(error, ZIP_ER_INCONS, 0);
+                if (!from_buffer) {
+                    _zip_buffer_free(buffer);
+                }
                return -1;
+           }
        }
+    }
 
-       if (zde->comment_len) {
-           zde->comment = _zip_readstr(&cur, zde->comment_len, 0, error);
-           if (!zde->comment)
-               return -1;
+    if (ef_len) {
+       zip_uint8_t *ef = _zip_read_data(buffer, src, ef_len, 0, error);
+
+        if (ef == NULL) {
+            if (!from_buffer) {
+                _zip_buffer_free(buffer);
+            }
+           return -1;
+        }
+        if ((zde->extra_fields=_zip_ef_parse(ef, ef_len, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, error)) == NULL) {
+           free(ef);
+            if (!from_buffer) {
+                _zip_buffer_free(buffer);
+            }
+           return -1;
        }
+       free(ef);
+       if (local)
+           zde->local_extra_fields_read = 1;
     }
-    else {
-       if (zde->filename_len) {
-           zde->filename = _zip_readfpstr(fp, zde->filename_len, 1, error);
-           if (!zde->filename)
-                   return -1;
-       }
 
-       if (zde->extrafield_len) {
-           zde->extrafield = _zip_readfpstr(fp, zde->extrafield_len, 0,
-                                            error);
-           if (!zde->extrafield)
+    if (comment_len) {
+       zde->comment = _zip_read_string(buffer, src, comment_len, 0, error);
+        if (!zde->comment) {
+            if (!from_buffer) {
+                _zip_buffer_free(buffer);
+            }
+           return -1;
+        }
+       if (zde->bitflags & ZIP_GPBF_ENCODING_UTF_8) {
+           if (_zip_guess_encoding(zde->comment, ZIP_ENCODING_UTF8_KNOWN) == ZIP_ENCODING_ERROR) {
+               zip_error_set(error, ZIP_ER_INCONS, 0);
+                if (!from_buffer) {
+                    _zip_buffer_free(buffer);
+                }
                return -1;
+           }
        }
+    }
 
-       if (zde->comment_len) {
-           zde->comment = _zip_readfpstr(fp, zde->comment_len, 0, error);
-           if (!zde->comment)
-               return -1;
+    zde->filename = _zip_dirent_process_ef_utf_8(zde, ZIP_EF_UTF_8_NAME, zde->filename);
+    zde->comment = _zip_dirent_process_ef_utf_8(zde, ZIP_EF_UTF_8_COMMENT, zde->comment);
+
+    /* Zip64 */
+
+    if (zde->uncomp_size == ZIP_UINT32_MAX || zde->comp_size == ZIP_UINT32_MAX || zde->offset == ZIP_UINT32_MAX) {
+       zip_uint16_t got_len;
+        zip_buffer_t *ef_buffer;
+       const zip_uint8_t *ef = _zip_ef_get_by_id(zde->extra_fields, &got_len, ZIP_EF_ZIP64, 0, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, error);
+       /* TODO: if got_len == 0 && !ZIP64_EOCD: no error, 0xffffffff is valid value */
+        if (ef == NULL) {
+            if (!from_buffer) {
+                _zip_buffer_free(buffer);
+            }
+           return -1;
+        }
+        
+        if ((ef_buffer = _zip_buffer_new((zip_uint8_t *)ef, got_len)) == NULL) {
+            zip_error_set(error, ZIP_ER_MEMORY, 0);
+            if (!from_buffer) {
+                _zip_buffer_free(buffer);
+            }
+            return -1;
+        }
+       
+       if (zde->uncomp_size == ZIP_UINT32_MAX)
+           zde->uncomp_size = _zip_buffer_get_64(ef_buffer);
+       else if (local)
+           ef += 8;
+       if (zde->comp_size == ZIP_UINT32_MAX)
+           zde->comp_size = _zip_buffer_get_64(ef_buffer);
+       if (!local) {
+           if (zde->offset == ZIP_UINT32_MAX)
+               zde->offset = _zip_buffer_get_64(ef_buffer);
+           if (zde->disk_number == ZIP_UINT16_MAX)
+               zde->disk_number = _zip_buffer_get_32(buffer);
        }
+        
+        if (!_zip_buffer_eof(ef_buffer)) {
+            zip_error_set(error, ZIP_ER_INCONS, 0);
+            _zip_buffer_free(ef_buffer);
+            if (!from_buffer) {
+                _zip_buffer_free(buffer);
+            }
+            return -1;
+        }
+        _zip_buffer_free(ef_buffer);
+    }
+    
+    if (!_zip_buffer_ok(buffer)) {
+        zip_error_set(error, ZIP_ER_INTERNAL, 0);
+        if (!from_buffer) {
+            _zip_buffer_free(buffer);
+        }
+        return -1;
+    }
+    if (!from_buffer) {
+        _zip_buffer_free(buffer);
     }
 
-    if (bufp)
-      *bufp = cur;
-    if (leftp)
-       *leftp -= size;
+    /* zip_source_seek / zip_source_tell don't support values > ZIP_INT64_MAX */
+    if (zde->offset > ZIP_INT64_MAX) {
+       zip_error_set(error, ZIP_ER_SEEK, EFBIG);
+       return -1;
+    }
+    
+    zde->extra_fields = _zip_ef_remove_internal(zde->extra_fields);
 
-    return 0;
+    return (zip_int64_t)(size + variable_size);
 }
 
-\f
 
-/* _zip_dirent_torrent_normalize(de);
-   Set values suitable for torrentzip.
-*/
+static zip_string_t *
+_zip_dirent_process_ef_utf_8(const zip_dirent_t *de, zip_uint16_t id, zip_string_t *str)
+{
+    zip_uint16_t ef_len;
+    zip_uint32_t ef_crc;
+    zip_buffer_t *buffer;
 
-void
-_zip_dirent_torrent_normalize(struct zip_dirent *de)
+    const zip_uint8_t *ef = _zip_ef_get_by_id(de->extra_fields, &ef_len, id, 0, ZIP_EF_BOTH, NULL);
+    
+    if (ef == NULL || ef_len < 5 || ef[0] != 1) {
+       return str;
+    }
+    
+    if ((buffer = _zip_buffer_new((zip_uint8_t *)ef, ef_len)) == NULL) {
+        return str;
+    }
+    
+    _zip_buffer_get_8(buffer);
+    ef_crc = _zip_buffer_get_32(buffer);
+
+    if (_zip_string_crc32(str) == ef_crc) {
+        zip_uint16_t len = (zip_uint16_t)_zip_buffer_left(buffer);
+        zip_string_t *ef_str = _zip_string_new(_zip_buffer_get(buffer, len), len, ZIP_FL_ENC_UTF_8, NULL);
+
+       if (ef_str != NULL) {
+           _zip_string_free(str);
+           str = ef_str;
+       }
+    }
+    
+    _zip_buffer_free(buffer);
+    
+    return str;
+}
+
+
+zip_int32_t
+_zip_dirent_size(zip_source_t *src, zip_uint16_t flags, zip_error_t *error)
 {
-    static struct tm torrenttime;
-    static time_t last_mod = 0;
-
-    if (last_mod == 0) {
-#ifdef HAVE_STRUCT_TM_TM_ZONE
-       time_t now;
-       struct tm *l;
-#endif
-
-       torrenttime.tm_sec = 0;
-       torrenttime.tm_min = 32;
-       torrenttime.tm_hour = 23;
-       torrenttime.tm_mday = 24;
-       torrenttime.tm_mon = 11;
-       torrenttime.tm_year = 96;
-       torrenttime.tm_wday = 0;
-       torrenttime.tm_yday = 0;
-       torrenttime.tm_isdst = 0;
-
-#ifdef HAVE_STRUCT_TM_TM_ZONE
-       time(&now);
-       l = localtime(&now);
-       torrenttime.tm_gmtoff = l->tm_gmtoff;
-       torrenttime.tm_zone = l->tm_zone;
-#endif
-
-       last_mod = mktime(&torrenttime);
-    }
-    
-    de->version_madeby = 0;
-    de->version_needed = 20; /* 2.0 */
-    de->bitflags = 2; /* maximum compression */
-    de->comp_method = ZIP_CM_DEFLATE;
-    de->last_mod = last_mod;
+    zip_int32_t size;
+    bool local = (flags & ZIP_EF_LOCAL) != 0;
+    int i;
+    zip_uint8_t b[6];
+    zip_buffer_t *buffer;
 
-    de->disk_number = 0;
-    de->int_attrib = 0;
-    de->ext_attrib = 0;
-    de->offset = 0;
+    size = local ? LENTRYSIZE : CDENTRYSIZE;
 
-    free(de->extrafield);
-    de->extrafield = NULL;
-    de->extrafield_len = 0;
-    free(de->comment);
-    de->comment = NULL;
-    de->comment_len = 0;
+    if (zip_source_seek(src, local ? 26 : 28, SEEK_CUR) < 0) {
+        _zip_error_set_from_source(error, src);
+       return -1;
+    }
+    
+    if ((buffer = _zip_buffer_new_from_source(src, local ? 4 : 6, b, error)) == NULL) {
+       return -1;
+    }
+
+    for (i=0; i<(local ? 2 : 3); i++) {
+       size += _zip_buffer_get_16(buffer);
+    }
+    
+    if (!_zip_buffer_eof(buffer)) {
+        zip_error_set(error, ZIP_ER_INTERNAL, 0);
+       _zip_buffer_free(buffer);
+        return -1;
+    }
+
+    _zip_buffer_free(buffer);
+    return size;
 }
 
-\f
 
-/* _zip_dirent_write(zde, fp, localp, error):
-   Writes zip directory entry zde to file fp.
+/* _zip_dirent_write
+   Writes zip directory entry.
 
-   If localp != 0, it writes a local header instead of a central
-   directory entry.
+   If flags & ZIP_EF_LOCAL, it writes a local header instead of a central
+   directory entry.  If flags & ZIP_EF_FORCE_ZIP64, a ZIP64 extra field is written, even if not needed.
 
-   Returns 0 if successful. On error, error is filled in and -1 is
+   Returns 0 if successful, 1 if successful and wrote ZIP64 extra field. On error, error is filled in and -1 is
    returned.
 */
 
 int
-_zip_dirent_write(struct zip_dirent *zde, FILE *fp, int localp,
-                 struct zip_error *error)
+_zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
 {
-    unsigned short dostime, dosdate;
+    zip_uint16_t dostime, dosdate;
+    zip_encoding_type_t com_enc, name_enc;
+    zip_extra_field_t *ef;
+    bool is_zip64;
+    bool is_really_zip64;
+    zip_uint8_t buf[CDENTRYSIZE];
+    zip_buffer_t *buffer;
+
+    ef = NULL;
 
-    fwrite(localp ? LOCAL_MAGIC : CENTRAL_MAGIC, 1, 4, fp);
+    is_zip64 = false;
 
-    if (!localp)
-       _zip_write2(zde->version_madeby, fp);
-    _zip_write2(zde->version_needed, fp);
-    _zip_write2(zde->bitflags, fp);
-    _zip_write2(zde->comp_method, fp);
+    name_enc = _zip_guess_encoding(de->filename, ZIP_ENCODING_UNKNOWN);
+    com_enc = _zip_guess_encoding(de->comment, ZIP_ENCODING_UNKNOWN);
 
-    _zip_u2d_time(zde->last_mod, &dostime, &dosdate);
-    _zip_write2(dostime, fp);
-    _zip_write2(dosdate, fp);
+    if ((name_enc == ZIP_ENCODING_UTF8_KNOWN  && com_enc == ZIP_ENCODING_ASCII) ||
+       (name_enc == ZIP_ENCODING_ASCII && com_enc == ZIP_ENCODING_UTF8_KNOWN) ||
+       (name_enc == ZIP_ENCODING_UTF8_KNOWN  && com_enc == ZIP_ENCODING_UTF8_KNOWN))
+       de->bitflags |= ZIP_GPBF_ENCODING_UTF_8;
+    else {
+       de->bitflags &= (zip_uint16_t)~ZIP_GPBF_ENCODING_UTF_8;
+       if (name_enc == ZIP_ENCODING_UTF8_KNOWN) {
+           ef = _zip_ef_utf8(ZIP_EF_UTF_8_NAME, de->filename, &za->error);
+           if (ef == NULL)
+               return -1;
+       }
+       if ((flags & ZIP_FL_LOCAL) == 0 && com_enc == ZIP_ENCODING_UTF8_KNOWN){
+           zip_extra_field_t *ef2 = _zip_ef_utf8(ZIP_EF_UTF_8_COMMENT, de->comment, &za->error);
+           if (ef2 == NULL) {
+               _zip_ef_free(ef);
+               return -1;
+           }
+           ef2->next = ef;
+           ef = ef2;
+       }
+    }
     
-    _zip_write4(zde->crc, fp);
-    _zip_write4(zde->comp_size, fp);
-    _zip_write4(zde->uncomp_size, fp);
+    is_really_zip64 = _zip_dirent_needs_zip64(de, flags);
+    is_zip64 = (flags & (ZIP_FL_LOCAL|ZIP_FL_FORCE_ZIP64)) == (ZIP_FL_LOCAL|ZIP_FL_FORCE_ZIP64) || is_really_zip64;
     
-    _zip_write2(zde->filename_len, fp);
-    _zip_write2(zde->extrafield_len, fp);
+    if (is_zip64) {
+        zip_uint8_t ef_zip64[EFZIP64SIZE];
+        zip_buffer_t *ef_buffer = _zip_buffer_new(ef_zip64, sizeof(ef_zip64));
+        if (ef_buffer == NULL) {
+            zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+           _zip_ef_free(ef);
+            return -1;
+        }
+        
+        if (flags & ZIP_FL_LOCAL) {
+            if ((flags & ZIP_FL_FORCE_ZIP64) || de->comp_size > ZIP_UINT32_MAX || de->uncomp_size > ZIP_UINT32_MAX) {
+                _zip_buffer_put_64(ef_buffer, de->uncomp_size);
+                _zip_buffer_put_64(ef_buffer, de->comp_size);
+            }
+        }
+        else {
+            if ((flags & ZIP_FL_FORCE_ZIP64) || de->comp_size > ZIP_UINT32_MAX || de->uncomp_size > ZIP_UINT32_MAX || de->offset > ZIP_UINT32_MAX) {
+                if (de->uncomp_size >= ZIP_UINT32_MAX) {
+                    _zip_buffer_put_64(ef_buffer, de->uncomp_size);
+                }
+                if (de->comp_size >= ZIP_UINT32_MAX) {
+                    _zip_buffer_put_64(ef_buffer, de->comp_size);
+                }
+                if (de->offset >= ZIP_UINT32_MAX) {
+                    _zip_buffer_put_64(ef_buffer, de->offset);
+                }
+            }
+        }
+        
+        if (!_zip_buffer_ok(ef_buffer)) {
+            zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+            _zip_buffer_free(ef_buffer);
+           _zip_ef_free(ef);
+            return -1;
+        }
+
+        zip_extra_field_t *ef64 = _zip_ef_new(ZIP_EF_ZIP64, (zip_uint16_t)(_zip_buffer_offset(ef_buffer)), ef_zip64, ZIP_EF_BOTH);
+        _zip_buffer_free(ef_buffer);
+        ef64->next = ef;
+        ef = ef64;
+    }
+
+    if ((buffer = _zip_buffer_new(buf, sizeof(buf))) == NULL) {
+        zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+        _zip_ef_free(ef);
+        return -1;
+    }
+    
+    _zip_buffer_put(buffer, (flags & ZIP_FL_LOCAL) ? LOCAL_MAGIC : CENTRAL_MAGIC, 4);
     
-    if (!localp) {
-       _zip_write2(zde->comment_len, fp);
-       _zip_write2(zde->disk_number, fp);
-       _zip_write2(zde->int_attrib, fp);
-       _zip_write4(zde->ext_attrib, fp);
-       _zip_write4(zde->offset, fp);
+    if ((flags & ZIP_FL_LOCAL) == 0) {
+        _zip_buffer_put_16(buffer, (zip_uint16_t)(is_really_zip64 ? 45 : de->version_madeby));
     }
+    _zip_buffer_put_16(buffer, (zip_uint16_t)(is_really_zip64 ? 45 : de->version_needed));
+    _zip_buffer_put_16(buffer, de->bitflags&0xfff9); /* clear compression method specific flags */
+    _zip_buffer_put_16(buffer, (zip_uint16_t)de->comp_method);
 
-    if (zde->filename_len)
-       fwrite(zde->filename, 1, zde->filename_len, fp);
+    _zip_u2d_time(de->last_mod, &dostime, &dosdate);
+    _zip_buffer_put_16(buffer, dostime);
+    _zip_buffer_put_16(buffer, dosdate);
 
-    if (zde->extrafield_len)
-       fwrite(zde->extrafield, 1, zde->extrafield_len, fp);
+    _zip_buffer_put_32(buffer, de->crc);
+    
+    if (((flags & ZIP_FL_LOCAL) == ZIP_FL_LOCAL) && ((de->comp_size >= ZIP_UINT32_MAX) || (de->uncomp_size >= ZIP_UINT32_MAX))) {
+       /* In local headers, if a ZIP64 EF is written, it MUST contain
+        * both compressed and uncompressed sizes (even if one of the
+        * two is smaller than 0xFFFFFFFF); on the other hand, those
+        * may only appear when the corresponding standard entry is
+        * 0xFFFFFFFF.  (appnote.txt 4.5.3) */
+       _zip_buffer_put_32(buffer, ZIP_UINT32_MAX);
+       _zip_buffer_put_32(buffer, ZIP_UINT32_MAX);
+    }
+    else {
+        if (de->comp_size < ZIP_UINT32_MAX) {
+           _zip_buffer_put_32(buffer, (zip_uint32_t)de->comp_size);
+        }
+        else {
+           _zip_buffer_put_32(buffer, ZIP_UINT32_MAX);
+        }
+        if (de->uncomp_size < ZIP_UINT32_MAX) {
+           _zip_buffer_put_32(buffer, (zip_uint32_t)de->uncomp_size);
+        }
+        else {
+           _zip_buffer_put_32(buffer, ZIP_UINT32_MAX);
+        }
+    }
 
-    if (!localp) {
-       if (zde->comment_len)
-           fwrite(zde->comment, 1, zde->comment_len, fp);
+    _zip_buffer_put_16(buffer, _zip_string_length(de->filename));
+    /* TODO: check for overflow */
+    zip_uint32_t ef_total_size = (zip_uint32_t)_zip_ef_size(de->extra_fields, flags) + (zip_uint32_t)_zip_ef_size(ef, ZIP_EF_BOTH);
+    _zip_buffer_put_16(buffer, (zip_uint16_t)ef_total_size);
+    
+    if ((flags & ZIP_FL_LOCAL) == 0) {
+       _zip_buffer_put_16(buffer, _zip_string_length(de->comment));
+       _zip_buffer_put_16(buffer, (zip_uint16_t)de->disk_number);
+       _zip_buffer_put_16(buffer, de->int_attrib);
+       _zip_buffer_put_32(buffer, de->ext_attrib);
+       if (de->offset < ZIP_UINT32_MAX)
+           _zip_buffer_put_32(buffer, (zip_uint32_t)de->offset);
+       else
+           _zip_buffer_put_32(buffer, ZIP_UINT32_MAX);
+    }
+    
+    if (!_zip_buffer_ok(buffer)) {
+        zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+        _zip_buffer_free(buffer);
+        _zip_ef_free(ef);
+        return -1;
     }
 
-    if (ferror(fp)) {
-       _zip_error_set(error, ZIP_ER_WRITE, errno);
-       return -1;
+    if (_zip_write(za, buf, _zip_buffer_offset(buffer)) < 0) {
+        _zip_buffer_free(buffer);
+        _zip_ef_free(ef);
+        return -1;
+    }
+    
+    _zip_buffer_free(buffer);
+
+    if (de->filename) {
+       if (_zip_string_write(za, de->filename) < 0) {
+            _zip_ef_free(ef);
+           return -1;
+       }
+    }
+
+    if (ef) {
+       if (_zip_ef_write(za, ef, ZIP_EF_BOTH) < 0) {
+            _zip_ef_free(ef);
+           return -1;
+       }
+    }
+    _zip_ef_free(ef);
+    if (de->extra_fields) {
+       if (_zip_ef_write(za, de->extra_fields, flags) < 0) {
+           return -1;
+       }
+    }
+
+    if ((flags & ZIP_FL_LOCAL) == 0) {
+       if (de->comment) {
+           if (_zip_string_write(za, de->comment) < 0) {
+               return -1;
+           }
+       }
     }
 
-    return 0;
+
+    return is_zip64;
 }
 
-\f
 
 static time_t
-_zip_d2u_time(int dtime, int ddate)
+_zip_d2u_time(zip_uint16_t dtime, zip_uint16_t ddate)
 {
     struct tm tm;
 
@@ -490,125 +823,81 @@ _zip_d2u_time(int dtime, int ddate)
     return mktime(&tm);
 }
 
-\f
-
-unsigned short
-_zip_read2(unsigned char **a)
-{
-    unsigned short ret;
-
-    ret = (*a)[0]+((*a)[1]<<8);
-    *a += 2;
-
-    return ret;
-}
-
-\f
 
-unsigned int
-_zip_read4(unsigned char **a)
+static zip_extra_field_t *
+_zip_ef_utf8(zip_uint16_t id, zip_string_t *str, zip_error_t *error)
 {
-    unsigned int ret;
-
-    ret = ((((((*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0];
-    *a += 4;
-
-    return ret;
-}
+    const zip_uint8_t *raw;
+    zip_uint32_t len;
+    zip_buffer_t *buffer;
+    zip_extra_field_t *ef;
 
-\f
+    raw = _zip_string_get(str, &len, ZIP_FL_ENC_RAW, NULL);
 
-static char *
-_zip_readfpstr(FILE *fp, unsigned int len, int nulp, struct zip_error *error)
-{
-    char *r, *o;
-
-    r = (char *)malloc(nulp ? len+1 : len);
-    if (!r) {
-       _zip_error_set(error, ZIP_ER_MEMORY, 0);
-       return NULL;
+    if (len+5 > ZIP_UINT16_MAX) {
+        zip_error_set(error, ZIP_ER_INVAL, 0); /* TODO: better error code? */
+        return NULL;
     }
-
-    if (fread(r, 1, len, fp)<len) {
-       free(r);
-       _zip_error_set(error, ZIP_ER_READ, errno);
+    
+    if ((buffer = _zip_buffer_new(NULL, len+5)) == NULL) {
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
        return NULL;
     }
 
-    if (nulp) {
-       /* replace any in-string NUL characters with spaces */
-       r[len] = 0;
-       for (o=r; o<r+len; o++)
-           if (*o == '\0')
-               *o = ' ';
+    _zip_buffer_put_8(buffer, 1);
+    _zip_buffer_put_32(buffer, _zip_string_crc32(str));
+    _zip_buffer_put(buffer, raw, len);
+
+    if (!_zip_buffer_ok(buffer)) {
+        zip_error_set(error, ZIP_ER_INTERNAL, 0);
+        _zip_buffer_free(buffer);
+        return NULL;
     }
     
-    return r;
+    ef = _zip_ef_new(id, (zip_uint16_t)(_zip_buffer_offset(buffer)), _zip_buffer_data(buffer), ZIP_EF_BOTH);
+    _zip_buffer_free(buffer);
+
+    return ef;
 }
 
-\f
 
-static char *
-_zip_readstr(unsigned char **buf, int len, int nulp, struct zip_error *error)
+zip_dirent_t *
+_zip_get_dirent(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_error_t *error)
 {
-    char *r, *o;
+    if (error == NULL)
+       error = &za->error;
 
-    r = (char *)malloc(nulp ? len+1 : len);
-    if (!r) {
-       _zip_error_set(error, ZIP_ER_MEMORY, 0);
+    if (idx >= za->nentry) {
+       zip_error_set(error, ZIP_ER_INVAL, 0);
        return NULL;
     }
-    
-    memcpy(r, *buf, len);
-    *buf += len;
 
-    if (nulp) {
-       /* replace any in-string NUL characters with spaces */
-       r[len] = 0;
-       for (o=r; o<r+len; o++)
-           if (*o == '\0')
-               *o = ' ';
+    if ((flags & ZIP_FL_UNCHANGED) || za->entry[idx].changes == NULL) {
+       if (za->entry[idx].orig == NULL) {
+           zip_error_set(error, ZIP_ER_INVAL, 0);
+           return NULL;
+       }
+       if (za->entry[idx].deleted && (flags & ZIP_FL_UNCHANGED) == 0) {
+           zip_error_set(error, ZIP_ER_DELETED, 0);
+           return NULL;
+       }
+       return za->entry[idx].orig;
     }
-
-    return r;
-}
-
-\f
-
-static void
-_zip_write2(unsigned short i, FILE *fp)
-{
-    putc(i&0xff, fp);
-    putc((i>>8)&0xff, fp);
-
-    return;
+    else
+       return za->entry[idx].changes;
 }
 
-\f
 
-static void
-_zip_write4(unsigned int i, FILE *fp)
-{
-    putc(i&0xff, fp);
-    putc((i>>8)&0xff, fp);
-    putc((i>>16)&0xff, fp);
-    putc((i>>24)&0xff, fp);
-    
-    return;
-}
 
-\f
 
 void
-_zip_u2d_time(time_t time, unsigned short *dtime, unsigned short *ddate)
+_zip_u2d_time(time_t intime, zip_uint16_t *dtime, zip_uint16_t *ddate)
 {
     struct tm *tm;
 
-    tm = localtime(&time);
-    *ddate = ((tm->tm_year+1900-1980)<<9) + ((tm->tm_mon+1)<<5)
-       + tm->tm_mday;
-    *dtime = ((tm->tm_hour)<<11) + ((tm->tm_min)<<5)
-       + ((tm->tm_sec)>>1);
+    tm = localtime(&intime);
+    *ddate = (zip_uint16_t)(((tm->tm_year+1900-1980)<<9) + ((tm->tm_mon+1)<<5) + tm->tm_mday);
+    *dtime = (zip_uint16_t)(((tm->tm_hour)<<11) + ((tm->tm_min)<<5) + ((tm->tm_sec)>>1));
 
     return;
 }
similarity index 77%
rename from lib/zip_free.c
rename to lib/zip_discard.c
index 9932c14..db22370 100644 (file)
@@ -1,6 +1,6 @@
 /*
-  zip_free.c -- free struct zip
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  zip_discard.c -- discard and free struct zip
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
-/* _zip_free:
+/* zip_discard:
    frees the space allocated to a zipfile struct, and closes the
    corresponding file. */
 
 void
-_zip_free(struct zip *za)
+zip_discard(zip_t *za)
 {
-    int i;
+    zip_uint64_t i;
 
     if (za == NULL)
        return;
 
-    if (za->zn)
-       free(za->zn);
-
-    if (za->zp)
-       fclose(za->zp);
+    if (za->src) {
+       zip_source_close(za->src);
+       zip_source_free(za->src);
+    }
 
     free(za->default_password);
-    _zip_cdir_free(za->cdir);
-    free(za->ch_comment);
+    _zip_string_free(za->comment_orig);
+    _zip_string_free(za->comment_changes);
 
     if (za->entry) {
-       for (i=0; i<za->nentry; i++) {
-           _zip_entry_free(za->entry+i);
-       }
+       for (i=0; i<za->nentry; i++)
+           _zip_entry_finalize(za->entry+i);
        free(za->entry);
     }
 
-    for (i=0; i<za->nfile; i++) {
-       if (za->file[i]->error.zip_err == ZIP_ER_OK) {
-           _zip_error_set(&za->file[i]->error, ZIP_ER_ZIPCLOSED, 0);
-           za->file[i]->za = NULL;
-       }
+    for (i=0; i<za->nopen_source; i++) {
+       _zip_source_invalidate(za->open_source[i]);
     }
+    free(za->open_source);
 
-    free(za->file);
+    zip_error_fini(&za->error);
     
     free(za);
 
similarity index 79%
rename from lib/zip_entry_free.c
rename to lib/zip_entry.c
index e8a7770..6f89006 100644 (file)
@@ -1,6 +1,6 @@
 /*
-  zip_entry_free.c -- free struct zip_entry
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  zip_entry.c -- struct zip_entry helper functions
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
-
-#include <stdlib.h>
 
 #include "zipint.h"
 
-\f
-
 void
-_zip_entry_free(struct zip_entry *ze)
+_zip_entry_finalize(zip_entry_t *e)
 {
-    free(ze->ch_filename);
-    ze->ch_filename = NULL;
-    free(ze->ch_extra);
-    ze->ch_extra = NULL;
-    ze->ch_extra_len = -1;
-    free(ze->ch_comment);
-    ze->ch_comment = NULL;
-    ze->ch_comment_len = -1;
+    _zip_unchange_data(e);
+    _zip_dirent_free(e->orig);
+    _zip_dirent_free(e->changes);
+}
 
-    _zip_unchange_data(ze);
+
+void
+_zip_entry_init(zip_entry_t *e)
+{
+    e->orig = NULL;
+    e->changes = NULL;
+    e->source = NULL;
+    e->deleted = 0;
 }
index 8fb6003..65698be 100644 (file)
@@ -5,8 +5,6 @@
 
 #include "zipint.h"
 
-\f
-
 const char * const _zip_err_str[] = {
     "No error",
     "Multi-disk zip archives not supported",
@@ -25,7 +23,7 @@ const char * const _zip_err_str[] = {
     "Malloc failure",
     "Entry has been changed",
     "Compression method not supported",
-    "Premature EOF",
+    "Premature end of file",
     "Invalid argument",
     "Not a zip archive",
     "Internal error",
@@ -36,6 +34,9 @@ const char * const _zip_err_str[] = {
     "Read-only archive", 
     "No password provided",
     "Wrong password provided",
+    "Operation not supported",
+    "Resource still in use",
+    "Tell error",
 };
 
 const int _zip_nerr_str = sizeof(_zip_err_str)/sizeof(_zip_err_str[0]);
@@ -73,4 +74,7 @@ const int _zip_err_type[] = {
     N, 
     N,
     N,
+    N,
+    N,
+    S,
 };
index b8d907a..a21a00b 100644 (file)
@@ -1,6 +1,6 @@
 /*
-  zip_error.c -- struct zip_error helper functions
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  zip_error.c -- zip_error_t helper functions
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
-
+#include <errno.h>
 #include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
-void
-_zip_error_clear(struct zip_error *err)
+ZIP_EXTERN int
+zip_error_code_system(const zip_error_t *error) {
+    return error->sys_err;
+}
+
+
+ZIP_EXTERN int
+zip_error_code_zip(const zip_error_t *error) {
+    return error->zip_err;
+}
+
+
+ZIP_EXTERN void
+zip_error_fini(zip_error_t *err)
+{
+    free(err->str);
+    err->str = NULL;
+}
+
+
+ZIP_EXTERN void
+zip_error_init(zip_error_t *err)
 {
     err->zip_err = ZIP_ER_OK;
     err->sys_err = 0;
+    err->str = NULL;
+}
+
+ZIP_EXTERN void
+zip_error_init_with_code(zip_error_t *error, int ze)
+{
+    zip_error_init(error);
+    error->zip_err = ze;
+    switch (zip_error_system_type(error)) {
+    case ZIP_ET_SYS:
+       error->sys_err = errno;
+       break;
+
+    default:
+       error->sys_err = 0;
+       break;
+    }  
+}
+
+
+ZIP_EXTERN int
+zip_error_system_type(const zip_error_t *error) {
+    if (error->zip_err < 0 || error->zip_err >= _zip_nerr_str)
+        return ZIP_ET_NONE;
+    
+    return _zip_err_type[error->zip_err];
 }
 
-\f
 
 void
-_zip_error_copy(struct zip_error *dst, struct zip_error *src)
+_zip_error_clear(zip_error_t *err)
 {
-    dst->zip_err = src->zip_err;
-    dst->sys_err = src->sys_err;
+    if (err == NULL)
+       return;
+
+    err->zip_err = ZIP_ER_OK;
+    err->sys_err = 0;
 }
 
-\f
 
 void
-_zip_error_fini(struct zip_error *err)
+_zip_error_copy(zip_error_t *dst, const zip_error_t *src)
 {
-    free(err->str);
-    err->str = NULL;
+    dst->zip_err = src->zip_err;
+    dst->sys_err = src->sys_err;
 }
 
-\f
 
 void
-_zip_error_get(struct zip_error *err, int *zep, int *sep)
+_zip_error_get(const zip_error_t *err, int *zep, int *sep)
 {
     if (zep)
        *zep = err->zip_err;
     if (sep) {
-       if (zip_error_get_sys_type(err->zip_err) != ZIP_ET_NONE)
+       if (zip_error_system_type(err) != ZIP_ET_NONE)
            *sep = err->sys_err;
        else
            *sep = 0;
     }
 }
 
-\f
-
-void
-_zip_error_init(struct zip_error *err)
-{
-    err->zip_err = ZIP_ER_OK;
-    err->sys_err = 0;
-    err->str = NULL;
-}
-
-\f
 
 void
-_zip_error_set(struct zip_error *err, int ze, int se)
+zip_error_set(zip_error_t *err, int ze, int se)
 {
     if (err) {
        err->zip_err = ze;
@@ -100,13 +133,24 @@ _zip_error_set(struct zip_error *err, int ze, int se)
     }
 }
 
-\f
 
 void
-_zip_error_set_from_source(struct zip_error *err, struct zip_source *src)
+_zip_error_set_from_source(zip_error_t *err, zip_source_t *src)
 {
-    int ze, se;
+    _zip_error_copy(err, zip_source_error(src));
+}
+
+
+zip_int64_t
+zip_error_to_data(const zip_error_t *error, void *data, zip_uint64_t length)
+{
+    int *e = (int *)data;
+    
+    if (length < sizeof(int)*2) {
+        return -1;
+    }
     
-    zip_source_error(src, &ze, &se);
-    _zip_error_set(err, ze, se);
+    e[0] = zip_error_code_zip(error);
+    e[1] = zip_error_code_system(error);
+    return sizeof(int)*2;
 }
index 364383e..ec45e68 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_error_clear.c -- clear zip error
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN void
-zip_error_clear(struct zip *za)
+zip_error_clear(zip_t *za)
 {
+    if (za == NULL)
+       return;
+
     _zip_error_clear(&za->error);
 }
index 6d1c958..c222018 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_error_get.c -- get zip error
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
+#define _ZIP_COMPILING_DEPRECATED
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN void
-zip_error_get(struct zip *za, int *zep, int *sep)
+zip_error_get(zip_t *za, int *zep, int *sep)
 {
     _zip_error_get(&za->error, zep, sep);
 }
+
+
+ZIP_EXTERN zip_error_t *
+zip_get_error(zip_t *za)
+{
+    return &za->error;
+}
+
+
+ZIP_EXTERN zip_error_t *
+zip_file_get_error(zip_file_t *f)
+{
+    return &f->error;
+}
index 6c6f380..7e27bbf 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_error_get_sys_type.c -- return type of system error code
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
-
+#define _ZIP_COMPILING_DEPRECATED
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
 zip_error_get_sys_type(int ze)
index 3d0951c..2f124cc 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_error_sterror.c -- get string representation of struct zip_error
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -31,7 +31,6 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <errno.h>
 #include <stdio.h>
 
 #include "zipint.h"
 
-\f
 
-const char *
-_zip_error_strerror(struct zip_error *err)
+ZIP_EXTERN const char *
+zip_error_strerror(zip_error_t *err)
 {
     const char *zs, *ss;
     char buf[128], *s;
 
-    _zip_error_fini(err);
+    zip_error_fini(err);
 
     if (err->zip_err < 0 || err->zip_err >= _zip_nerr_str) {
        sprintf(buf, "Unknown error %d", err->zip_err);
index 11a0cd2..d411925 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_error_to_str.c -- get string representation of zip error code
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
+#define _ZIP_COMPILING_DEPRECATED
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
 zip_error_to_str(char *buf, zip_uint64_t len, int ze, int se)
diff --git a/lib/zip_extra_field.c b/lib/zip_extra_field.c
new file mode 100644 (file)
index 0000000..b2566c6
--- /dev/null
@@ -0,0 +1,421 @@
+/*
+  zip_extra_field.c -- manipulate extra fields
+  Copyright (C) 2012-2015 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "zipint.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+zip_extra_field_t *
+_zip_ef_clone(const zip_extra_field_t *ef, zip_error_t *error)
+{
+    zip_extra_field_t *head, *prev, *def;
+    
+    head = prev = NULL;
+    
+    while (ef) {
+        if ((def=_zip_ef_new(ef->id, ef->size, ef->data, ef->flags)) == NULL) {
+            zip_error_set(error, ZIP_ER_MEMORY, 0);
+            _zip_ef_free(head);
+            return NULL;
+        }
+        
+        if (head == NULL)
+            head = def;
+        if (prev)
+            prev->next = def;
+        prev = def;
+
+       ef = ef->next;
+    }
+    
+    return head;
+}
+
+
+zip_extra_field_t *
+_zip_ef_delete_by_id(zip_extra_field_t *ef, zip_uint16_t id, zip_uint16_t id_idx, zip_flags_t flags)
+{
+    zip_extra_field_t *head, *prev;
+    int i;
+
+    i = 0;
+    head = ef;
+    prev = NULL;
+    for (; ef; ef=(prev ? prev->next : head)) {
+       if ((ef->flags & flags & ZIP_EF_BOTH) && ((ef->id == id) || (id == ZIP_EXTRA_FIELD_ALL))) {
+           if (id_idx == ZIP_EXTRA_FIELD_ALL || i == id_idx) {
+               ef->flags &= ~(flags & ZIP_EF_BOTH);
+               if ((ef->flags & ZIP_EF_BOTH) == 0) {
+                   if (prev)
+                       prev->next = ef->next;
+                   else
+                       head = ef->next;
+                   ef->next = NULL;
+                   _zip_ef_free(ef);
+
+                   if (id_idx == ZIP_EXTRA_FIELD_ALL)
+                       continue;
+               }
+           }
+           
+           i++;
+           if (i > id_idx)
+               break;
+       }
+       prev = ef;
+    }
+
+    return head;
+}
+
+
+
+void
+_zip_ef_free(zip_extra_field_t *ef)
+{
+    zip_extra_field_t *ef2;
+
+    while (ef) {
+       ef2 = ef->next;
+       free(ef->data);
+       free(ef);
+       ef = ef2;
+    }
+}
+
+
+const zip_uint8_t *
+_zip_ef_get_by_id(const zip_extra_field_t *ef, zip_uint16_t *lenp, zip_uint16_t id, zip_uint16_t id_idx, zip_flags_t flags, zip_error_t *error)
+{
+    static const zip_uint8_t empty[1] = { '\0' };
+    
+    int i;
+
+    i = 0;
+    for (; ef; ef=ef->next) {
+       if (ef->id == id && (ef->flags & flags & ZIP_EF_BOTH)) {
+           if (i < id_idx) {
+               i++;
+               continue;
+           }
+
+           if (lenp)
+               *lenp = ef->size;
+           if (ef->size > 0)
+               return ef->data;
+           else
+               return empty;
+       }
+    }
+
+    zip_error_set(error, ZIP_ER_NOENT, 0);
+    return NULL;
+}
+
+
+zip_extra_field_t *
+_zip_ef_merge(zip_extra_field_t *to, zip_extra_field_t *from)
+{
+    zip_extra_field_t *ef2, *tt, *tail;
+    int duplicate;
+
+    if (to == NULL)
+       return from;
+
+    for (tail=to; tail->next; tail=tail->next)
+       ;
+
+    for (; from; from=ef2) {
+       ef2 = from->next;
+
+       duplicate = 0;
+       for (tt=to; tt; tt=tt->next) {
+           if (tt->id == from->id && tt->size == from->size && memcmp(tt->data, from->data, tt->size) == 0) {
+               tt->flags |= (from->flags & ZIP_EF_BOTH);
+               duplicate = 1;
+               break;
+           }
+       }
+
+       from->next = NULL;
+       if (duplicate)
+           _zip_ef_free(from);
+       else
+           tail = tail->next = from;
+    }
+
+    return to;
+}
+
+
+zip_extra_field_t *
+_zip_ef_new(zip_uint16_t id, zip_uint16_t size, const zip_uint8_t *data, zip_flags_t flags)
+{
+    zip_extra_field_t *ef;
+
+    if ((ef=(zip_extra_field_t *)malloc(sizeof(*ef))) == NULL)
+       return NULL;
+
+    ef->next = NULL;
+    ef->flags = flags;
+    ef->id = id;
+    ef->size = size;
+    if (size > 0) {
+       if ((ef->data=(zip_uint8_t *)_zip_memdup(data, size, NULL)) == NULL) {
+           free(ef);
+           return NULL;
+       }
+    }
+    else
+       ef->data = NULL;
+
+    return ef;
+}
+
+
+zip_extra_field_t *
+_zip_ef_parse(const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags, zip_error_t *error)
+{
+    zip_buffer_t *buffer;
+    zip_extra_field_t *ef, *ef2, *ef_head;
+
+    if ((buffer = _zip_buffer_new((zip_uint8_t *)data, len)) == NULL) {
+        zip_error_set(error, ZIP_ER_MEMORY, 0);
+        return NULL;
+    }
+    
+    ef_head = ef = NULL;
+    
+    while (_zip_buffer_ok(buffer) && !_zip_buffer_eof(buffer)) {
+        zip_uint16_t fid, flen;
+        zip_uint8_t *ef_data;
+        
+        fid = _zip_buffer_get_16(buffer);
+       flen = _zip_buffer_get_16(buffer);
+        ef_data = _zip_buffer_get(buffer, flen);
+
+        if (ef_data == NULL) {
+            break;
+        }
+        
+       if ((ef2=_zip_ef_new(fid, flen, ef_data, flags)) == NULL) {
+           zip_error_set(error, ZIP_ER_MEMORY, 0);
+            _zip_buffer_free(buffer);
+           _zip_ef_free(ef_head);
+           return NULL;
+       }
+
+       if (ef_head) {
+           ef->next = ef2;
+           ef = ef2;
+       }
+       else
+           ef_head = ef = ef2;
+    }
+
+    if (!_zip_buffer_eof(buffer)) {
+        zip_error_set(error, ZIP_ER_INCONS, 0);
+        _zip_buffer_free(buffer);
+        _zip_ef_free(ef_head);
+        return NULL;
+    }
+
+    _zip_buffer_free(buffer);
+    
+    return ef_head;
+}
+
+
+zip_extra_field_t *
+_zip_ef_remove_internal(zip_extra_field_t *ef)
+{
+    zip_extra_field_t *ef_head;
+    zip_extra_field_t *prev, *next;
+    
+    ef_head = ef;
+    prev = NULL;
+    
+    while (ef) {
+        if (ZIP_EF_IS_INTERNAL(ef->id)) {
+            next = ef->next;
+            if (ef_head == ef)
+                ef_head = next;
+            ef->next = NULL;
+            _zip_ef_free(ef);
+            if (prev)
+                prev->next = next;
+            ef = next;
+        }
+        else {
+            prev = ef;
+            ef = ef->next;
+        }
+    }
+    
+    return ef_head;
+}
+
+
+zip_uint16_t
+_zip_ef_size(const zip_extra_field_t *ef, zip_flags_t flags)
+{
+    zip_uint16_t size;
+
+    size = 0;
+    for (; ef; ef=ef->next) {
+       if (ef->flags & flags & ZIP_EF_BOTH)
+           size = (zip_uint16_t)(size+4+ef->size);
+    }
+
+    return size;
+}
+
+
+int
+_zip_ef_write(zip_t *za, const zip_extra_field_t *ef, zip_flags_t flags)
+{
+    zip_uint8_t b[4];
+    zip_buffer_t *buffer = _zip_buffer_new(b, sizeof(b));
+
+    if (buffer == NULL) {
+       return -1;
+    }
+
+    for (; ef; ef=ef->next) {
+       if (ef->flags & flags & ZIP_EF_BOTH) {
+            _zip_buffer_set_offset(buffer, 0);
+            _zip_buffer_put_16(buffer, ef->id);
+           _zip_buffer_put_16(buffer, ef->size);
+            if (!_zip_buffer_ok(buffer)) {
+                zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+                _zip_buffer_free(buffer);
+                return -1;
+            }
+           if (_zip_write(za, b, 4) < 0) {
+                _zip_buffer_free(buffer);
+                return -1;
+           }
+           if (ef->size > 0) {
+               if (_zip_write(za, ef->data, ef->size) < 0) {
+                    _zip_buffer_free(buffer);
+                    return -1;
+               }
+           }
+       }
+    }
+    
+    _zip_buffer_free(buffer);
+    return 0;
+}
+
+
+int
+_zip_read_local_ef(zip_t *za, zip_uint64_t idx)
+{
+    zip_entry_t *e;
+    unsigned char b[4];
+    zip_buffer_t *buffer;
+    zip_uint16_t fname_len, ef_len;
+
+    if (idx >= za->nentry) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    e = za->entry+idx;
+
+    if (e->orig == NULL || e->orig->local_extra_fields_read)
+       return 0;
+
+    if (e->orig->offset + 26 > ZIP_INT64_MAX) {
+       zip_error_set(&za->error, ZIP_ER_SEEK, EFBIG);
+       return -1;
+    }  
+
+    if (zip_source_seek(za->src, (zip_int64_t)(e->orig->offset + 26), SEEK_SET) < 0) {
+       _zip_error_set_from_source(&za->error, za->src);
+       return -1;
+    }
+    
+    if ((buffer = _zip_buffer_new_from_source(za->src, sizeof(b), b, &za->error)) == NULL) {
+        return -1;
+    }
+    
+    fname_len = _zip_buffer_get_16(buffer);
+    ef_len = _zip_buffer_get_16(buffer);
+    
+    if (!_zip_buffer_eof(buffer)) {
+        _zip_buffer_free(buffer);
+        zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+        return -1;
+    }
+    
+    _zip_buffer_free(buffer);
+    
+    if (ef_len > 0) {
+       zip_extra_field_t *ef;
+       zip_uint8_t *ef_raw;
+
+       if (zip_source_seek(za->src, fname_len, SEEK_CUR) < 0) {
+           zip_error_set(&za->error, ZIP_ER_SEEK, errno);
+           return -1;
+       }
+
+       ef_raw = _zip_read_data(NULL, za->src, ef_len, 0, &za->error);
+
+       if (ef_raw == NULL)
+           return -1;
+
+       if ((ef=_zip_ef_parse(ef_raw, ef_len, ZIP_EF_LOCAL, &za->error)) == NULL) {
+           free(ef_raw);
+           return -1;
+       }
+       free(ef_raw);
+       
+        ef = _zip_ef_remove_internal(ef);
+       e->orig->extra_fields = _zip_ef_merge(e->orig->extra_fields, ef);
+    }
+
+    e->orig->local_extra_fields_read = 1;
+    
+    if (e->changes && e->changes->local_extra_fields_read == 0) {
+       e->changes->extra_fields = e->orig->extra_fields;
+       e->changes->local_extra_fields_read = 1;
+    }
+
+    return 0;
+}
diff --git a/lib/zip_extra_field_api.c b/lib/zip_extra_field_api.c
new file mode 100644 (file)
index 0000000..ed93944
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+  zip_extra_field_api.c -- public extra fields API functions
+  Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "zipint.h"
+
+
+ZIP_EXTERN int
+zip_file_extra_field_delete(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_flags_t flags)
+{
+    zip_dirent_t *de;
+
+    if ((flags & ZIP_EF_BOTH) == 0) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    if (((flags & ZIP_EF_BOTH) == ZIP_EF_BOTH) && (ef_idx != ZIP_EXTRA_FIELD_ALL)) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+    
+    if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
+       return -1;
+    
+    if (ZIP_IS_RDONLY(za)) {
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+       return -1;
+    }
+
+    if (_zip_file_extra_field_prepare_for_change(za, idx) < 0)
+        return -1;
+    
+    de = za->entry[idx].changes;
+    
+    de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ZIP_EXTRA_FIELD_ALL, ef_idx, flags);
+    return 0;
+}
+
+
+ZIP_EXTERN int
+zip_file_extra_field_delete_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_flags_t flags)
+{
+    zip_dirent_t *de;
+
+    if ((flags & ZIP_EF_BOTH) == 0) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    if (((flags & ZIP_EF_BOTH) == ZIP_EF_BOTH) && (ef_idx != ZIP_EXTRA_FIELD_ALL)) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+    
+    if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
+       return -1;
+
+    if (ZIP_IS_RDONLY(za)) {
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+       return -1;
+    }
+    
+    if (_zip_file_extra_field_prepare_for_change(za, idx) < 0)
+        return -1;
+    
+    de = za->entry[idx].changes;
+
+    de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ef_id, ef_idx, flags);
+    return 0;
+}
+
+
+ZIP_EXTERN const zip_uint8_t *
+zip_file_extra_field_get(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_uint16_t *idp, zip_uint16_t *lenp, zip_flags_t flags)
+{
+    static const zip_uint8_t empty[1] = { '\0' };
+
+    zip_dirent_t *de;
+    zip_extra_field_t *ef;
+    int i;
+
+    if ((flags & ZIP_EF_BOTH) == 0) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return NULL;
+    }
+
+    if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL)
+       return NULL;
+
+    if (flags & ZIP_FL_LOCAL)
+       if (_zip_read_local_ef(za, idx) < 0)
+           return NULL;
+
+    i = 0;
+    for (ef=de->extra_fields; ef; ef=ef->next) {
+       if (ef->flags & flags & ZIP_EF_BOTH) {
+           if (i < ef_idx) {
+               i++;
+               continue;
+           }
+
+           if (idp)
+               *idp = ef->id;
+           if (lenp)
+               *lenp = ef->size;
+           if (ef->size > 0)
+               return ef->data;
+           else
+               return empty;
+       }
+    }
+
+    zip_error_set(&za->error, ZIP_ER_NOENT, 0);
+    return NULL;
+
+}
+
+
+ZIP_EXTERN const zip_uint8_t *
+zip_file_extra_field_get_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_uint16_t *lenp, zip_flags_t flags)
+{
+    zip_dirent_t *de;
+
+    if ((flags & ZIP_EF_BOTH) == 0) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return NULL;
+    }
+
+    if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL)
+       return NULL;
+
+    if (flags & ZIP_FL_LOCAL)
+       if (_zip_read_local_ef(za, idx) < 0)
+           return NULL;
+
+    return _zip_ef_get_by_id(de->extra_fields, lenp, ef_id, ef_idx, flags, &za->error);
+}
+
+
+ZIP_EXTERN zip_int16_t
+zip_file_extra_fields_count(zip_t *za, zip_uint64_t idx, zip_flags_t flags)
+{
+    zip_dirent_t *de;
+    zip_extra_field_t *ef;
+    zip_uint16_t n;
+
+    if ((flags & ZIP_EF_BOTH) == 0) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL)
+       return -1;
+
+    if (flags & ZIP_FL_LOCAL)
+       if (_zip_read_local_ef(za, idx) < 0)
+           return -1;
+
+    n = 0;
+    for (ef=de->extra_fields; ef; ef=ef->next)
+       if (ef->flags & flags & ZIP_EF_BOTH)
+           n++;
+
+    return (zip_int16_t)n;
+}
+
+
+ZIP_EXTERN zip_int16_t
+zip_file_extra_fields_count_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_flags_t flags)
+{
+    zip_dirent_t *de;
+    zip_extra_field_t *ef;
+    zip_uint16_t n;
+
+    if ((flags & ZIP_EF_BOTH) == 0) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL)
+       return -1;
+
+    if (flags & ZIP_FL_LOCAL)
+       if (_zip_read_local_ef(za, idx) < 0)
+           return -1;
+
+    n = 0;
+    for (ef=de->extra_fields; ef; ef=ef->next)
+       if (ef->id == ef_id && (ef->flags & flags & ZIP_EF_BOTH))
+           n++;
+
+    return (zip_int16_t)n;
+}
+
+
+ZIP_EXTERN int
+zip_file_extra_field_set(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags)
+{
+    zip_dirent_t *de;
+    zip_uint16_t ls, cs;
+    zip_extra_field_t *ef, *ef_prev, *ef_new;
+    int i, found, new_len;
+
+    if ((flags & ZIP_EF_BOTH) == 0) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
+       return -1;
+    
+    if (ZIP_IS_RDONLY(za)) {
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+       return -1;
+    }
+    
+    if (ZIP_EF_IS_INTERNAL(ef_id)) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    if (_zip_file_extra_field_prepare_for_change(za, idx) < 0)
+        return -1;
+    
+    de = za->entry[idx].changes;
+
+    ef = de->extra_fields;
+    ef_prev = NULL;
+    i = 0;
+    found = 0;
+
+    for (; ef; ef=ef->next) {
+       if (ef->id == ef_id && (ef->flags & flags & ZIP_EF_BOTH)) {
+           if (i == ef_idx) {
+               found = 1;
+               break;
+           }
+           i++;
+       }
+       ef_prev = ef;
+    }
+
+    if (i < ef_idx && ef_idx != ZIP_EXTRA_FIELD_NEW) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    if (flags & ZIP_EF_LOCAL)
+       ls = _zip_ef_size(de->extra_fields, ZIP_EF_LOCAL);
+    else
+       ls = 0;
+    if (flags & ZIP_EF_CENTRAL)
+       cs = _zip_ef_size(de->extra_fields, ZIP_EF_CENTRAL);
+    else
+       cs = 0;
+
+    new_len = ls > cs ? ls : cs;
+    if (found)
+       new_len -= ef->size + 4;
+    new_len += len + 4;
+
+    if (new_len > ZIP_UINT16_MAX) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+    
+    if ((ef_new=_zip_ef_new(ef_id, len, data, flags)) == NULL) {
+       zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+       return -1;
+    }
+
+    if (found) {
+       if ((ef->flags & ZIP_EF_BOTH) == (flags & ZIP_EF_BOTH)) {
+           ef_new->next = ef->next;
+           ef->next = NULL;
+           _zip_ef_free(ef);
+           if (ef_prev)
+               ef_prev->next = ef_new;
+           else
+               de->extra_fields = ef_new;
+       }
+       else {
+           ef->flags &= ~(flags & ZIP_EF_BOTH);
+           ef_new->next = ef->next;
+           ef->next = ef_new;
+       }           
+    }
+    else if (ef_prev) {
+       ef_new->next = ef_prev->next;
+       ef_prev->next = ef_new;
+    }
+    else
+       de->extra_fields = ef_new;
+    
+    return 0;
+}
+
+
+
+int
+_zip_file_extra_field_prepare_for_change(zip_t *za, zip_uint64_t idx)
+{
+    zip_entry_t *e;
+    
+    if (idx >= za->nentry) {
+        zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+        return -1;
+    }
+    
+    e = za->entry+idx;
+    
+    if (e->changes && (e->changes->changed & ZIP_DIRENT_EXTRA_FIELD))
+        return 0;
+
+    if (e->orig) {
+       if (_zip_read_local_ef(za, idx) < 0)
+           return -1;
+    }
+    
+    if (e->changes == NULL) {
+        if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) {
+            zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+            return -1;
+        }
+    }
+    
+    if (e->orig && e->orig->extra_fields) {
+       if ((e->changes->extra_fields=_zip_ef_clone(e->orig->extra_fields, &za->error)) == NULL)
+           return -1;
+    }
+    e->changes->changed |= ZIP_DIRENT_EXTRA_FIELD;
+    
+    return 0;
+}
+
index 8a15feb..25a201b 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_fclose.c -- close file in zip archive
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_fclose(struct zip_file *zf)
+zip_fclose(zip_file_t *zf)
 {
-    int i, ret;
+    int ret;
     
     if (zf->src)
        zip_source_free(zf->src);
 
-    for (i=0; i<zf->za->nfile; i++) {
-       if (zf->za->file[i] == zf) {
-           zf->za->file[i] = zf->za->file[zf->za->nfile-1];
-           zf->za->nfile--;
-           break;
-       }
-    }
-
     ret = 0;
     if (zf->error.zip_err)
        ret = zf->error.zip_err;
 
+    zip_error_fini(&zf->error);
     free(zf);
     return ret;
 }
index fec9d0c..c5b5531 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_fdopen.c -- open read-only archive from file descriptor
-  Copyright (C) 2009-2010 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN struct zip *
-zip_fdopen(int fd_orig, int flags, int *zep)
+ZIP_EXTERN zip_t *
+zip_fdopen(int fd_orig, int _flags, int *zep)
 {
     int fd;
     FILE *fp;
+    zip_t *za;
+    zip_source_t *src;
+    struct zip_error error;
 
+    if (_flags < 0 || (_flags & ZIP_TRUNCATE)) {
+       _zip_set_open_error(zep, NULL, ZIP_ER_INVAL);
+        return  NULL;
+    }
+        
     /* We dup() here to avoid messing with the passed in fd.
        We could not restore it to the original state in case of error. */
 
     if ((fd=dup(fd_orig)) < 0) {
-       *zep = ZIP_ER_OPEN;
+       _zip_set_open_error(zep, NULL, ZIP_ER_OPEN);
        return NULL;
     }
 
     if ((fp=fdopen(fd, "rb")) == NULL) {
        close(fd);
-       *zep = ZIP_ER_OPEN;
+       _zip_set_open_error(zep, NULL, ZIP_ER_OPEN);
+       return NULL;
+    }
+
+    zip_error_init(&error);
+    if ((src = zip_source_filep_create(fp, 0, -1, &error)) == NULL) {
+       _zip_set_open_error(zep, &error, 0);
+       zip_error_fini(&error);
+       return NULL;
+    }
+
+    if ((za = zip_open_from_source(src, _flags, &error)) == NULL) {
+       _zip_set_open_error(zep, &error, 0);
+       zip_error_fini(&error);
        return NULL;
     }
 
+    zip_error_fini(&error);
     close(fd_orig);
-    return _zip_open(NULL, fp, flags, ZIP_AFL_RDONLY, zep);
+    return za;
 }
diff --git a/lib/zip_file_add.c b/lib/zip_file_add.c
new file mode 100644 (file)
index 0000000..9944c0f
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+  zip_file_add.c -- add file via callback function
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "zipint.h"
+
+/*
+  NOTE: Return type is signed so we can return -1 on error.
+        The index can not be larger than ZIP_INT64_MAX since the size
+        of the central directory cannot be larger than
+        ZIP_UINT64_MAX, and each entry is larger than 2 bytes.
+*/
+
+ZIP_EXTERN zip_int64_t
+zip_file_add(zip_t *za, const char *name, zip_source_t *source, zip_flags_t flags)
+{
+    if (name == NULL || source == NULL) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+       
+    return _zip_file_replace(za, ZIP_UINT64_MAX, name, source, flags);
+}
index ef6fa10..be45498 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_file_error_clear.c -- clear zip file error
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN void
-zip_file_error_clear(struct zip_file *zf)
+zip_file_error_clear(zip_file_t *zf)
 {
+    if (zf == NULL)
+       return;
+
     _zip_error_clear(&zf->error);
 }
index f20e011..be764fd 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_file_error_get.c -- get zip file error
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
-
+#define _ZIP_COMPILING_DEPRECATED
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN void
-zip_file_error_get(struct zip_file *zf, int *zep, int *sep)
+zip_file_error_get(zip_file_t *zf, int *zep, int *sep)
 {
     _zip_error_get(&zf->error, zep, sep);
 }
similarity index 74%
rename from lib/zip_get_file_extra.c
rename to lib/zip_file_get_comment.c
index afa507b..55e7dc2 100644 (file)
@@ -1,6 +1,6 @@
 /*
-  zip_get_file_extra.c -- get file extra field
-  Copyright (C) 2006-2010 Dieter Baron and Thomas Klausner
+  zip_file_get_comment.c -- get file comment
+  Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -17,7 +17,7 @@
   3. The names of the authors may not be used to endorse or promote
      products derived from this software without specific prior
      written permission.
-
   THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 */
 
 
-
 #include "zipint.h"
 
-
+/* lenp is 32 bit because converted comment can be longer than ZIP_UINT16_MAX */
 
 ZIP_EXTERN const char *
-zip_get_file_extra(struct zip *za, zip_uint64_t idx, int *lenp, int flags)
+zip_file_get_comment(zip_t *za, zip_uint64_t idx, zip_uint32_t *lenp, zip_flags_t flags)
 {
-    if (idx >= za->nentry) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+    zip_dirent_t *de;
+    zip_uint32_t len;
+    const zip_uint8_t *str;
+
+    if ((de=_zip_get_dirent(za, idx, flags, NULL)) == NULL)
        return NULL;
-    }
-
-    if ((flags & ZIP_FL_UNCHANGED)
-       || (za->entry[idx].ch_extra_len == -1)) {
-       if (lenp != NULL)
-           *lenp = za->cdir->entry[idx].extrafield_len;
-       return za->cdir->entry[idx].extrafield;
-    }
-
-    if (lenp != NULL)
-       *lenp = za->entry[idx].ch_extra_len;
-    return za->entry[idx].ch_extra;
+
+    if ((str=_zip_string_get(de->comment, &len, flags, &za->error)) == NULL)
+       return NULL;
+
+    if (lenp)
+       *lenp = len;
+
+    return (const char *)str;
 }
diff --git a/lib/zip_file_get_external_attributes.c b/lib/zip_file_get_external_attributes.c
new file mode 100644 (file)
index 0000000..b6526cf
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+  zip_file_get_external_attributes.c -- get opsys/external attributes
+  Copyright (C) 2013-2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "zipint.h"
+
+int
+zip_file_get_external_attributes(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_uint8_t *opsys, zip_uint32_t *attributes)
+{
+    zip_dirent_t *de;
+
+    if ((de=_zip_get_dirent(za, idx, flags, NULL)) == NULL)
+       return -1;
+
+    if (opsys)
+       *opsys = (zip_uint8_t)((de->version_madeby >> 8) & 0xff);
+
+    if (attributes)
+       *attributes = de->ext_attrib;
+
+    return 0;
+}
index b96fd5e..1aaca71 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_file_get_offset.c -- get offset of file data in archive.
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -31,7 +31,6 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -42,7 +41,6 @@
 
 #include "zipint.h"
 
-\f
 
 /* _zip_file_get_offset(za, ze):
    Returns the offset of the file data for entry ze.
    On error, fills in za->error and returns 0.
 */
 
-unsigned int
-_zip_file_get_offset(struct zip *za, int idx)
+zip_uint64_t
+_zip_file_get_offset(const zip_t *za, zip_uint64_t idx, zip_error_t *error)
 {
-    struct zip_dirent de;
-    unsigned int offset;
+    zip_uint64_t offset;
+    zip_int32_t size;
 
-    offset = za->cdir->entry[idx].offset;
+    offset = za->entry[idx].orig->offset;
 
-    if (fseeko(za->zp, offset, SEEK_SET) != 0) {
-       _zip_error_set(&za->error, ZIP_ER_SEEK, errno);
+    if (zip_source_seek(za->src, (zip_int64_t)offset, SEEK_SET) < 0) {
+       _zip_error_set_from_source(error, za->src);
        return 0;
     }
 
-    if (_zip_dirent_read(&de, za->zp, NULL, NULL, 1, &za->error) != 0)
+    /* TODO: cache? */
+    if ((size=_zip_dirent_size(za->src, ZIP_EF_LOCAL, error)) < 0)
        return 0;
 
-    offset += LENTRYSIZE + de.filename_len + de.extrafield_len;
-
-    _zip_dirent_finalize(&de);
-
-    return offset;
+    if (offset+(zip_uint32_t)size > ZIP_INT64_MAX) {
+        zip_error_set(error, ZIP_ER_SEEK, EFBIG);
+        return 0;
+    }
+    
+    return offset + (zip_uint32_t)size;
 }
diff --git a/lib/zip_file_rename.c b/lib/zip_file_rename.c
new file mode 100644 (file)
index 0000000..4400938
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+  zip_file_rename.c -- rename file in zip archive
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <string.h>
+
+#include "zipint.h"
+
+
+ZIP_EXTERN int
+zip_file_rename(zip_t *za, zip_uint64_t idx, const char *name, zip_flags_t flags)
+{
+    const char *old_name;
+    int old_is_dir, new_is_dir;
+    
+    if (idx >= za->nentry || (name != NULL && strlen(name) > ZIP_UINT16_MAX)) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    if (ZIP_IS_RDONLY(za)) {
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+       return -1;
+    }
+
+    if ((old_name=zip_get_name(za, idx, 0)) == NULL)
+       return -1;
+                                                                   
+    new_is_dir = (name != NULL && name[strlen(name)-1] == '/');
+    old_is_dir = (old_name[strlen(old_name)-1] == '/');
+
+    if (new_is_dir != old_is_dir) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    return _zip_set_name(za, idx, name, flags);
+}
diff --git a/lib/zip_file_replace.c b/lib/zip_file_replace.c
new file mode 100644 (file)
index 0000000..e430efa
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+  zip_file_replace.c -- replace file via callback function
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "zipint.h"
+
+
+ZIP_EXTERN int
+zip_file_replace(zip_t *za, zip_uint64_t idx, zip_source_t *source, zip_flags_t flags)
+{
+    if (idx >= za->nentry || source == NULL) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    if (_zip_file_replace(za, idx, NULL, source, flags) == -1)
+       return -1;
+
+    return 0;
+}
+
+
+
+/* NOTE: Signed due to -1 on error.  See zip_add.c for more details. */
+
+zip_int64_t
+_zip_file_replace(zip_t *za, zip_uint64_t idx, const char *name, zip_source_t *source, zip_flags_t flags)
+{
+    zip_uint64_t za_nentry_prev;
+    
+    if (ZIP_IS_RDONLY(za)) {
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+       return -1;
+    }
+
+    za_nentry_prev = za->nentry;
+    if (idx == ZIP_UINT64_MAX) {
+       zip_int64_t i = -1;
+       
+       if (flags & ZIP_FL_OVERWRITE)
+           i = _zip_name_locate(za, name, flags, NULL);
+
+       if (i == -1) {
+           /* create and use new entry, used by zip_add */
+           if ((i=_zip_add_entry(za)) < 0)
+               return -1;
+       }
+       idx = (zip_uint64_t)i;
+    }
+    
+    if (name && _zip_set_name(za, idx, name, flags) != 0) {
+       if (za->nentry != za_nentry_prev) {
+           _zip_entry_finalize(za->entry+idx);
+           za->nentry = za_nentry_prev;
+       }
+       return -1;
+    }
+
+    /* does not change any name related data, so we can do it here;
+     * needed for a double add of the same file name */
+    _zip_unchange_data(za->entry+idx);
+
+    if (za->entry[idx].orig != NULL && (za->entry[idx].changes == NULL || (za->entry[idx].changes->changed & ZIP_DIRENT_COMP_METHOD) == 0)) {
+        if (za->entry[idx].changes == NULL) {
+            if ((za->entry[idx].changes=_zip_dirent_clone(za->entry[idx].orig)) == NULL) {
+                zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+                return -1;
+            }
+        }
+
+        za->entry[idx].changes->comp_method = ZIP_CM_REPLACED_DEFAULT;
+        za->entry[idx].changes->changed |= ZIP_DIRENT_COMP_METHOD;
+    }
+       
+    za->entry[idx].source = source;
+
+    return (zip_int64_t)idx;
+}
diff --git a/lib/zip_file_set_comment.c b/lib/zip_file_set_comment.c
new file mode 100644 (file)
index 0000000..e455fbd
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+  zip_file_set_comment.c -- set comment for file in archive
+  Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <stdlib.h>
+
+#include "zipint.h"
+
+
+ZIP_EXTERN int
+zip_file_set_comment(zip_t *za, zip_uint64_t idx,
+                    const char *comment, zip_uint16_t len, zip_flags_t flags)
+{
+    zip_entry_t *e;
+    zip_string_t *cstr;
+    int changed;
+
+    if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
+       return -1;
+
+    if (ZIP_IS_RDONLY(za)) {
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+       return -1;
+    }
+
+    if (len > 0 && comment == NULL) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    if (len > 0) {
+       if ((cstr=_zip_string_new((const zip_uint8_t *)comment, len, flags, &za->error)) == NULL)
+           return -1;
+       if ((flags & ZIP_FL_ENCODING_ALL) == ZIP_FL_ENC_GUESS && _zip_guess_encoding(cstr, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_UTF8_GUESSED)
+           cstr->encoding = ZIP_ENCODING_UTF8_KNOWN;
+    }
+    else
+       cstr = NULL;
+
+    e = za->entry+idx;
+
+    if (e->changes) {
+       _zip_string_free(e->changes->comment);
+       e->changes->comment = NULL;
+       e->changes->changed &= ~ZIP_DIRENT_COMMENT;
+    }
+
+    if (e->orig && e->orig->comment)
+       changed = !_zip_string_equal(e->orig->comment, cstr);
+    else
+       changed = (cstr != NULL);
+       
+    if (changed) {
+        if (e->changes == NULL) {
+            if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) {
+                zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+               _zip_string_free(cstr);
+                return -1;
+            }
+        }
+        e->changes->comment = cstr;
+        e->changes->changed |= ZIP_DIRENT_COMMENT;
+    }
+    else {
+       _zip_string_free(cstr);
+       if (e->changes && e->changes->changed == 0) {
+           _zip_dirent_free(e->changes);
+           e->changes = NULL;
+       }
+    }
+
+    return 0;
+}
diff --git a/lib/zip_file_set_external_attributes.c b/lib/zip_file_set_external_attributes.c
new file mode 100644 (file)
index 0000000..b772c31
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+  zip_file_set_external_attributes.c -- set external attributes for entry
+  Copyright (C) 2013-2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "zipint.h"
+
+ZIP_EXTERN int
+zip_file_set_external_attributes(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_uint8_t opsys, zip_uint32_t attributes)
+{
+    zip_entry_t *e;
+    int changed;
+    zip_uint8_t unchanged_opsys;
+    zip_uint32_t unchanged_attributes;
+
+    if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
+       return -1;
+
+    if (ZIP_IS_RDONLY(za)) {
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+       return -1;
+    }
+
+    e = za->entry+idx;
+
+    unchanged_opsys = (e->orig ? (zip_uint8_t)(e->orig->version_madeby>>8) : (zip_uint8_t)ZIP_OPSYS_DEFAULT);
+    unchanged_attributes = e->orig ? e->orig->ext_attrib : ZIP_EXT_ATTRIB_DEFAULT;
+
+    changed = (opsys != unchanged_opsys || attributes != unchanged_attributes);
+
+    if (changed) {
+        if (e->changes == NULL) {
+            if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) {
+                zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+                return -1;
+            }
+        }
+        e->changes->version_madeby = (zip_uint16_t)((opsys << 8) | (e->changes->version_madeby & 0xff));
+       e->changes->ext_attrib = attributes;
+        e->changes->changed |= ZIP_DIRENT_ATTRIBUTES;
+    }
+    else if (e->changes) {
+       e->changes->changed &= ~ZIP_DIRENT_ATTRIBUTES;
+       if (e->changes->changed == 0) {
+           _zip_dirent_free(e->changes);
+           e->changes = NULL;
+       }
+       else {
+           e->changes->version_madeby = (zip_uint16_t)((unchanged_opsys << 8) | (e->changes->version_madeby & 0xff));
+           e->changes->ext_attrib = unchanged_attributes;
+       }
+    }
+
+    return 0;
+}
diff --git a/lib/zip_file_set_mtime.c b/lib/zip_file_set_mtime.c
new file mode 100644 (file)
index 0000000..0cdd31a
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ zip_file_set_mtime.c -- set modification time of entry.
+ Copyright (C) 2014 Dieter Baron and Thomas Klausner
+ This file is part of libzip, a library to manipulate ZIP archives.
+ The authors can be contacted at <libzip@nih.at>
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 3. The names of the authors may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "zipint.h"
+
+ZIP_EXTERN int zip_file_set_mtime(zip_t *za, zip_uint64_t idx, time_t mtime, zip_flags_t flags)
+{
+    zip_entry_t *e;
+    int changed;
+    
+    if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
+        return -1;
+    
+    if (ZIP_IS_RDONLY(za)) {
+        zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+        return -1;
+    }
+    
+    e = za->entry+idx;
+
+    changed = e->orig == NULL || mtime != e->orig->last_mod;
+    
+    if (changed) {
+        if (e->changes == NULL) {
+            if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) {
+                zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+                return -1;
+            }
+        }
+        e->changes->last_mod = mtime;
+        e->changes->changed |= ZIP_DIRENT_LAST_MOD;
+    }
+    else {
+        if (e->changes) {
+            e->changes->changed &= ~ZIP_DIRENT_LAST_MOD;
+            if (e->changes->changed == 0) {
+               _zip_dirent_free(e->changes);
+                e->changes = NULL;
+            }
+        }
+    }
+    
+    return 0;
+}
index 9ba70f1..8366f1e 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_file_sterror.c -- get string representation of zip file error
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN const char *
-zip_file_strerror(struct zip_file *zf)
+zip_file_strerror(zip_file_t *zf)
 {
-    return _zip_error_strerror(&zf->error);
+    return zip_error_strerror(&zf->error);
 }
index 4d1ad56..8e06e8f 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_filerange_crc.c -- compute CRC32 for a range of a file
-  Copyright (C) 2008 Dieter Baron and Thomas Klausner
+  Copyright (C) 2008-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -31,7 +31,6 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdio.h>
 #include <errno.h>
 #include "zipint.h"
 
 
-\f
 
 int
-_zip_filerange_crc(FILE *fp, off_t start, off_t len, uLong *crcp,
-                  struct zip_error *errp)
+_zip_filerange_crc(zip_source_t *src, zip_uint64_t start, zip_uint64_t len, uLong *crcp, zip_error_t *error)
 {
     Bytef buf[BUFSIZE];
-    size_t n;
+    zip_int64_t n;
 
     *crcp = crc32(0L, Z_NULL, 0);
 
-    if (fseeko(fp, start, SEEK_SET) != 0) {
-       _zip_error_set(errp, ZIP_ER_SEEK, errno);
+    if (start > ZIP_INT64_MAX) {
+       zip_error_set(error, ZIP_ER_SEEK, EFBIG);
+       return -1;
+    }
+
+    if (zip_source_seek(src, (zip_int64_t)start, SEEK_SET) != 0) {
+       _zip_error_set_from_source(error, src);
        return -1;
     }
     
     while (len > 0) {
-       n = len > BUFSIZE ? BUFSIZE : len;
-       if ((n=fread(buf, 1, n, fp)) <= 0) {
-           _zip_error_set(errp, ZIP_ER_READ, errno);
+       n = (zip_int64_t)(len > BUFSIZE ? BUFSIZE : len);
+       if ((n = zip_source_read(src, buf, (zip_uint64_t)n)) < 0) {
+           _zip_error_set_from_source(error, src);
+           return -1;
+       }
+       if (n == 0) {
+           zip_error_set(error, ZIP_ER_EOF, 0);
            return -1;
        }
 
-       *crcp = crc32(*crcp, buf, n);
+       *crcp = crc32(*crcp, buf, (uInt)n);
 
-       len-= n;
+       len -= (zip_uint64_t)n;
     }
 
     return 0;
index 5a65eba..3adb5de 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_fopen.c -- open file in zip archive for reading
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN struct zip_file *
-zip_fopen(struct zip *za, const char *fname, int flags)
+ZIP_EXTERN zip_file_t *
+zip_fopen(zip_t *za, const char *fname, zip_flags_t flags)
 {
-    int idx;
+    zip_int64_t idx;
 
     if ((idx=zip_name_locate(za, fname, flags)) < 0)
        return NULL;
 
-    return zip_fopen_index_encrypted(za, idx, flags, za->default_password);
+    return zip_fopen_index_encrypted(za, (zip_uint64_t)idx, flags, za->default_password);
 }
index 0a4b131..5eaf2b0 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_fopen_encrypted.c -- open file for reading with password
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN struct zip_file *
-zip_fopen_encrypted(struct zip *za, const char *fname, int flags,
-                   const char *password)
+ZIP_EXTERN zip_file_t *
+zip_fopen_encrypted(zip_t *za, const char *fname, zip_flags_t flags, const char *password)
 {
-    int idx;
+    zip_int64_t idx;
 
     if ((idx=zip_name_locate(za, fname, flags)) < 0)
        return NULL;
 
-    return zip_fopen_index_encrypted(za, idx, flags, password);
+    return zip_fopen_index_encrypted(za, (zip_uint64_t)idx, flags, password);
 }
index 3a58bbe..e9a169a 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_fopen_index.c -- open file in zip archive for reading by index
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -31,7 +31,6 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <errno.h>
 #include <stdio.h>
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN struct zip_file *
-zip_fopen_index(struct zip *za, zip_uint64_t fileno, int flags)
+ZIP_EXTERN zip_file_t *
+zip_fopen_index(zip_t *za, zip_uint64_t index, zip_flags_t flags)
 {
-    return zip_fopen_index_encrypted(za, fileno, flags, za->default_password);
+    return zip_fopen_index_encrypted(za, index, flags, za->default_password);
 }
index 2e617bf..21cc433 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_fopen_index_encrypted.c -- open file for reading by index w/ password
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -31,7 +31,6 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <errno.h>
 #include <stdio.h>
 
 #include "zipint.h"
 
-static struct zip_file *_zip_file_new(struct zip *za);
+static zip_file_t *_zip_file_new(zip_t *za);
 
-\f
 
-ZIP_EXTERN struct zip_file *
-zip_fopen_index_encrypted(struct zip *za, zip_uint64_t fileno, int flags,
+ZIP_EXTERN zip_file_t *
+zip_fopen_index_encrypted(zip_t *za, zip_uint64_t index, zip_flags_t flags,
                          const char *password)
 {
-    struct zip_file *zf;
-    zip_compression_implementation comp_impl;
-    zip_encryption_implementation enc_impl;
-    struct zip_source *src, *s2;
-    zip_uint64_t start;
-    struct zip_stat st;
-
-    if (fileno >= za->nentry) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-       return NULL;
-    }
-
-    if ((flags & ZIP_FL_UNCHANGED) == 0
-       && ZIP_ENTRY_DATA_CHANGED(za->entry+fileno)) {
-       _zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
-       return NULL;
-    }
-
-    if (fileno >= za->cdir->nentry) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-       return NULL;
-    }
-
-    if (flags & ZIP_FL_ENCRYPTED)
-       flags |= ZIP_FL_COMPRESSED;
-
-    zip_stat_index(za, fileno, flags, &st);
-
-    enc_impl = NULL;
-    if ((flags & ZIP_FL_ENCRYPTED) == 0) {
-       if (st.encryption_method != ZIP_EM_NONE) {
-           if (password == NULL) {
-               _zip_error_set(&za->error, ZIP_ER_NOPASSWD, 0);
-               return NULL;
-           }
-           if ((enc_impl=zip_get_encryption_implementation(
-                    st.encryption_method)) == NULL) {
-               _zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0);
-               return NULL;
-           }
-       }
-    }
+    zip_file_t *zf;
+    zip_source_t *src;
 
-    comp_impl = NULL;
-    if ((flags & ZIP_FL_COMPRESSED) == 0) {
-       if (st.comp_method != ZIP_CM_STORE) {
-           if ((comp_impl=zip_get_compression_implementation(
-                    st.comp_method)) == NULL) {
-               _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0);
-               return NULL;
-           }
-       }
-    }
-
-    if ((start=_zip_file_get_offset(za, fileno)) == 0)
+    if ((src=_zip_source_zip_new(za, za, index, flags, 0, 0, password)) == NULL)
        return NULL;
 
-    if (st.comp_size == 0) {
-       if ((src=zip_source_buffer(za, NULL, 0, 0)) == NULL)
-           return NULL;
-    }
-    else {
-       if ((src=_zip_source_file_or_p(za, NULL, za->zp, start, st.comp_size,
-                                      0, &st)) == NULL)
-           return NULL;
-       if (enc_impl) {
-           if ((s2=enc_impl(za, src, ZIP_EM_TRAD_PKWARE, 0,
-                            password)) == NULL) {
-               zip_source_free(src);
-               /* XXX: set error (how?) */
-               return NULL;
-           }
-           src = s2;
-       }
-       if (comp_impl) {
-           if ((s2=comp_impl(za, src, za->cdir->entry[fileno].comp_method,
-                             0)) == NULL) {
-               zip_source_free(src);
-               /* XXX: set error (how?) */
-               return NULL;
-           }
-           src = s2;
-       }
-       if ((flags & ZIP_FL_COMPRESSED) == 0
-           || st.comp_method == ZIP_CM_STORE ) {
-           if ((s2=zip_source_crc(za, src, 1)) == NULL) {
-               zip_source_free(src);
-               /* XXX: set error (how?) */
-               return NULL;
-           }
-           src = s2;
-       }
-    }
-
     if (zip_source_open(src) < 0) {
        _zip_error_set_from_source(&za->error, src);
        zip_source_free(src);
        return NULL;
     }
 
-    zf = _zip_file_new(za);
+    if ((zf=_zip_file_new(za)) == NULL) {
+       zip_source_free(src);
+       return NULL;
+    }
 
     zf->src = src;
 
     return zf;
 }
 
-\f
 
-static struct zip_file *
-_zip_file_new(struct zip *za)
+static zip_file_t *
+_zip_file_new(zip_t *za)
 {
-    struct zip_file *zf, **file;
-    int n;
+    zip_file_t *zf;
 
-    if ((zf=(struct zip_file *)malloc(sizeof(struct zip_file))) == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+    if ((zf=(zip_file_t *)malloc(sizeof(struct zip_file))) == NULL) {
+       zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
        return NULL;
     }
-    
-    if (za->nfile >= za->nfile_alloc-1) {
-       n = za->nfile_alloc + 10;
-       file = (struct zip_file **)realloc(za->file,
-                                          n*sizeof(struct zip_file *));
-       if (file == NULL) {
-           _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
-           free(zf);
-           return NULL;
-       }
-       za->nfile_alloc = n;
-       za->file = file;
-    }
-
-    za->file[za->nfile++] = zf;
 
     zf->za = za;
-    _zip_error_init(&zf->error);
+    zip_error_init(&zf->error);
     zf->eof = 0;
     zf->src = NULL;
 
index 8235c6d..9c1cbe0 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_fread.c -- read from file
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN zip_int64_t
-zip_fread(struct zip_file *zf, void *outbuf, zip_uint64_t toread)
+zip_fread(zip_file_t *zf, void *outbuf, zip_uint64_t toread)
 {
     zip_int64_t n;
 
@@ -49,7 +47,7 @@ zip_fread(struct zip_file *zf, void *outbuf, zip_uint64_t toread)
        return -1;
 
     if (toread > ZIP_INT64_MAX) {
-       _zip_error_set(&zf->error, ZIP_ER_INVAL, 0);
+       zip_error_set(&zf->error, ZIP_ER_INVAL, 0);
        return -1;
     }
 
index 669eb70..78f8ca0 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_get_archive_comment.c -- get archive comment
-  Copyright (C) 2006-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
+
+#include <string.h>
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN const char *
-zip_get_archive_comment(struct zip *za, int *lenp, int flags)
+zip_get_archive_comment(zip_t *za, int *lenp, zip_flags_t flags)
 {
-    if ((flags & ZIP_FL_UNCHANGED)
-       || (za->ch_comment_len == -1)) {
-       if (za->cdir) {
-           if (lenp != NULL)
-               *lenp = za->cdir->comment_len;
-           return za->cdir->comment;
-       }
-       else {
-           if (lenp != NULL)
-               *lenp = -1;
-           return NULL;
-       }
-    }
-    
-    if (lenp != NULL)
-       *lenp = za->ch_comment_len;
-    return za->ch_comment;
+    zip_string_t *comment;
+    zip_uint32_t len;
+    const zip_uint8_t *str;
+
+    if ((flags & ZIP_FL_UNCHANGED) || (za->comment_changes == NULL))
+       comment = za->comment_orig;
+    else
+       comment = za->comment_changes;
+
+    if ((str=_zip_string_get(comment, &len, flags, &za->error)) == NULL)
+       return NULL;
+
+    if (lenp)
+       *lenp = (int)len;
+
+    return (const char *)str;
 }
index 4733d92..bffe10c 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_get_archive_flag.c -- get archive global flag
-  Copyright (C) 2008 Dieter Baron and Thomas Klausner
+  Copyright (C) 2008-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_get_archive_flag(struct zip *za, int flag, int flags)
+zip_get_archive_flag(zip_t *za, zip_flags_t flag, zip_flags_t flags)
 {
-    int fl;
+    unsigned int fl;
 
     fl = (flags & ZIP_FL_UNCHANGED) ? za->flags : za->ch_flags;
 
index 8d4ccb6..c1120d3 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_get_compression_implementation.c -- get compression implementation
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN zip_compression_implementation
-zip_get_compression_implementation(zip_uint16_t cm)
+zip_compression_implementation
+_zip_get_compression_implementation(zip_int32_t cm)
 {
-    if (cm == ZIP_CM_DEFLATE)
+    if (cm == ZIP_CM_DEFLATE || ZIP_CM_IS_DEFAULT(cm))
        return zip_source_deflate;
     return NULL;
 }
index d83698c..e2f833b 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_get_encryption_implementation.c -- get encryption implementation
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN zip_encryption_implementation
-zip_get_encryption_implementation(zip_uint16_t em)
+zip_encryption_implementation
+_zip_get_encryption_implementation(zip_uint16_t em)
 {
     if (em == ZIP_EM_TRAD_PKWARE)
        return zip_source_pkware;
index b9dacbe..d5f50bf 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_get_file_comment.c -- get file comment
-  Copyright (C) 2006-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
+#define _ZIP_COMPILING_DEPRECATED
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN const char *
-zip_get_file_comment(struct zip *za, zip_uint64_t idx, int *lenp, int flags)
+zip_get_file_comment(zip_t *za, zip_uint64_t idx, int *lenp, int flags)
 {
-    if (idx >= za->nentry) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-       return NULL;
-    }
+    zip_uint32_t len;
+    const char *s;
 
-    if ((flags & ZIP_FL_UNCHANGED)
-       || (za->entry[idx].ch_comment_len == -1)) {
-       if (lenp != NULL)
-           *lenp = za->cdir->entry[idx].comment_len;
-       return za->cdir->entry[idx].comment;
+    if ((s=zip_file_get_comment(za, idx, &len, (zip_flags_t)flags)) != NULL) {
+       if (lenp)
+           *lenp = (int)len;
     }
-    
-    if (lenp != NULL)
-       *lenp = za->entry[idx].ch_comment_len;
-    return za->entry[idx].ch_comment;
+
+    return s;
 }
index 531af50..d29e636 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_get_name.c -- get filename for a file in zip file
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
+
+#include <string.h>
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN const char *
-zip_get_name(struct zip *za, zip_uint64_t idx, int flags)
+zip_get_name(zip_t *za, zip_uint64_t idx, zip_flags_t flags)
 {
     return _zip_get_name(za, idx, flags, &za->error);
 }
 
-\f
 
 const char *
-_zip_get_name(struct zip *za, zip_uint64_t idx, int flags,
-             struct zip_error *error)
+_zip_get_name(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_error_t *error)
 {
-    if (idx >= za->nentry) {
-       _zip_error_set(error, ZIP_ER_INVAL, 0);
-       return NULL;
-    }
+    zip_dirent_t *de;
+    const zip_uint8_t *str;
 
-    if ((flags & ZIP_FL_UNCHANGED) == 0) {
-       if (za->entry[idx].state == ZIP_ST_DELETED) {
-           _zip_error_set(error, ZIP_ER_DELETED, 0);
-           return NULL;
-       }
-       if (za->entry[idx].ch_filename)
-           return za->entry[idx].ch_filename;
-    }
+    if ((de=_zip_get_dirent(za, idx, flags, error)) == NULL)
+       return NULL;
 
-    if (za->cdir == NULL || idx >= za->cdir->nentry) {
-       _zip_error_set(error, ZIP_ER_INVAL, 0);
+    if ((str=_zip_string_get(de->filename, NULL, flags, error)) == NULL)
        return NULL;
-    }
-    
-    return za->cdir->entry[idx].filename;
+
+    return (const char *)str;
 }
index 83293e9..c8644a4 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_get_num_entries.c -- get number of entries in archive
-  Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN zip_uint64_t
-zip_get_num_entries(struct zip *za, int flags)
+ZIP_EXTERN zip_int64_t
+zip_get_num_entries(zip_t *za, zip_flags_t flags)
 {
+    zip_uint64_t n;
+
     if (za == NULL)
        return -1;
 
     if (flags & ZIP_FL_UNCHANGED) {
-      if (za->cdir == NULL)
-       return 0;
-      return za->cdir->nentry;
+       n = za->nentry;
+       while (n>0 && za->entry[n-1].orig == NULL)
+           --n;
+       return (zip_int64_t)n;
     }
-    return za->nentry;
+    return (zip_int64_t)za->nentry;
 }
index 1d9baa3..cf96353 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_get_num_files.c -- get number of files in archive
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
+#define _ZIP_COMPILING_DEPRECATED
 #include "zipint.h"
+#include <limits.h>
 
-\f
 
 ZIP_EXTERN int
-zip_get_num_files(struct zip *za)
+zip_get_num_files(zip_t *za)
 {
     if (za == NULL)
        return -1;
 
-    return za->nentry;
+    if (za->nentry > INT_MAX) {
+       zip_error_set(&za->error, ZIP_ER_OPNOTSUPP, 0);
+       return -1;
+    }
+
+    return (int)za->nentry;
 }
diff --git a/lib/zip_io_util.c b/lib/zip_io_util.c
new file mode 100644 (file)
index 0000000..4a6bc1d
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ zip_io_util.c -- I/O helper functions
+ Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
+ This file is part of libzip, a library to manipulate ZIP archives.
+ The authors can be contacted at <libzip@nih.at>
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 3. The names of the authors may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "zipint.h"
+
+int
+_zip_read(zip_source_t *src, zip_uint8_t *b, zip_uint64_t length, zip_error_t *error)
+{
+    zip_int64_t n;
+
+    if (length > ZIP_INT64_MAX) {
+       zip_error_set(error, ZIP_ER_INTERNAL, 0);
+       return -1;
+    }
+
+    if ((n = zip_source_read(src, b, length)) < 0) {
+       _zip_error_set_from_source(error, src);
+       return -1;
+    }
+
+    if (n < (zip_int64_t)length) {
+       zip_error_set(error, ZIP_ER_EOF, 0);
+       return -1;
+    }
+
+    return 0;
+}
+
+
+zip_uint8_t *
+_zip_read_data(zip_buffer_t *buffer, zip_source_t *src, size_t length, bool nulp, zip_error_t *error)
+{
+    zip_uint8_t *r;
+    
+    if (length == 0 && !nulp) {
+       return NULL;
+    }
+
+    r = (zip_uint8_t *)malloc(length + (nulp ? 1 : 0));
+    if (!r) {
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
+       return NULL;
+    }
+
+    if (buffer) {
+        zip_uint8_t *data = _zip_buffer_get(buffer, length);
+        
+        if (data == NULL) {
+            zip_error_set(error, ZIP_ER_MEMORY, 0);
+            free(r);
+            return NULL;
+        }
+       memcpy(r, data, length);
+    }
+    else {
+       if (_zip_read(src, r, length, error) < 0) {
+           free(r);
+           return NULL;
+       }
+    }
+
+    if (nulp) {
+       zip_uint8_t *o;
+       /* replace any in-string NUL characters with spaces */
+       r[length] = 0;
+       for (o=r; o<r+length; o++)
+           if (*o == '\0')
+               *o = ' ';
+    }
+
+    return r;
+}
+
+
+zip_string_t *
+_zip_read_string(zip_buffer_t *buffer, zip_source_t *src, zip_uint16_t len, bool nulp, zip_error_t *error)
+{
+    zip_uint8_t *raw;
+    zip_string_t *s;
+
+    if ((raw=_zip_read_data(buffer, src, len, nulp, error)) == NULL)
+       return NULL;
+
+    s = _zip_string_new(raw, len, ZIP_FL_ENC_GUESS, error);
+    free(raw);
+    return s;
+}
+
+
+int
+_zip_write(zip_t *za, const void *data, zip_uint64_t length)
+{
+    zip_int64_t n;
+    
+    if ((n = zip_source_write(za->src, data, length)) < 0) {
+        _zip_error_set_from_source(&za->error, za->src);
+        return -1;
+    }
+    if ((zip_uint64_t)n != length) {
+        zip_error_set(&za->error, ZIP_ER_WRITE, EINTR);
+        return -1;
+    }
+    
+    return 0;
+}
index 641125e..cc6d767 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_memdup.c -- internal zip function, "strdup" with len
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
 
 #include "zipint.h"
 
-\f
 
 void *
-_zip_memdup(const void *mem, size_t len, struct zip_error *error)
+_zip_memdup(const void *mem, size_t len, zip_error_t *error)
 {
     void *ret;
 
+    if (len == 0)
+       return NULL;
+
     ret = malloc(len);
     if (!ret) {
-       _zip_error_set(error, ZIP_ER_MEMORY, 0);
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
        return NULL;
     }
 
index 1f7081b..820ea0c 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_name_locate.c -- get index by name
-  Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <string.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN int
-zip_name_locate(struct zip *za, const char *fname, int flags)
+ZIP_EXTERN zip_int64_t
+zip_name_locate(zip_t *za, const char *fname, zip_flags_t flags)
 {
     return _zip_name_locate(za, fname, flags, &za->error);
 }
 
-\f
 
-int
-_zip_name_locate(struct zip *za, const char *fname, int flags,
-                struct zip_error *error)
+zip_int64_t
+_zip_name_locate(zip_t *za, const char *fname, zip_flags_t flags, zip_error_t *error)
 {
     int (*cmp)(const char *, const char *);
     const char *fn, *p;
-    int i, n;
+    zip_uint64_t i;
 
     if (za == NULL)
        return -1;
 
     if (fname == NULL) {
-       _zip_error_set(error, ZIP_ER_INVAL, 0);
+       zip_error_set(error, ZIP_ER_INVAL, 0);
        return -1;
     }
 
-    if ((flags & ZIP_FL_UNCHANGED)  && za->cdir == NULL) {
-        _zip_error_set(error, ZIP_ER_NOENT, 0);
-        return -1;
-    }
-
     cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp;
 
-    n = (flags & ZIP_FL_UNCHANGED) ? za->cdir->nentry : za->nentry;
-    for (i=0; i<n; i++) {
-       if (flags & ZIP_FL_UNCHANGED)
-           fn = za->cdir->entry[i].filename;
-       else
-           fn = _zip_get_name(za, i, flags, error);
+    for (i=0; i<za->nentry; i++) {
+       fn = _zip_get_name(za, i, flags, error);
 
-       /* newly added (partially filled) entry */
+       /* newly added (partially filled) entry or error */
        if (fn == NULL)
            continue;
        
@@ -87,10 +77,12 @@ _zip_name_locate(struct zip *za, const char *fname, int flags,
                fn = p+1;
        }
 
-       if (cmp(fname, fn) == 0)
-           return i;
+       if (cmp(fname, fn) == 0) {
+           _zip_error_clear(error);
+           return (zip_int64_t)i;
+       }
     }
 
-    _zip_error_set(error, ZIP_ER_NOENT, 0);
+    zip_error_set(error, ZIP_ER_NOENT, 0);
     return -1;
 }
index 7ce1237..d54a247 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_new.c -- create and init struct zip
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
 /* _zip_new:
    creates a new zipfile struct, and sets the contents to zero; returns
    the new struct. */
 
-struct zip *
-_zip_new(struct zip_error *error)
+zip_t *
+_zip_new(zip_error_t *error)
 {
-    struct zip *za;
+    zip_t *za;
 
-    za = (struct zip *)malloc(sizeof(struct zip));
+    za = (zip_t *)malloc(sizeof(struct zip));
     if (!za) {
-       _zip_error_set(error, ZIP_ER_MEMORY, 0);
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
        return NULL;
     }
 
-    za->zn = NULL;
-    za->zp = NULL;
-    _zip_error_init(&za->error);
-    za->cdir = NULL;
-    za->ch_comment = NULL;
-    za->ch_comment_len = -1;
-    za->nentry = za->nentry_alloc = 0;
-    za->entry = NULL;
-    za->nfile = za->nfile_alloc = 0;
-    za->file = NULL;
+    za->src = NULL;
+    za->open_flags = 0;
+    zip_error_init(&za->error);
     za->flags = za->ch_flags = 0;
     za->default_password = NULL;
+    za->comment_orig = za->comment_changes = NULL;
+    za->comment_changed = 0;
+    za->nentry = za->nentry_alloc = 0;
+    za->entry = NULL;
+    za->nopen_source = za->nopen_source_alloc = 0;
+    za->open_source = NULL;
+    za->tempdir = NULL;
     
     return za;
 }
index e9dfa3a..fb9c566 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_open.c -- open zip archive by name
-  Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -31,7 +31,6 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <sys/stat.h>
 #include <errno.h>
 
 #include "zipint.h"
 
-static void set_error(int *, struct zip_error *, int);
-static struct zip *_zip_allocate_new(const char *, int *);
-static int _zip_checkcons(FILE *, struct zip_cdir *, struct zip_error *);
-static void _zip_check_torrentzip(struct zip *);
-static struct zip_cdir *_zip_find_central_dir(FILE *, int, int *, off_t);
-static int _zip_file_exists(const char *, int, int *);
-static int _zip_headercomp(struct zip_dirent *, int,
-                          struct zip_dirent *, int);
-static unsigned char *_zip_memmem(const unsigned char *, int,
-                                 const unsigned char *, int);
-static struct zip_cdir *_zip_readcdir(FILE *, off_t, unsigned char *, unsigned char *,
-                                int, int, struct zip_error *);
-
-\f
-
-ZIP_EXTERN struct zip *
-zip_open(const char *fn, int flags, int *zep)
+typedef enum {
+    EXISTS_ERROR = -1,
+    EXISTS_NOT = 0,
+    EXISTS_EMPTY,
+    EXISTS_NONEMPTY,
+} exists_t;
+static zip_t *_zip_allocate_new(zip_source_t *src, unsigned int flags, zip_error_t *error);
+static zip_int64_t _zip_checkcons(zip_t *za, zip_cdir_t *cdir, zip_error_t *error);
+static zip_cdir_t *_zip_find_central_dir(zip_t *za, zip_uint64_t len);
+static exists_t _zip_file_exists(zip_source_t *src, zip_error_t *error);
+static int _zip_headercomp(const zip_dirent_t *, const zip_dirent_t *);
+static unsigned char *_zip_memmem(const unsigned char *, size_t, const unsigned char *, size_t);
+static zip_cdir_t *_zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_error_t *error);
+static zip_cdir_t *_zip_read_eocd(zip_buffer_t *buffer, zip_uint64_t buf_offset, unsigned int flags, zip_error_t *error);
+static zip_cdir_t *_zip_read_eocd64(zip_source_t *src, zip_buffer_t *buffer, zip_uint64_t buf_offset, unsigned int flags, zip_error_t *error);
+
+
+ZIP_EXTERN zip_t *
+zip_open(const char *fn, int _flags, int *zep)
 {
-    FILE *fp;
-    
-    switch (_zip_file_exists(fn, flags, zep)) {
-    case -1:
+    zip_t *za;
+    zip_source_t *src;
+    struct zip_error error;
+
+    zip_error_init(&error);
+    if ((src = zip_source_file_create(fn, 0, -1, &error)) == NULL) {
+       _zip_set_open_error(zep, &error, 0);
+       zip_error_fini(&error);
        return NULL;
-    case 0:
-       return _zip_allocate_new(fn, zep);
-    default:
-       break;
     }
 
-    if ((fp=fopen(fn, "rb")) == NULL) {
-       set_error(zep, NULL, ZIP_ER_OPEN);
+    if ((za = zip_open_from_source(src, _flags, &error)) == NULL) {
+       zip_source_free(src);
+       _zip_set_open_error(zep, &error, 0);
+       zip_error_fini(&error);
        return NULL;
     }
 
-    return _zip_open(fn, fp, flags, 0, zep);
+    zip_error_fini(&error);
+    return za;
 }
 
-\f
 
-struct zip *
-_zip_open(const char *fn, FILE *fp, int flags, int aflags, int *zep)
+ZIP_EXTERN zip_t *
+zip_open_from_source(zip_source_t *src, int _flags, zip_error_t *error)
 {
-    struct zip *za;
-    struct zip_cdir *cdir;
-    int i;
-    off_t len;
+    static zip_int64_t needed_support_read = -1;
+    static zip_int64_t needed_support_write = -1;
+    
+    unsigned int flags;
+    zip_int64_t supported;
+    exists_t exists;
+    
+    if (_flags < 0 || src == NULL) {
+       zip_error_set(error, ZIP_ER_INVAL, 0);
+        return NULL;
+    }
+    flags = (unsigned int)_flags;
+    
+    supported = zip_source_supports(src);
+    if (needed_support_read == -1) {
+        needed_support_read = zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_SEEK, ZIP_SOURCE_TELL, ZIP_SOURCE_STAT, -1);
+        needed_support_write = zip_source_make_command_bitmap(ZIP_SOURCE_BEGIN_WRITE, ZIP_SOURCE_COMMIT_WRITE, ZIP_SOURCE_ROLLBACK_WRITE, ZIP_SOURCE_SEEK_WRITE, ZIP_SOURCE_TELL_WRITE, ZIP_SOURCE_REMOVE, -1);
+    }
+    if ((supported & needed_support_read) != needed_support_read) {
+        zip_error_set(error, ZIP_ER_OPNOTSUPP, 0);
+        return NULL;
+    }
+    if ((supported & needed_support_write) != needed_support_write) {
+        flags |= ZIP_RDONLY;
+    }
 
-    if (fseeko(fp, 0, SEEK_END) < 0) {
-       *zep = ZIP_ER_SEEK;
+    if ((flags & (ZIP_RDONLY|ZIP_TRUNCATE)) == (ZIP_RDONLY|ZIP_TRUNCATE)) {
+       zip_error_set(error, ZIP_ER_RDONLY, 0);
        return NULL;
     }
-    len = ftello(fp);
 
-    /* treat empty files as empty archives */
-    if (len == 0) {
-       if ((za=_zip_allocate_new(fn, zep)) == NULL)
-           fclose(fp);
-       else
-           za->zp = fp;
+    exists = _zip_file_exists(src, error);
+    switch (exists) { 
+    case EXISTS_ERROR:
+       return NULL;
+
+    case EXISTS_NOT:
+       if ((flags & ZIP_CREATE) == 0) {
+           zip_error_set(error, ZIP_ER_NOENT, 0);
+           return NULL;
+       }
+       return _zip_allocate_new(src, flags, error);
+
+    default: {
+       zip_t *za;
+       if (flags & ZIP_EXCL) {
+           zip_error_set(error, ZIP_ER_EXISTS, 0);
+           return NULL;
+       }
+       if (zip_source_open(src) < 0) {
+           _zip_error_set_from_source(error, src);
+           return NULL;
+       }
+
+       if (flags & ZIP_TRUNCATE) {
+           za = _zip_allocate_new(src, flags, error);
+       }
+       else {
+           /* ZIP_CREATE gets ignored if file exists and not ZIP_EXCL, just like open() */
+           za = _zip_open(src, flags, error);
+       }
+
+       if (za == NULL) {
+           zip_source_close(src);
+           return NULL;
+       }
        return za;
     }
+    }
+}
 
-    cdir = _zip_find_central_dir(fp, flags, zep, len);
-    if (cdir == NULL) {
-       fclose(fp);
-       return NULL;
+ZIP_EXTERN int
+zip_archive_set_tempdir(zip_t *za, const char *tempdir)
+{
+    char *new_tempdir;
+    
+    if (tempdir) {
+        if ((new_tempdir = strdup(tempdir)) == NULL) {
+            zip_error_set(&za->error, ZIP_ER_MEMORY, errno);
+            return -1;
+        }
     }
+    else
+        new_tempdir = NULL;
+    
+    free(za->tempdir);
+    za->tempdir = new_tempdir;
+    
+    return 0;
+}
 
-    if ((za=_zip_allocate_new(fn, zep)) == NULL) {
-       _zip_cdir_free(cdir);
-       fclose(fp);
+zip_t *
+_zip_open(zip_source_t *src, unsigned int flags, zip_error_t *error)
+{
+    zip_t *za;
+    zip_cdir_t *cdir;
+    struct zip_stat st;
+    zip_uint64_t len;
+
+    zip_stat_init(&st);
+    if (zip_source_stat(src, &st) < 0) {
+       _zip_error_set_from_source(error, src);
        return NULL;
     }
+    if ((st.valid & ZIP_STAT_SIZE) == 0) {
+       zip_error_set(error, ZIP_ER_SEEK, EOPNOTSUPP);
+       return NULL;
+    }
+    len = st.size;
+
+    /* treat empty files as empty archives */
+    if (len == 0) {
+       if ((za=_zip_allocate_new(src, flags, error)) == NULL) {
+           zip_source_free(src);
+           return NULL;
+       }
 
-    za->cdir = cdir;
-    za->zp = fp;
+       return za;
+    }
 
-    if ((za->entry=(struct zip_entry *)malloc(sizeof(*(za->entry))
-                                             * cdir->nentry)) == NULL) {
-       set_error(zep, NULL, ZIP_ER_MEMORY);
-       _zip_free(za);
+    if ((za=_zip_allocate_new(src, flags, error)) == NULL) {
+        return NULL;
+    }
+    
+    if ((cdir = _zip_find_central_dir(za, len)) == NULL) {
+        _zip_error_copy(error, &za->error);
+       /* keep src so discard does not get rid of it */
+       zip_source_keep(src);
+       zip_discard(za);
        return NULL;
     }
-    for (i=0; i<cdir->nentry; i++)
-       _zip_entry_new(za);
 
-    _zip_check_torrentzip(za);
+    za->entry = cdir->entry;
+    za->nentry = cdir->nentry;
+    za->nentry_alloc = cdir->nentry_alloc;
+    za->comment_orig = cdir->comment;
+    
     za->ch_flags = za->flags;
 
+    free(cdir);
+
     return za;
 }
 
-\f
 
-static void
-set_error(int *zep, struct zip_error *err, int ze)
+void
+_zip_set_open_error(int *zep, const zip_error_t *err, int ze)
 {
-    int se;
-
     if (err) {
-       _zip_error_get(err, &ze, &se);
-       if (zip_error_get_sys_type(ze) == ZIP_ET_SYS)
-           errno = se;
+       ze = zip_error_code_zip(err);
+       if (zip_error_system_type(err) == ZIP_ET_SYS) {
+           errno = zip_error_code_system(err);
+       }
     }
 
     if (zep)
        *zep = ze;
 }
 
-\f
 
 /* _zip_readcdir:
    tries to find a valid end-of-central-directory at the beginning of
@@ -159,129 +253,157 @@ set_error(int *zep, struct zip_error *err, int ze)
    Returns a struct zip_cdir which contains the central directory 
    entries, or NULL if unsuccessful. */
 
-static struct zip_cdir *
-_zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, unsigned char *eocd, int buflen,
-             int flags, struct zip_error *error)
+static zip_cdir_t *
+_zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_error_t *error)
 {
-    struct zip_cdir *cd;
-    unsigned char *cdp, **bufp;
-    int i, comlen, nentry;
-    zip_uint32_t left;
+    zip_cdir_t *cd;
+    zip_uint16_t comment_len;
+    zip_uint64_t i, left;
+    zip_uint64_t eocd_offset = _zip_buffer_offset(buffer);
+    zip_buffer_t *cd_buffer;
 
-    comlen = buf + buflen - eocd - EOCDLEN;
-    if (comlen < 0) {
+    if (_zip_buffer_left(buffer) < EOCDLEN) {
        /* not enough bytes left for comment */
-       _zip_error_set(error, ZIP_ER_NOZIP, 0);
+       zip_error_set(error, ZIP_ER_NOZIP, 0);
        return NULL;
     }
-
+    
     /* check for end-of-central-dir magic */
-    if (memcmp(eocd, EOCD_MAGIC, 4) != 0) {
-       _zip_error_set(error, ZIP_ER_NOZIP, 0);
+    if (memcmp(_zip_buffer_get(buffer, 4), EOCD_MAGIC, 4) != 0) {
+       zip_error_set(error, ZIP_ER_NOZIP, 0);
        return NULL;
     }
 
-    if (memcmp(eocd+4, "\0\0\0\0", 4) != 0) {
-       _zip_error_set(error, ZIP_ER_MULTIDISK, 0);
+    if (_zip_buffer_get_32(buffer) != 0) {
+       zip_error_set(error, ZIP_ER_MULTIDISK, 0);
        return NULL;
     }
 
-    cdp = eocd + 8;
-    /* number of cdir-entries on this disk */
-    i = _zip_read2(&cdp);
-    /* number of cdir-entries */
-    nentry = _zip_read2(&cdp);
+    if (eocd_offset >= EOCD64LOCLEN && memcmp(_zip_buffer_data(buffer) + eocd_offset - EOCD64LOCLEN, EOCD64LOC_MAGIC, 4) == 0) {
+        _zip_buffer_set_offset(buffer, eocd_offset - EOCD64LOCLEN);
+        cd = _zip_read_eocd64(za->src, buffer, buf_offset, za->flags, error);
+    }
+    else {
+        _zip_buffer_set_offset(buffer, eocd_offset);
+        cd = _zip_read_eocd(buffer, buf_offset, za->flags, error);
+    }
 
-    if ((cd=_zip_cdir_new(nentry, error)) == NULL)
+    if (cd == NULL)
        return NULL;
 
-    cd->size = _zip_read4(&cdp);
-    cd->offset = _zip_read4(&cdp);
-    cd->comment = NULL;
-    cd->comment_len = _zip_read2(&cdp);
+    _zip_buffer_set_offset(buffer, eocd_offset + 20);
+    comment_len = _zip_buffer_get_16(buffer);
 
-    if (((zip_uint64_t)cd->offset)+cd->size > buf_offset + (eocd-buf)) {
+    if (cd->offset + cd->size > buf_offset + eocd_offset) {
        /* cdir spans past EOCD record */
-       _zip_error_set(error, ZIP_ER_INCONS, 0);
-       cd->nentry = 0;
+       zip_error_set(error, ZIP_ER_INCONS, 0);
        _zip_cdir_free(cd);
        return NULL;
     }
 
-    if ((comlen < cd->comment_len) || (cd->nentry != i)) {
-       _zip_error_set(error, ZIP_ER_NOZIP, 0);
-       cd->nentry = 0;
-       _zip_cdir_free(cd);
-       return NULL;
-    }
-    if ((flags & ZIP_CHECKCONS) && comlen != cd->comment_len) {
-       _zip_error_set(error, ZIP_ER_INCONS, 0);
-       cd->nentry = 0;
-       _zip_cdir_free(cd);
-       return NULL;
-    }
+    if (comment_len || (za->open_flags & ZIP_CHECKCONS)) {
+        zip_uint64_t tail_len;
+        
+        _zip_buffer_set_offset(buffer, eocd_offset + EOCDLEN);
+        tail_len = _zip_buffer_left(buffer);
+        
+        if (tail_len < comment_len || ((za->open_flags & ZIP_CHECKCONS) && tail_len != comment_len)) {
+            zip_error_set(error, ZIP_ER_INCONS, 0);
+            _zip_cdir_free(cd);
+            return NULL;
+        }
 
-    if (cd->comment_len) {
-       if ((cd->comment=(char *)_zip_memdup(eocd+EOCDLEN,
-                                            cd->comment_len, error))
-           == NULL) {
-           cd->nentry = 0;
-           _zip_cdir_free(cd);
-           return NULL;
-       }
+        if (comment_len) {
+            if ((cd->comment=_zip_string_new(_zip_buffer_get(buffer, comment_len), comment_len, ZIP_FL_ENC_GUESS, error)) == NULL) {
+                _zip_cdir_free(cd);
+                return NULL;
+            }
+        }
     }
 
     if (cd->offset >= buf_offset) {
+        zip_uint8_t *data;
        /* if buffer already read in, use it */
-       cdp = buf + (cd->offset - buf_offset);
-       bufp = &cdp;
+        _zip_buffer_set_offset(buffer, cd->offset - buf_offset);
+        
+        if ((data = _zip_buffer_get(buffer, cd->size)) == NULL) {
+            zip_error_set(error, ZIP_ER_INCONS, 0);
+            _zip_cdir_free(cd);
+            return NULL;
+        }
+        if ((cd_buffer = _zip_buffer_new(data, cd->size)) == NULL) {
+            zip_error_set(error, ZIP_ER_MEMORY, 0);
+            _zip_cdir_free(cd);
+            return NULL;
+        }
     }
     else {
-       /* go to start of cdir and read it entry by entry */
-       bufp = NULL;
-       clearerr(fp);
-       fseeko(fp, cd->offset, SEEK_SET);
-       /* possible consistency check: cd->offset =
-          len-(cd->size+cd->comment_len+EOCDLEN) ? */
-       if (ferror(fp) || ((unsigned long)ftello(fp) != cd->offset)) {
-           /* seek error or offset of cdir wrong */
-           if (ferror(fp))
-               _zip_error_set(error, ZIP_ER_SEEK, errno);
-           else
-               _zip_error_set(error, ZIP_ER_NOZIP, 0);
-           cd->nentry = 0;
+        cd_buffer = NULL;
+        
+        if (zip_source_seek(za->src, (zip_int64_t)cd->offset, SEEK_SET) < 0) {
+            _zip_error_set_from_source(error, za->src);
+            _zip_cdir_free(cd);
+            return NULL;
+        }
+
+       /* possible consistency check: cd->offset = len-(cd->size+cd->comment_len+EOCDLEN) ? */
+       if (zip_source_tell(za->src) != (zip_int64_t)cd->offset) {
+            zip_error_set(error, ZIP_ER_NOZIP, 0);
            _zip_cdir_free(cd);
            return NULL;
        }
     }
 
-    left = cd->size;
+    left = (zip_uint64_t)cd->size;
     i=0;
     while (i<cd->nentry && left > 0) {
-       if ((_zip_dirent_read(cd->entry+i, fp, bufp, &left, 0, error)) < 0) {
-           cd->nentry = i;
+        zip_int64_t entry_size;
+       if ((cd->entry[i].orig=_zip_dirent_new()) == NULL || (entry_size = _zip_dirent_read(cd->entry[i].orig, za->src, cd_buffer, false, error)) < 0) {
            _zip_cdir_free(cd);
+            _zip_buffer_free(cd_buffer);
            return NULL;
        }
        i++;
-       
-       if (i == cd->nentry && left > 0) {
-           /* Infozip extension for more than 64k entries:
-              nentries wraps around, size indicates correct EOCD */
-           if (_zip_cdir_grow(cd, cd->nentry+ZIP_UINT16_MAX, error) < 0) {
-               cd->nentry = i;
-               _zip_cdir_free(cd);
-               return NULL;
-           }
-       }
+        left -= (zip_uint64_t)entry_size;
+    }
+    
+    if (i != cd->nentry) {
+        zip_error_set(error, ZIP_ER_INCONS, 0);
+        _zip_buffer_free(cd_buffer);
+        _zip_cdir_free(cd);
+        return NULL;
     }
-
-    cd->nentry = i;
     
+    if (za->open_flags & ZIP_CHECKCONS) {
+        bool ok;
+        
+        if (cd_buffer) {
+            ok = _zip_buffer_eof(cd_buffer);
+        }
+        else {
+            zip_int64_t offset = zip_source_tell(za->src);
+            
+            if (offset < 0) {
+                _zip_error_set_from_source(error, za->src);
+                _zip_buffer_free(cd_buffer);
+                _zip_cdir_free(cd);
+                return NULL;
+            }
+            ok = ((zip_uint64_t)offset == cd->offset + cd->size);
+        }
+        
+        if (!ok) {
+            zip_error_set(error, ZIP_ER_INCONS, 0);
+            _zip_buffer_free(cd_buffer);
+            _zip_cdir_free(cd);
+            return NULL;
+        }
+    }
+
+    _zip_buffer_free(cd_buffer);
     return cd;
 }
 
-\f
 
 /* _zip_checkcons:
    Checks the consistency of the central directory by comparing central
@@ -289,302 +411,228 @@ _zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, unsigned char *eoc
    file and header offsets. Returns -1 if not plausible, else the
    difference between the lowest and the highest fileposition reached */
 
-static int
-_zip_checkcons(FILE *fp, struct zip_cdir *cd, struct zip_error *error)
+static zip_int64_t
+_zip_checkcons(zip_t *za, zip_cdir_t *cd, zip_error_t *error)
 {
-    int i;
-    unsigned int min, max, j;
+    zip_uint64_t i;
+    zip_uint64_t min, max, j;
     struct zip_dirent temp;
 
+    _zip_dirent_init(&temp);
     if (cd->nentry) {
-       max = cd->entry[0].offset;
-       min = cd->entry[0].offset;
+       max = cd->entry[0].orig->offset;
+       min = cd->entry[0].orig->offset;
     }
     else
        min = max = 0;
 
     for (i=0; i<cd->nentry; i++) {
-       if (cd->entry[i].offset < min)
-           min = cd->entry[i].offset;
-       if (min > cd->offset) {
-           _zip_error_set(error, ZIP_ER_NOZIP, 0);
+       if (cd->entry[i].orig->offset < min)
+           min = cd->entry[i].orig->offset;
+       if (min > (zip_uint64_t)cd->offset) {
+           zip_error_set(error, ZIP_ER_NOZIP, 0);
            return -1;
        }
        
-       j = cd->entry[i].offset + cd->entry[i].comp_size
-           + cd->entry[i].filename_len + LENTRYSIZE;
+       j = cd->entry[i].orig->offset + cd->entry[i].orig->comp_size
+           + _zip_string_length(cd->entry[i].orig->filename) + LENTRYSIZE;
        if (j > max)
            max = j;
-       if (max > cd->offset) {
-           _zip_error_set(error, ZIP_ER_NOZIP, 0);
+       if (max > (zip_uint64_t)cd->offset) {
+           zip_error_set(error, ZIP_ER_NOZIP, 0);
            return -1;
        }
        
-       if (fseeko(fp, cd->entry[i].offset, SEEK_SET) != 0) {
-           _zip_error_set(error, ZIP_ER_SEEK, 0);
-           return -1;
+        if (zip_source_seek(za->src, (zip_int64_t)cd->entry[i].orig->offset, SEEK_SET) < 0) {
+            _zip_error_set_from_source(error, za->src);
+            return -1;
        }
        
-       if (_zip_dirent_read(&temp, fp, NULL, NULL, 1, error) == -1)
+       if (_zip_dirent_read(&temp, za->src, NULL, true, error) == -1) {
+           _zip_dirent_finalize(&temp);
            return -1;
+       }
        
-       if (_zip_headercomp(cd->entry+i, 0, &temp, 1) != 0) {
-           _zip_error_set(error, ZIP_ER_INCONS, 0);
+       if (_zip_headercomp(cd->entry[i].orig, &temp) != 0) {
+           zip_error_set(error, ZIP_ER_INCONS, 0);
            _zip_dirent_finalize(&temp);
            return -1;
        }
+       
+       cd->entry[i].orig->extra_fields = _zip_ef_merge(cd->entry[i].orig->extra_fields, temp.extra_fields);
+       cd->entry[i].orig->local_extra_fields_read = 1;
+       temp.extra_fields = NULL;
+       
        _zip_dirent_finalize(&temp);
     }
 
-    return max - min;
-}
-
-\f
-
-/* _zip_check_torrentzip:
-   check wether ZA has a valid TORRENTZIP comment, i.e. is torrentzipped */
-
-static void
-_zip_check_torrentzip(struct zip *za)
-{
-    uLong crc_got, crc_should;
-    char buf[8+1];
-    char *end;
-
-    if (za->zp == NULL || za->cdir == NULL)
-       return;
-
-    if (za->cdir->comment_len != TORRENT_SIG_LEN+8
-       || strncmp(za->cdir->comment, TORRENT_SIG, TORRENT_SIG_LEN) != 0)
-       return;
-
-    memcpy(buf, za->cdir->comment+TORRENT_SIG_LEN, 8);
-    buf[8] = '\0';
-    errno = 0;
-    crc_should = strtoul(buf, &end, 16);
-    if ((crc_should == UINT_MAX && errno != 0) || (end && *end))
-       return;
-
-    if (_zip_filerange_crc(za->zp, za->cdir->offset, za->cdir->size,
-                          &crc_got, NULL) < 0)
-       return;
-
-    if (crc_got == crc_should)
-       za->flags |= ZIP_AFL_TORRENT;
+    return (max-min) < ZIP_INT64_MAX ? (zip_int64_t)(max-min) : ZIP_INT64_MAX;
 }
 
 
-\f
-
 /* _zip_headercomp:
-   compares two headers h1 and h2; if they are local headers, set
-   local1p or local2p respectively to 1, else 0. Return 0 if they
-   are identical, -1 if not. */
+   compares a central directory entry and a local file header
+   Return 0 if they are consistent, -1 if not. */
 
 static int
-_zip_headercomp(struct zip_dirent *h1, int local1p, struct zip_dirent *h2,
-          int local2p)
+_zip_headercomp(const zip_dirent_t *central, const zip_dirent_t *local)
 {
-    if ((h1->version_needed != h2->version_needed)
+    if ((central->version_needed != local->version_needed)
 #if 0
        /* some zip-files have different values in local
           and global headers for the bitflags */
-       || (h1->bitflags != h2->bitflags)
+       || (central->bitflags != local->bitflags)
 #endif
-       || (h1->comp_method != h2->comp_method)
-       || (h1->last_mod != h2->last_mod)
-       || (h1->filename_len != h2->filename_len)
-       || !h1->filename || !h2->filename
-       || strcmp(h1->filename, h2->filename))
+       || (central->comp_method != local->comp_method)
+       || (central->last_mod != local->last_mod)
+       || !_zip_string_equal(central->filename, local->filename))
        return -1;
 
-    /* check that CRC and sizes are zero if data descriptor is used */
-    if ((h1->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) && local1p
-       && (h1->crc != 0
-           || h1->comp_size != 0
-           || h1->uncomp_size != 0))
-       return -1;
-    if ((h2->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) && local2p
-       && (h2->crc != 0
-           || h2->comp_size != 0
-           || h2->uncomp_size != 0))
-       return -1;
-    
-    /* check that CRC and sizes are equal if no data descriptor is used */
-    if (((h1->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local1p == 0)
-       && ((h2->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local2p == 0)) {
-       if ((h1->crc != h2->crc)
-           || (h1->comp_size != h2->comp_size)
-           || (h1->uncomp_size != h2->uncomp_size))
+    if ((central->crc != local->crc) || (central->comp_size != local->comp_size)
+       || (central->uncomp_size != local->uncomp_size)) {
+       /* InfoZip stores valid values in local header even when data descriptor is used.
+          This is in violation of the appnote. */
+       if (((local->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0
+            || local->crc != 0 || local->comp_size != 0 || local->uncomp_size != 0))
            return -1;
     }
-    
-    if ((local1p == local2p)
-       && ((h1->extrafield_len != h2->extrafield_len)
-           || (h1->extrafield_len && h2->extrafield
-               && memcmp(h1->extrafield, h2->extrafield,
-                         h1->extrafield_len))))
-       return -1;
-
-    /* if either is local, nothing more to check */
-    if (local1p || local2p)
-       return 0;
-
-    if ((h1->version_madeby != h2->version_madeby)
-       || (h1->disk_number != h2->disk_number)
-       || (h1->int_attrib != h2->int_attrib)
-       || (h1->ext_attrib != h2->ext_attrib)
-       || (h1->offset != h2->offset)
-       || (h1->comment_len != h2->comment_len)
-       || (h1->comment_len && h2->comment
-           && memcmp(h1->comment, h2->comment, h1->comment_len)))
-       return -1;
 
     return 0;
 }
 
-\f
 
-static struct zip *
-_zip_allocate_new(const char *fn, int *zep)
+static zip_t *
+_zip_allocate_new(zip_source_t *src, unsigned int flags, zip_error_t *error)
 {
-    struct zip *za;
-    struct zip_error error;
+    zip_t *za;
 
-    if ((za=_zip_new(&error)) == NULL) {
-       set_error(zep, &error, 0);
+    if ((za = _zip_new(error)) == NULL) {
        return NULL;
     }
 
-    if (fn == NULL)
-       za->zn = NULL;
-    else {
-       za->zn = strdup(fn);
-       if (!za->zn) {
-           _zip_free(za);
-           set_error(zep, NULL, ZIP_ER_MEMORY);
-           return NULL;
-       }
+    za->src = src;
+    za->open_flags = flags;
+    if (flags & ZIP_RDONLY) {
+        za->flags |= ZIP_AFL_RDONLY;
+        za->ch_flags |= ZIP_AFL_RDONLY;
     }
     return za;
 }
 
-\f
 
-static int
-_zip_file_exists(const char *fn, int flags, int *zep)
+/*
+ * tests for file existence
+ */
+static exists_t
+_zip_file_exists(zip_source_t *src, zip_error_t *error)
 {
-    struct stat st;
+    struct zip_stat st;
 
-    if (fn == NULL) {
-       set_error(zep, NULL, ZIP_ER_INVAL);
-       return -1;
-    }
-    
-    if (stat(fn, &st) != 0) {
-       if (flags & ZIP_CREATE)
-           return 0;
-       else {
-           set_error(zep, NULL, ZIP_ER_OPEN);
-           return -1;
+    zip_stat_init(&st);
+    if (zip_source_stat(src, &st) != 0) {
+        zip_error_t *src_error = zip_source_error(src);
+        if (zip_error_code_zip(src_error) == ZIP_ER_READ && zip_error_code_system(src_error) == ENOENT) {
+           return EXISTS_NOT;
        }
+       _zip_error_copy(error, src_error);
+       return EXISTS_ERROR;
     }
-    else if ((flags & ZIP_EXCL)) {
-       set_error(zep, NULL, ZIP_ER_EXISTS);
-       return -1;
-    }
-    /* ZIP_CREATE gets ignored if file exists and not ZIP_EXCL,
-       just like open() */
 
-    return 1;
+    return (st.valid & ZIP_STAT_SIZE) && st.size == 0 ? EXISTS_EMPTY : EXISTS_NONEMPTY;
 }
 
-\f
 
-static struct zip_cdir *
-_zip_find_central_dir(FILE *fp, int flags, int *zep, off_t len)
+static zip_cdir_t *
+_zip_find_central_dir(zip_t *za, zip_uint64_t len)
 {
-    struct zip_cdir *cdir, *cdirnew;
-    unsigned char *buf, *match;
-    off_t buf_offset;
-    int a, best, buflen, i;
-    struct zip_error zerr;
-
-    i = fseeko(fp, -(len < CDBUFSIZE ? len : CDBUFSIZE), SEEK_END);
-    if (i == -1 && errno != EFBIG) {
-       /* seek before start of file on my machine */
-       set_error(zep, NULL, ZIP_ER_SEEK);
-       return NULL;
+    zip_cdir_t *cdir, *cdirnew;
+    zip_uint8_t *match;
+    zip_int64_t buf_offset;
+    zip_uint64_t buflen;
+    zip_int64_t a;
+    zip_int64_t best;
+    zip_error_t error;
+    zip_buffer_t *buffer;
+
+    if (len < EOCDLEN) {
+       zip_error_set(&za->error, ZIP_ER_NOZIP, 0);
+        return NULL;
+    }
+
+    buflen = (len < CDBUFSIZE ? len : CDBUFSIZE);
+    if (zip_source_seek(za->src, -(zip_int64_t)buflen, SEEK_END) < 0) {
+       zip_error_t *src_error = zip_source_error(za->src);
+       if (zip_error_code_zip(src_error) != ZIP_ER_SEEK || zip_error_code_system(src_error) != EFBIG) {
+           /* seek before start of file on my machine */
+           _zip_error_copy(&za->error, src_error);
+           return NULL;
+       }
+    }
+    if ((buf_offset = zip_source_tell(za->src)) < 0) {
+        _zip_error_set_from_source(&za->error, za->src);
+        return NULL;
     }
-    buf_offset = ftello(fp);
     
-    /* 64k is too much for stack */
-    if ((buf=(unsigned char *)malloc(CDBUFSIZE)) == NULL) {
-       set_error(zep, NULL, ZIP_ER_MEMORY);
-       return NULL;
+    if ((buffer = _zip_buffer_new_from_source(za->src, buflen, NULL, &za->error)) == NULL) {
+        return NULL;
     }
 
-    clearerr(fp);
-    buflen = fread(buf, 1, CDBUFSIZE, fp);
-
-    if (ferror(fp)) {
-       set_error(zep, NULL, ZIP_ER_READ);
-       free(buf);
-       return NULL;
-    }
-    
     best = -1;
     cdir = NULL;
-    match = buf;
-    _zip_error_set(&zerr, ZIP_ER_NOZIP, 0);
-
-    while ((match=_zip_memmem(match, buflen-(match-buf)-18,
-                             (const unsigned char *)EOCD_MAGIC, 4))!=NULL) {
-       /* found match -- check, if good */
-       /* to avoid finding the same match all over again */
-       match++;
-       if ((cdirnew=_zip_readcdir(fp, buf_offset, buf, match-1, buflen, flags,
-                                  &zerr)) == NULL)
-           continue;
-
-       if (cdir) {
-           if (best <= 0)
-               best = _zip_checkcons(fp, cdir, &zerr);
-           a = _zip_checkcons(fp, cdirnew, &zerr);
-           if (best < a) {
-               _zip_cdir_free(cdir);
-               cdir = cdirnew;
-               best = a;
-           }
-           else
-               _zip_cdir_free(cdirnew);
-       }
-       else {
-           cdir = cdirnew;
-           if (flags & ZIP_CHECKCONS)
-               best = _zip_checkcons(fp, cdir, &zerr);
-           else
-               best = 0;
-       }
-       cdirnew = NULL;
-    }
-
-    free(buf);
+    if (buflen >= CDBUFSIZE) {
+        /* EOCD64 locator is before EOCD, so leave place for it */
+        _zip_buffer_set_offset(buffer, EOCD64LOCLEN);
+    }
+    zip_error_set(&error, ZIP_ER_NOZIP, 0);
+
+    match = _zip_buffer_get(buffer, 0);
+    while ((match=_zip_memmem(match, _zip_buffer_left(buffer)-(EOCDLEN-4), (const unsigned char *)EOCD_MAGIC, 4)) != NULL) {
+        _zip_buffer_set_offset(buffer, (zip_uint64_t)(match - _zip_buffer_data(buffer)));
+        if ((cdirnew = _zip_read_cdir(za, buffer, (zip_uint64_t)buf_offset, &error)) != NULL) {
+            if (cdir) {
+                if (best <= 0) {
+                    best = _zip_checkcons(za, cdir, &error);
+                }
+                
+                a = _zip_checkcons(za, cdirnew, &error);
+                if (best < a) {
+                    _zip_cdir_free(cdir);
+                    cdir = cdirnew;
+                    best = a;
+                }
+                else {
+                    _zip_cdir_free(cdirnew);
+                }
+            }
+            else {
+                cdir = cdirnew;
+                if (za->open_flags & ZIP_CHECKCONS)
+                    best = _zip_checkcons(za, cdir, &error);
+                else {
+                    best = 0;
+                }
+            }
+            cdirnew = NULL;
+        }
+        
+        match++;
+        _zip_buffer_set_offset(buffer, (zip_uint64_t)(match - _zip_buffer_data(buffer)));
+    }
+
+    _zip_buffer_free(buffer);
     
     if (best < 0) {
-       set_error(zep, &zerr, 0);
-       _zip_cdir_free(cdir);
-       return NULL;
+        _zip_error_copy(&za->error, &error);
+        _zip_cdir_free(cdir);
+        return NULL;
     }
 
     return cdir;
 }
 
-\f
 
 static unsigned char *
-_zip_memmem(const unsigned char *big, int biglen, const unsigned char *little, 
-       int littlelen)
+_zip_memmem(const unsigned char *big, size_t biglen, const unsigned char *little, size_t littlelen)
 {
     const unsigned char *p;
     
@@ -592,11 +640,169 @@ _zip_memmem(const unsigned char *big, int biglen, const unsigned char *little,
        return NULL;
     p = big-1;
     while ((p=(const unsigned char *)
-               memchr(p+1, little[0], (size_t)(big-(p+1)+biglen-littlelen+1)))
-          != NULL) {
+               memchr(p+1, little[0], (size_t)(big-(p+1))+(size_t)(biglen-littlelen)+1)) != NULL) {
        if (memcmp(p+1, little+1, littlelen-1)==0)
            return (unsigned char *)p;
     }
 
     return NULL;
 }
+
+
+static zip_cdir_t *_zip_read_eocd(zip_buffer_t *buffer, zip_uint64_t buf_offset, unsigned int flags, zip_error_t *error)
+{
+    zip_cdir_t *cd;
+    zip_uint64_t i, nentry, size, offset, eocd_offset;
+
+    if (_zip_buffer_left(buffer) < EOCDLEN) {
+       zip_error_set(error, ZIP_ER_INCONS, 0);
+       return NULL;
+    }
+    
+    eocd_offset = _zip_buffer_offset(buffer);
+
+    _zip_buffer_get(buffer, 8); /* magic and number of disks already verified */
+
+    /* number of cdir-entries on this disk */
+    i = _zip_buffer_get_16(buffer);
+    /* number of cdir-entries */
+    nentry = _zip_buffer_get_16(buffer);
+
+    if (nentry != i) {
+       zip_error_set(error, ZIP_ER_NOZIP, 0);
+       return NULL;
+    }
+
+    size = _zip_buffer_get_32(buffer);
+    offset = _zip_buffer_get_32(buffer);
+
+    if (offset+size < offset) {
+        zip_error_set(error, ZIP_ER_SEEK, EFBIG);
+        return NULL;
+    }
+    
+    if (offset+size > buf_offset + eocd_offset) {
+       /* cdir spans past EOCD record */
+       zip_error_set(error, ZIP_ER_INCONS, 0);
+       return NULL;
+    }
+
+    if ((flags & ZIP_CHECKCONS) && offset+size != buf_offset + eocd_offset) {
+       zip_error_set(error, ZIP_ER_INCONS, 0);
+       return NULL;
+    }
+
+    if ((cd=_zip_cdir_new(nentry, error)) == NULL)
+       return NULL;
+
+    cd->size = size;
+    cd->offset = offset;
+    
+    return cd;
+}
+
+
+static zip_cdir_t *
+_zip_read_eocd64(zip_source_t *src, zip_buffer_t *buffer, zip_uint64_t buf_offset, unsigned int flags, zip_error_t *error)
+{
+    zip_cdir_t *cd;
+    zip_uint64_t offset;
+    zip_uint8_t eocd[EOCD64LEN];
+    zip_uint64_t eocd_offset;
+    zip_uint64_t size, nentry, i, eocdloc_offset;
+    bool free_buffer;
+
+    eocdloc_offset = _zip_buffer_offset(buffer);
+    
+    _zip_buffer_get(buffer, 8); /* magic and single disk already verified */
+    eocd_offset = _zip_buffer_get_64(buffer);
+    
+    if (eocd_offset > ZIP_INT64_MAX || eocd_offset + EOCD64LEN < eocd_offset) {
+        zip_error_set(error, ZIP_ER_SEEK, EFBIG);
+        return NULL;
+    }
+
+    if (eocd_offset + EOCD64LEN > eocdloc_offset + buf_offset) {
+       zip_error_set(error, ZIP_ER_INCONS, 0);
+       return NULL;
+    }
+
+    if (eocd_offset >= buf_offset && eocd_offset + EOCD64LEN <= buf_offset + _zip_buffer_size(buffer)) {
+        _zip_buffer_set_offset(buffer, eocd_offset - buf_offset);
+        free_buffer = false;
+    }
+    else {
+        if (zip_source_seek(src, (zip_int64_t)eocd_offset, SEEK_SET) < 0) {
+            _zip_error_set_from_source(error, src);
+            return NULL;
+        }
+        if ((buffer = _zip_buffer_new_from_source(src, EOCD64LEN, eocd, error)) == NULL) {
+            return NULL;
+        }
+        free_buffer = true;
+    }
+
+    if (memcmp(_zip_buffer_get(buffer, 4), EOCD64_MAGIC, 4) != 0) {
+       zip_error_set(error, ZIP_ER_INCONS, 0);
+        if (free_buffer) {
+            _zip_buffer_free(buffer);
+        }
+       return NULL;
+    }
+    
+    size = _zip_buffer_get_64(buffer);
+
+    if ((flags & ZIP_CHECKCONS) && size + eocd_offset + 12 != buf_offset + eocdloc_offset) {
+       zip_error_set(error, ZIP_ER_INCONS, 0);
+        if (free_buffer) {
+            _zip_buffer_free(buffer);
+        }
+        return NULL;
+    }
+
+    _zip_buffer_get(buffer, 12); /* skip version made by/needed and num disks */
+    
+    nentry = _zip_buffer_get_64(buffer);
+    i = _zip_buffer_get_64(buffer);
+
+    if (nentry != i) {
+       zip_error_set(error, ZIP_ER_MULTIDISK, 0);
+        if (free_buffer) {
+            _zip_buffer_free(buffer);
+        }
+       return NULL;
+    }
+
+    size = _zip_buffer_get_64(buffer);
+    offset = _zip_buffer_get_64(buffer);
+    
+    if (!_zip_buffer_ok(buffer)) {
+        zip_error_set(error, ZIP_ER_INTERNAL, 0);
+        if (free_buffer) {
+            _zip_buffer_free(buffer);
+        }
+        return NULL;
+    }
+
+    if (free_buffer) {
+        _zip_buffer_free(buffer);
+    }
+
+    if (offset > ZIP_INT64_MAX || offset+size < offset) {
+        zip_error_set(error, ZIP_ER_SEEK, EFBIG);
+        return NULL;
+    }
+    if ((flags & ZIP_CHECKCONS) && offset+size != eocd_offset) {
+       zip_error_set(error, ZIP_ER_INCONS, 0);
+       return NULL;
+    }
+
+    if ((cd=_zip_cdir_new(nentry, error)) == NULL)
+       return NULL;
+
+    
+    cd->size = size;
+    cd->offset = offset;
+
+    return cd;
+}
index d78bbe8..14e101d 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_rename.c -- rename file in zip archive
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <string.h>
 
+#define _ZIP_COMPILING_DEPRECATED
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_rename(struct zip *za, zip_uint64_t idx, const char *name)
+zip_rename(zip_t *za, zip_uint64_t idx, const char *name)
 {
-    const char *old_name;
-    int old_is_dir, new_is_dir;
-    
-    if (idx >= za->nentry || name[0] == '\0') {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-       return -1;
-    }
-
-    if (ZIP_IS_RDONLY(za)) {
-       _zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
-       return -1;
-    }
-
-    if ((old_name=zip_get_name(za, idx, 0)) == NULL)
-       return -1;
-                                                                   
-    new_is_dir = (name[strlen(name)-1] == '/');
-    old_is_dir = (old_name[strlen(old_name)-1] == '/');
-
-    if (new_is_dir != old_is_dir) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-       return -1;
-    }
-
-    return _zip_set_name(za, idx, name);
+    return zip_file_rename(za, idx, name, 0);
 }
index c444e78..eed019a 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_replace.c -- replace file via callback function
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
+#define _ZIP_COMPILING_DEPRECATED
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_replace(struct zip *za, zip_uint64_t idx, struct zip_source *source)
+zip_replace(zip_t *za, zip_uint64_t idx, zip_source_t *source)
 {
-    if (idx >= za->nentry || source == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-       return -1;
-    }
-
-    if (_zip_replace(za, idx, NULL, source) == -1)
-       return -1;
-
-    return 0;
-}
-
-
-\f
-
-/* NOTE: Signed due to -1 on error.  See zip_add.c for more details. */
-
-zip_int64_t
-_zip_replace(struct zip *za, zip_uint64_t idx, const char *name,
-            struct zip_source *source)
-{
-    if (ZIP_IS_RDONLY(za)) {
-       _zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
-       return -1;
-    }
-
-    if (idx == ZIP_UINT64_MAX) {
-       if (_zip_entry_new(za) == NULL)
-           return -1;
-
-       idx = za->nentry - 1;
-    }
-    
-    _zip_unchange_data(za->entry+idx);
-
-    if (name && _zip_set_name(za, idx, name) != 0)
-       return -1;
-    
-    za->entry[idx].state = ((za->cdir == NULL || idx >= za->cdir->nentry)
-                           ? ZIP_ST_ADDED : ZIP_ST_REPLACED);
-    za->entry[idx].source = source;
-
-    return idx;
+    return zip_file_replace(za, idx, source, 0);
 }
index 3bb85d1..9090eec 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_set_archive_comment.c -- set archive comment
-  Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_set_archive_comment(struct zip *za, const char *comment, int len)
+zip_set_archive_comment(zip_t *za, const char *comment, zip_uint16_t len)
 {
-    char *tmpcom;
+    zip_string_t *cstr;
 
-    if (len < 0 || len > MAXCOMLEN
-       || (len > 0 && comment == NULL)) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+    if (ZIP_IS_RDONLY(za)) {
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
        return -1;
     }
 
-    if (ZIP_IS_RDONLY(za)) {
-       _zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+    if (len > 0 && comment == NULL) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
        return -1;
     }
 
     if (len > 0) {
-       if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL)
+       if ((cstr=_zip_string_new((const zip_uint8_t *)comment, len, ZIP_FL_ENC_GUESS, &za->error)) == NULL)
+           return -1;
+
+       if (_zip_guess_encoding(cstr, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_CP437) {
+           _zip_string_free(cstr);
+           zip_error_set(&za->error, ZIP_ER_INVAL, 0);
            return -1;
+       }
     }
     else
-       tmpcom = NULL;
+       cstr = NULL;
 
-    free(za->ch_comment);
-    za->ch_comment = tmpcom;
-    za->ch_comment_len = len;
+    _zip_string_free(za->comment_changes);
+    za->comment_changes = NULL;
+
+    if (((za->comment_orig && _zip_string_equal(za->comment_orig, cstr))
+        || (za->comment_orig == NULL && cstr == NULL))) {
+       _zip_string_free(cstr);
+       za->comment_changed = 0;
+    }
+    else {
+       za->comment_changes = cstr;
+       za->comment_changed = 1;
+    }
     
     return 0;
 }
index e0e713a..2625b2e 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_get_archive_flag.c -- set archive global flag
-  Copyright (C) 2008-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2008-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_set_archive_flag(struct zip *za, int flag, int value)
+zip_set_archive_flag(zip_t *za, zip_flags_t flag, int value)
 {
     unsigned int new_flags;
     
@@ -51,14 +49,14 @@ zip_set_archive_flag(struct zip *za, int flag, int value)
        return 0;
 
     if (ZIP_IS_RDONLY(za)) {
-       _zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
        return -1;
     }
 
     if ((flag & ZIP_AFL_RDONLY) && value
        && (za->ch_flags & ZIP_AFL_RDONLY) == 0) {
        if (_zip_changed(za, NULL)) {
-           _zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
+           zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
            return -1;
        }
     }
index b9aa80a..ac098dc 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_set_default_password.c -- set default password for decryption
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 #include <string.h>
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_set_default_password(struct zip *za, const char *passwd)
+zip_set_default_password(zip_t *za, const char *passwd)
 {
     if (za == NULL)
        return -1;
@@ -51,7 +49,7 @@ zip_set_default_password(struct zip *za, const char *passwd)
     
     if (passwd) {
        if ((za->default_password=strdup(passwd)) == NULL) {
-           _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+           zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
            return -1;
        }
     }
index 6ae76a0..d356693 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_set_file_comment.c -- set comment for file in archive
-  Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 
+#define _ZIP_COMPILING_DEPRECATED
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_set_file_comment(struct zip *za, zip_uint64_t idx,
-                    const char *comment, int len)
+zip_set_file_comment(zip_t *za, zip_uint64_t idx, const char *comment, int len)
 {
-    char *tmpcom;
-
-    if (idx >= za->nentry
-       || len < 0 || len > MAXCOMLEN
-       || (len > 0 && comment == NULL)) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-       return -1;
-    }
-
-    if (ZIP_IS_RDONLY(za)) {
-       _zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
-       return -1;
+    if (len < 0 || len > ZIP_UINT16_MAX) {
+        zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+        return -1;
     }
-
-    if (len > 0) {
-       if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL)
-           return -1;
-    }
-    else
-       tmpcom = NULL;
-
-    free(za->entry[idx].ch_comment);
-    za->entry[idx].ch_comment = tmpcom;
-    za->entry[idx].ch_comment_len = len;
-    
-    return 0;
+    return zip_file_set_comment(za, idx, comment, (zip_uint16_t)len, 0);
 }
similarity index 53%
rename from lib/zip_entry_new.c
rename to lib/zip_set_file_compression.c
index ad5d599..7bb0bf9 100644 (file)
@@ -1,6 +1,6 @@
 /*
-  zip_entry_new.c -- create and init struct zip_entry
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  zip_set_file_compression.c -- set compression for file in archive
+  Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
-
-#include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
-struct zip_entry *
-_zip_entry_new(struct zip *za)
+ZIP_EXTERN int
+zip_set_file_compression(zip_t *za, zip_uint64_t idx, zip_int32_t method, zip_uint32_t flags)
 {
-    struct zip_entry *ze;
-    if (!za) {
-       ze = (struct zip_entry *)malloc(sizeof(struct zip_entry));
-       if (!ze) {
-           return NULL;
-       }
-    }
-    else {
-       if (za->nentry+1 >= za->nentry_alloc) {
-           struct zip_entry *rentries;
-           za->nentry_alloc += 16;
-           rentries = (struct zip_entry *)realloc(za->entry,
-                                                  sizeof(struct zip_entry)
-                                                  * za->nentry_alloc);
-           if (!rentries) {
-               _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
-               return NULL;
-           }
-           za->entry = rentries;
-       }
-       ze = za->entry+za->nentry;
+    zip_entry_t *e;
+    zip_int32_t old_method;
+
+    if (idx >= za->nentry) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
     }
 
-    ze->state = ZIP_ST_UNCHANGED;
+    if (ZIP_IS_RDONLY(za)) {
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+       return -1;
+    }
 
-    ze->ch_filename = NULL;
-    ze->ch_extra = NULL;
-    ze->ch_extra_len = -1;
-    ze->ch_comment = NULL;
-    ze->ch_comment_len = -1;
-    ze->source = NULL;
+    if (method != ZIP_CM_DEFAULT && method != ZIP_CM_STORE && method != ZIP_CM_DEFLATE) {
+       zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0);
+       return -1;
+    }
 
-    if (za)
-       za->nentry++;
+    e = za->entry+idx;
+    
+    old_method = (e->orig == NULL ? ZIP_CM_DEFAULT : e->orig->comp_method);
+    
+    /* TODO: revisit this when flags are supported, since they may require a recompression */
+    
+    if (method == old_method) {
+       if (e->changes) {
+           e->changes->changed &= ~ZIP_DIRENT_COMP_METHOD;
+           if (e->changes->changed == 0) {
+               _zip_dirent_free(e->changes);
+               e->changes = NULL;
+           }
+       }
+    }
+    else {
+        if (e->changes == NULL) {
+            if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) {
+                zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+                return -1;
+            }
+        }
 
-    return ze;
+        e->changes->comp_method = method;
+        e->changes->changed |= ZIP_DIRENT_COMP_METHOD;
+    }
+    
+    return 0;
 }
index 2a90601..5a10381 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_set_name.c -- rename helper function
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 #include <string.h>
 
 #include "zipint.h"
 
-\f
 
 int
-_zip_set_name(struct zip *za, zip_uint64_t idx, const char *name)
+_zip_set_name(zip_t *za, zip_uint64_t idx, const char *name, zip_flags_t flags)
 {
-    char *s;
+    zip_entry_t *e;
+    zip_string_t *str;
+    int changed;
     zip_int64_t i;
-    
-    if (idx >= za->nentry || name == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+
+    if (idx >= za->nentry) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    if (ZIP_IS_RDONLY(za)) {
+       zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
        return -1;
     }
 
-    if ((i=_zip_name_locate(za, name, 0, NULL)) != -1 && i != idx) {
-       _zip_error_set(&za->error, ZIP_ER_EXISTS, 0);
+    if (name && strlen(name) > 0) {
+        /* TODO: check for string too long */
+       if ((str=_zip_string_new((const zip_uint8_t *)name, (zip_uint16_t)strlen(name), flags, &za->error)) == NULL)
+           return -1;
+       if ((flags & ZIP_FL_ENCODING_ALL) == ZIP_FL_ENC_GUESS && _zip_guess_encoding(str, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_UTF8_GUESSED)
+           str->encoding = ZIP_ENCODING_UTF8_KNOWN;
+    }
+    else
+       str = NULL;
+
+    /* TODO: encoding flags needed for CP437? */
+    if ((i=_zip_name_locate(za, name, 0, NULL)) >= 0 && (zip_uint64_t)i != idx) {
+       _zip_string_free(str);
+       zip_error_set(&za->error, ZIP_ER_EXISTS, 0);
        return -1;
     }
 
     /* no effective name change */
-    if (i == idx)
+    if (i>=0 && (zip_uint64_t)i == idx) {
+       _zip_string_free(str);
        return 0;
-    
-    if ((s=strdup(name)) == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
-       return -1;
     }
-    
-    if (za->entry[idx].state == ZIP_ST_UNCHANGED) 
-       za->entry[idx].state = ZIP_ST_RENAMED;
 
-    free(za->entry[idx].ch_filename);
-    za->entry[idx].ch_filename = s;
+    e = za->entry+idx;
+
+    if (e->changes) {
+       _zip_string_free(e->changes->filename);
+       e->changes->filename = NULL;
+       e->changes->changed &= ~ZIP_DIRENT_FILENAME;
+    }
+
+    if (e->orig)
+       changed = !_zip_string_equal(e->orig->filename, str);
+    else
+       changed = 1;
+       
+    if (changed) {
+        if (e->changes == NULL) {
+            if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) {
+                zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+               _zip_string_free(str);
+                return -1;
+            }
+        }
+        e->changes->filename = str;
+        e->changes->changed |= ZIP_DIRENT_FILENAME;
+    }
+    else {
+       _zip_string_free(str);
+       if (e->changes && e->changes->changed == 0) {
+           _zip_dirent_free(e->changes);
+           e->changes = NULL;
+       }
+    }
 
     return 0;
 }
similarity index 74%
rename from lib/zip_source_pop.c
rename to lib/zip_source_begin_write.c
index 88d37da..0459337 100644 (file)
@@ -1,6 +1,6 @@
 /*
-  zip_source_pop.c -- pop top layer from zip data source
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  zip_source_begin_write.c -- start a new file for writing
+  Copyright (C) 2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
-
-#include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN struct zip_source *
-zip_source_pop(struct zip_source *src)
+ZIP_EXTERN int
+zip_source_begin_write(zip_source_t *src)
 {
-    struct zip_source *lower;
-
-    if (src == NULL)
-       return NULL;
-
-    lower = src->src;
-
-    if (lower == NULL)
-       zip_source_free(src);
-    else {
-       if (src->is_open)
-           (void)src->cb.l(src, src->ud, NULL, 0, ZIP_SOURCE_CLOSE);
-       (void)src->cb.l(src, src->ud, NULL, 0, ZIP_SOURCE_FREE);
-       
-       free(src);
+    if (ZIP_SOURCE_IS_OPEN_WRITING(src)) {
+        zip_error_set(&src->error, ZIP_ER_INVAL, 0);
+        return -1;
+    }
+    
+    if (_zip_source_call(src, NULL, 0, ZIP_SOURCE_BEGIN_WRITE) < 0) {
+        return -1;
     }
 
-    return lower;
+    src->write_state = ZIP_SOURCE_WRITE_OPEN;
+    
+    return 0;
 }
index af8bf19..4ecec6b 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_buffer.c -- create zip data source from buffer
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
-
+#include <errno.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include "zipint.h"
 
+#ifndef WRITE_FRAGMENT_SIZE
+#define WRITE_FRAGMENT_SIZE 64*1024
+#endif
+
+struct buffer {
+    zip_uint64_t fragment_size;                /* size of each fragment */
+
+    zip_uint8_t **fragments;           /* pointers to fragments */
+    zip_uint64_t nfragments;           /* number of allocated fragments */
+    zip_uint64_t fragments_capacity;   /* size of fragments (number of pointers) */
+    zip_uint64_t size;                 /* size of data in bytes */
+    zip_uint64_t offset;               /* current offset */
+    int free_data;
+};
+
+typedef struct buffer buffer_t;
+
 struct read_data {
-    const char *buf, *data, *end;
+    zip_error_t error;
     time_t mtime;
-    int freep;
+    buffer_t *in;
+    buffer_t *out;
 };
 
-static zip_int64_t read_data(void *, void *, zip_uint64_t, enum zip_source_cmd);
+static void buffer_free(buffer_t *buffer);
+static buffer_t *buffer_new(zip_uint64_t fragment_size);
+static buffer_t *buffer_new_read(const void *data, zip_uint64_t length, int free_data);
+static buffer_t *buffer_new_write(zip_uint64_t fragment_size);
+static zip_int64_t buffer_read(buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length);
+static int buffer_seek(buffer_t *buffer, void *data, zip_uint64_t len, zip_error_t *error);
+static zip_int64_t buffer_write(buffer_t *buffer, const zip_uint8_t *data, zip_uint64_t length, zip_error_t *);
 
-\f
+static zip_int64_t read_data(void *, void *, zip_uint64_t, zip_source_cmd_t);
 
-ZIP_EXTERN struct zip_source *
-zip_source_buffer(struct zip *za, const void *data, zip_uint64_t len, int freep)
-{
-    struct read_data *f;
-    struct zip_source *zs;
 
+ZIP_EXTERN zip_source_t *
+zip_source_buffer(zip_t *za, const void *data, zip_uint64_t len, int freep)
+{
     if (za == NULL)
        return NULL;
 
+    return zip_source_buffer_create(data, len, freep, &za->error);
+}
+
+
+ZIP_EXTERN zip_source_t *
+zip_source_buffer_create(const void *data, zip_uint64_t len, int freep, zip_error_t *error)
+{
+    struct read_data *ctx;
+    zip_source_t *zs;
+
     if (data == NULL && len > 0) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       zip_error_set(error, ZIP_ER_INVAL, 0);
        return NULL;
     }
 
-    if ((f=(struct read_data *)malloc(sizeof(*f))) == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+    if ((ctx=(struct read_data *)malloc(sizeof(*ctx))) == NULL) {
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
        return NULL;
     }
 
-    f->data = (const char *)data;
-    f->end = ((const char *)data)+len;
-    f->freep = freep;
-    f->mtime = time(NULL);
+    if ((ctx->in = buffer_new_read(data, len, freep)) == NULL) {
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
+       free(ctx);
+       return NULL;
+    }
+
+    ctx->out = NULL;
+    ctx->mtime = time(NULL);
+    zip_error_init(&ctx->error);
     
-    if ((zs=zip_source_function(za, read_data, f)) == NULL) {
-       free(f);
+    if ((zs=zip_source_function_create(read_data, ctx, error)) == NULL) {
+       buffer_free(ctx->in);
+       free(ctx);
        return NULL;
     }
 
     return zs;
 }
 
-\f
 
 static zip_int64_t
-read_data(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd)
+read_data(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd)
 {
-    struct read_data *z;
-    char *buf;
-    zip_uint64_t n;
-
-    z = (struct read_data *)state;
-    buf = (char *)data;
+    struct read_data *ctx = (struct read_data *)state;
 
     switch (cmd) {
-    case ZIP_SOURCE_OPEN:
-       z->buf = z->data;
-       return 0;
-       
-    case ZIP_SOURCE_READ:
-       /* XXX: return error if (len > ZIP_INT64_MAX) */
+        case ZIP_SOURCE_BEGIN_WRITE:
+           if ((ctx->out = buffer_new_write(WRITE_FRAGMENT_SIZE)) == NULL) {
+               zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0);
+               return -1;
+           }
+           return 0;
 
-       n = z->end - z->buf;
-       if (n > len)
-           n = len;
+        case ZIP_SOURCE_CLOSE:
+            return 0;
+            
+        case ZIP_SOURCE_COMMIT_WRITE:
+           buffer_free(ctx->in);
+           ctx->in = ctx->out;
+           ctx->out = NULL;
+           return 0;
 
-       if (n) {
-           memcpy(buf, z->buf, n);
-           z->buf += n;
+        case ZIP_SOURCE_ERROR:
+            return zip_error_to_data(&ctx->error, data, len);
+            
+        case ZIP_SOURCE_FREE:
+           buffer_free(ctx->in);
+           buffer_free(ctx->out);
+            free(ctx);
+            return 0;
+            
+        case ZIP_SOURCE_OPEN:
+           ctx->in->offset = 0;
+            return 0;
+       
+        case ZIP_SOURCE_READ:
+           if (len > ZIP_INT64_MAX) {
+               zip_error_set(&ctx->error, ZIP_ER_INVAL, 0);
+               return -1;
+           }
+            return buffer_read(ctx->in, data, len);
+       
+        case ZIP_SOURCE_REMOVE:
+       {
+           buffer_t *empty = buffer_new_read(NULL, 0, 0);
+           if (empty == 0) {
+               zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0);
+               return -1;
+           }
+       
+           buffer_free(ctx->in);
+           ctx->in = empty;
+           return 0;
        }
 
-       return n;
-       
-    case ZIP_SOURCE_CLOSE:
-       return 0;
+        case ZIP_SOURCE_ROLLBACK_WRITE:
+           buffer_free(ctx->out);
+           ctx->out = NULL;
+           return 0;
+
+        case ZIP_SOURCE_SEEK:
+           return buffer_seek(ctx->in, data, len, &ctx->error);
 
-    case ZIP_SOURCE_STAT:
+        case ZIP_SOURCE_SEEK_WRITE:
+           return buffer_seek(ctx->out, data, len, &ctx->error);
+       
+        case ZIP_SOURCE_STAT:
         {
-           struct zip_stat *st;
+            zip_stat_t *st;
            
-           if (len < sizeof(*st))
+           if (len < sizeof(*st)) {
+                zip_error_set(&ctx->error, ZIP_ER_INVAL, 0);
                return -1;
+           }
 
-           st = (struct zip_stat *)data;
+           st = (zip_stat_t *)data;
 
            zip_stat_init(st);
-           st->mtime = z->mtime;
-           st->size = z->end - z->data;
+           st->mtime = ctx->mtime;
+           st->size = ctx->in->size;
            st->comp_size = st->size;
            st->comp_method = ZIP_CM_STORE;
            st->encryption_method = ZIP_EM_NONE;
-           st->valid = ZIP_STAT_MTIME|ZIP_STAT_SIZE|ZIP_STAT_COMP_SIZE
-               |ZIP_STAT_COMP_METHOD|ZIP_STAT_ENCRYPTION_METHOD;
+           st->valid = ZIP_STAT_MTIME|ZIP_STAT_SIZE|ZIP_STAT_COMP_SIZE|ZIP_STAT_COMP_METHOD|ZIP_STAT_ENCRYPTION_METHOD;
            
            return sizeof(*st);
        }
 
-    case ZIP_SOURCE_ERROR:
-       {
-           int *e;
+        case ZIP_SOURCE_SUPPORTS:
+           return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_SEEK, ZIP_SOURCE_TELL, ZIP_SOURCE_BEGIN_WRITE, ZIP_SOURCE_COMMIT_WRITE, ZIP_SOURCE_REMOVE, ZIP_SOURCE_ROLLBACK_WRITE, ZIP_SOURCE_SEEK_WRITE, ZIP_SOURCE_TELL_WRITE, ZIP_SOURCE_WRITE, -1);
+            
+        case ZIP_SOURCE_TELL:
+            if (ctx->in->offset > ZIP_INT64_MAX) {
+               zip_error_set(&ctx->error, ZIP_ER_TELL, EOVERFLOW);
+               return -1;
+           }
+           return (zip_int64_t)ctx->in->offset;
+               
+            
+        case ZIP_SOURCE_TELL_WRITE:
+            if (ctx->out->offset > ZIP_INT64_MAX) {
+               zip_error_set(&ctx->error, ZIP_ER_TELL, EOVERFLOW);
+               return -1;
+           }
+           return (zip_int64_t)ctx->out->offset;
 
-           if (len < sizeof(int)*2)
+        case ZIP_SOURCE_WRITE:
+           if (len > ZIP_INT64_MAX) {
+               zip_error_set(&ctx->error, ZIP_ER_INVAL, 0);
                return -1;
+           }
+           return buffer_write(ctx->out, data, len, &ctx->error);
+
+        default:
+           zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0);
+            return -1;
+    }
+}
 
-           e = (int *)data;
-           e[0] = e[1] = 0;
+
+static void
+buffer_free(buffer_t *buffer)
+{
+    if (buffer == NULL) {
+       return; 
+    }
+
+    if (buffer->free_data) {
+       zip_uint64_t i;
+
+       for (i=0; i < buffer->nfragments; i++) {
+           free(buffer->fragments[i]);
        }
-       return sizeof(int)*2;
+    }
+    free(buffer->fragments);
+    free(buffer);
+}
+
+
+static buffer_t *
+buffer_new(zip_uint64_t fragment_size)
+{
+    buffer_t *buffer;
+
+    if ((buffer = malloc(sizeof(*buffer))) == NULL) {
+       return NULL;
+    }
+
+    buffer->fragment_size = fragment_size;
+    buffer->offset = 0;
+    buffer->free_data = 0;
+    buffer->nfragments = 0;
+    buffer->fragments_capacity = 0;
+    buffer->fragments = NULL;
+    buffer->size = 0;
+
+    return buffer;
+}
+
+
+static buffer_t *
+buffer_new_read(const void *data, zip_uint64_t length, int free_data)
+{
+    buffer_t *buffer;
+
+    if ((buffer = buffer_new(length)) == NULL) {
+       return NULL;
+    }
+
+    buffer->size = length;
 
-    case ZIP_SOURCE_FREE:
-       if (z->freep) {
-           free((void *)z->data);
-           z->data = NULL;
+    if (length > 0) {
+       if ((buffer->fragments = malloc(sizeof(*(buffer->fragments)))) == NULL) {
+           buffer_free(buffer);
+           return NULL;
        }
-       free(z);
+       buffer->fragments_capacity = 1;
+
+       buffer->nfragments = 1;
+       buffer->fragments[0] = (zip_uint8_t *)data;
+       buffer->free_data = free_data;
+    }
+
+    return buffer;
+}
+
+
+static buffer_t *
+buffer_new_write(zip_uint64_t fragment_size)
+{
+    buffer_t *buffer;
+
+    if ((buffer = buffer_new(fragment_size)) == NULL) {
+       return NULL;
+    }
+
+    if ((buffer->fragments = malloc(sizeof(*(buffer->fragments)))) == NULL) {
+       buffer_free(buffer);
+       return NULL;
+    }
+    buffer->fragments_capacity = 1;
+    buffer->nfragments = 0;
+    buffer->free_data = 1;
+
+    return buffer;
+}
+
+
+static zip_int64_t
+buffer_read(buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length)
+{
+    zip_uint64_t n, i, fragment_offset;
+
+    length = ZIP_MIN(length, buffer->size - buffer->offset);
+
+    if (length == 0) {
        return 0;
+    }
+    if (length > ZIP_INT64_MAX) {
+       return -1;
+    }
+
+    i = buffer->offset / buffer->fragment_size;
+    fragment_offset = buffer->offset % buffer->fragment_size;
+    n = 0;
+    while (n < length) {
+       zip_uint64_t left = ZIP_MIN(length - n, buffer->fragment_size - fragment_offset);
+       
+       memcpy(data + n, buffer->fragments[i] + fragment_offset, left);
+
+       n += left;
+       i++;
+       fragment_offset = 0;
+    }
+
+    buffer->offset += n;
+    return (zip_int64_t)n;
+}
+
+
+static int
+buffer_seek(buffer_t *buffer, void *data, zip_uint64_t len, zip_error_t *error)
+{
+    zip_int64_t new_offset = zip_source_seek_compute_offset(buffer->offset, buffer->size, data, len, error);
+    
+    if (new_offset < 0) {
+        return -1;
+    }
+    
+    buffer->offset = (zip_uint64_t)new_offset;
+    return 0;
+}
+
+
+static zip_int64_t
+buffer_write(buffer_t *buffer, const zip_uint8_t *data, zip_uint64_t length, zip_error_t *error)
+{
+    zip_uint64_t n, i, fragment_offset;
+
+    if (buffer->offset + length + buffer->fragment_size - 1 < length) {
+       zip_error_set(error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    /* grow buffer if needed */
+    if (buffer->offset + length > buffer->nfragments * buffer->fragment_size) {
+       zip_uint64_t needed_fragments = (buffer->offset + length + buffer->fragment_size - 1) / buffer->fragment_size;
+       
+       if (needed_fragments > buffer->fragments_capacity) {
+           zip_uint64_t new_capacity = buffer->fragments_capacity;
+
+           while (new_capacity < needed_fragments) {
+               new_capacity *= 2;
+           }
+
+           zip_uint8_t **fragments = realloc(buffer->fragments, new_capacity * sizeof(*fragments));
+
+           if (fragments == NULL) {
+               zip_error_set(error, ZIP_ER_MEMORY, 0);
+               return -1;
+           }
+
+           buffer->fragments = fragments;
+           buffer->fragments_capacity = new_capacity;
+       }
+
+       while (buffer->nfragments < needed_fragments) {
+           if ((buffer->fragments[buffer->nfragments] = malloc(buffer->fragment_size)) == NULL) {
+               zip_error_set(error, ZIP_ER_MEMORY, 0);
+               return -1;
+           }
+           buffer->nfragments++;
+       }
+    }
+
+    i = buffer->offset / buffer->fragment_size;
+    fragment_offset = buffer->offset % buffer->fragment_size;
+    n = 0;
+    while (n < length) {
+       zip_uint64_t left = ZIP_MIN(length - n, buffer->fragment_size - fragment_offset);
+               
+       memcpy(buffer->fragments[i] + fragment_offset, data + n, left);
+
+       n += left;
+       i++;
+       fragment_offset = 0;
+    }
 
-    default:
-       ;
+    buffer->offset += n;
+    if (buffer->offset > buffer->size) {
+       buffer->size = buffer->offset;
     }
 
-    return -1;
+    return (zip_int64_t)n;
 }
diff --git a/lib/zip_source_call.c b/lib/zip_source_call.c
new file mode 100644 (file)
index 0000000..21f28bc
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ zip_source_call.c -- invoke callback command on zip_source
+ Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
+ This file is part of libzip, a library to manipulate ZIP archives.
+ The authors can be contacted at <libzip@nih.at>
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 3. The names of the authors may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#include "zipint.h"
+
+
+zip_int64_t
+_zip_source_call(zip_source_t *src, void *data, zip_uint64_t length, zip_source_cmd_t command)
+{
+    zip_int64_t ret;
+    
+    if ((src->supports & ZIP_SOURCE_MAKE_COMMAND_BITMASK(command)) == 0) {
+        zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0);
+        return -1;
+    }
+
+    if (src->src == NULL) {
+        ret = src->cb.f(src->ud, data, length, command);
+    }
+    else {
+        ret = src->cb.l(src->src, src->ud, data, length, command);
+    }
+    
+    if (ret < 0) {
+        if (command != ZIP_SOURCE_ERROR && command != ZIP_SOURCE_SUPPORTS) {
+            int e[2];
+            
+            if (_zip_source_call(src, e, sizeof(e), ZIP_SOURCE_ERROR) < 0) {
+                zip_error_set(&src->error, ZIP_ER_INTERNAL, 0);
+            }
+            else {
+                zip_error_set(&src->error, e[0], e[1]);
+            }
+        }
+    }
+
+    return ret;
+}
index 882a199..36bc842 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_close.c -- close zip_source (stop reading)
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN void
-zip_source_close(struct zip_source *src)
+int
+zip_source_close(zip_source_t *src)
 {
-    if (!src->is_open)
-       return;
-
-    if (src->src == NULL)
-       (void)src->cb.f(src->ud, NULL, 0, ZIP_SOURCE_CLOSE);
-    else {
-       (void)src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_CLOSE);
-       zip_source_close(src->src);
+    if (!ZIP_SOURCE_IS_OPEN_READING(src)) {
+        zip_error_set(&src->error, ZIP_ER_INVAL, 0);
+        return -1;
     }
     
-    src->is_open = 0;
+    src->open_count--;
+    if (src->open_count == 0) {
+       _zip_source_call(src, NULL, 0, ZIP_SOURCE_CLOSE);
+
+       if (ZIP_SOURCE_IS_LAYERED(src)) {
+           if (zip_source_close(src->src) < 0) {
+               zip_error_set(&src->error, ZIP_ER_INTERNAL, 0);
+           }
+       }
+    }
+
+    return 0;
 }
similarity index 69%
rename from lib/zip_set_file_extra.c
rename to lib/zip_source_commit_write.c
index 9b80bde..ba77abc 100644 (file)
@@ -1,6 +1,6 @@
 /*
-  zip_set_file_extra.c -- set extra field for file in archive
-  Copyright (C) 2006-2010 Dieter Baron and Thomas Klausner
+  zip_source_commit_write.c -- commit changes to file
+  Copyright (C) 2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -17,7 +17,7 @@
   3. The names of the authors may not be used to endorse or promote
      products derived from this software without specific prior
      written permission.
-
   THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 */
 
 
-
-#include <stdlib.h>
-
 #include "zipint.h"
 
 
-
 ZIP_EXTERN int
-zip_set_file_extra(struct zip *za, zip_uint64_t idx,
-                  const char *extra, int len)
+zip_source_commit_write(zip_source_t *src)
 {
-    char *tmpext;
-
-    if (idx >= za->nentry
-       || len < 0 || len > MAXEXTLEN
-       || (len > 0 && extra == NULL)) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-       return -1;
+    if (!ZIP_SOURCE_IS_OPEN_WRITING(src)) {
+        zip_error_set(&src->error, ZIP_ER_INVAL, 0);
+        return -1;
     }
-
-    if (ZIP_IS_RDONLY(za)) {
-       _zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
+    
+    if (src->open_count > 1) {
+       zip_error_set(&src->error, ZIP_ER_INUSE, 0);
        return -1;
     }
-
-    if (len > 0) {
-       if ((tmpext=(char *)_zip_memdup(extra, len, &za->error)) == NULL)
+    else if (ZIP_SOURCE_IS_OPEN_READING(src)) {
+        if (zip_source_close(src) < 0) {
            return -1;
+       }
     }
-    else
-       tmpext = NULL;
-
-    free(za->entry[idx].ch_extra);
-    za->entry[idx].ch_extra = tmpext;
-    za->entry[idx].ch_extra_len = len;
-
+    
+    if (_zip_source_call(src, NULL, 0, ZIP_SOURCE_COMMIT_WRITE) < 0) {
+        src->write_state = ZIP_SOURCE_WRITE_FAILED;
+        return -1;
+    }
+    
+    src->write_state = ZIP_SOURCE_WRITE_CLOSED;
+    
     return 0;
 }
index 59e8a19..eed7266 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_crc.c -- pass-through source that calculates CRC32 and size
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 #include <string.h>
+#include <limits.h>
 
 #include "zipint.h"
 
-struct crc {
+struct crc_context {
     int eof;
     int validate;
-    int e[2];
+    zip_error_t error;
     zip_uint64_t size;
     zip_uint32_t crc;
 };
 
-static zip_int64_t crc_read(struct zip_source *, void *, void *
-                           , zip_uint64_t, enum zip_source_cmd);
+static zip_int64_t crc_read(zip_source_t *, void *, void *, zip_uint64_t, zip_source_cmd_t);
 
-\f
 
-ZIP_EXTERN struct zip_source *
-zip_source_crc(struct zip *za, struct zip_source *src, int validate)
+zip_source_t *
+zip_source_crc(zip_t *za, zip_source_t *src, int validate)
 {
-    struct crc *ctx;
+    struct crc_context *ctx;
 
     if (src == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
        return NULL;
     }
 
-    if ((ctx=(struct crc *)malloc(sizeof(*ctx))) == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+    if ((ctx=(struct crc_context *)malloc(sizeof(*ctx))) == NULL) {
+       zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
        return NULL;
     }
 
+    ctx->eof = 0;
     ctx->validate = validate;
-
+    zip_error_init(&ctx->error);
+    ctx->size = 0;
+    ctx->crc = 0;
+    
     return zip_source_layered(za, src, crc_read, ctx);
 }
 
-\f
 
 static zip_int64_t
-crc_read(struct zip_source *src, void *_ctx, void *data,
-        zip_uint64_t len, enum zip_source_cmd cmd)
+crc_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_source_cmd_t cmd)
 {
-    struct crc *ctx;
+    struct crc_context *ctx;
     zip_int64_t n;
 
-    ctx = (struct crc *)_ctx;
+    ctx = (struct crc_context *)_ctx;
 
     switch (cmd) {
-    case ZIP_SOURCE_OPEN:
-       ctx->eof = 0;
-       ctx->crc = crc32(0, NULL, 0);
-       ctx->size = 0;
-
-       return 0;
-
-    case ZIP_SOURCE_READ:
-       if (ctx->eof || len == 0)
-           return 0;
-
-       if ((n=zip_source_read(src, data, len)) < 0)
-           return ZIP_SOURCE_ERR_LOWER;
-
-       if (n == 0) {
-           ctx->eof = 1;
-           if (ctx->validate) {
-               struct zip_stat st;
-
-               if (zip_source_stat(src, &st) < 0)
-                   return ZIP_SOURCE_ERR_LOWER;
-
-               if ((st.valid & ZIP_STAT_CRC) && st.crc != ctx->crc) {
-                   ctx->e[0] = ZIP_ER_CRC;
-                   ctx->e[1] = 0;
-                   
-                   return -1;
-               }
-               if ((st.valid & ZIP_STAT_SIZE) && st.size != ctx->size) {
-                   ctx->e[0] = ZIP_ER_INCONS;
-                   ctx->e[1] = 0;
-                   
-                   return -1;
+        case ZIP_SOURCE_OPEN:
+            ctx->eof = 0;
+            ctx->crc = (zip_uint32_t)crc32(0, NULL, 0);
+            ctx->size = 0;
+            
+            return 0;
+            
+        case ZIP_SOURCE_READ:
+            if (ctx->eof || len == 0)
+                return 0;
+            
+            if ((n=zip_source_read(src, data, len)) < 0) {
+                _zip_error_set_from_source(&ctx->error, src);
+                return -1;
+            }
+            
+            if (n == 0) {
+                ctx->eof = 1;
+                if (ctx->validate) {
+                    struct zip_stat st;
+                    
+                    if (zip_source_stat(src, &st) < 0) {
+                        _zip_error_set_from_source(&ctx->error, src);
+                        return -1;
+                    }
+                    
+                    if ((st.valid & ZIP_STAT_CRC) && st.crc != ctx->crc) {
+                        zip_error_set(&ctx->error, ZIP_ER_CRC, 0);
+                        return -1;
+                    }
+                    if ((st.valid & ZIP_STAT_SIZE) && st.size != ctx->size) {
+                        zip_error_set(&ctx->error, ZIP_ER_INCONS, 0);
+                        return -1;
+                    }
+                }
+            }
+            else {
+               zip_uint64_t i, nn;
+
+               for (i=0; i < (zip_uint64_t)n; i += nn) {
+                   nn = ZIP_MIN(UINT_MAX, (zip_uint64_t)n-i);
+
+                   ctx->crc = (zip_uint32_t)crc32(ctx->crc, (const Bytef *)data+i, (uInt)nn);
                }
-           }
-       }
-       else {
-           ctx->size += n;
-           ctx->crc = crc32(ctx->crc, data, n);
-       }
-       return n;
+                ctx->size += (zip_uint64_t)n;
+            }
+            return n;
 
-    case ZIP_SOURCE_CLOSE:
-       return 0;
+        case ZIP_SOURCE_CLOSE:
+            return 0;
 
-    case ZIP_SOURCE_STAT:
-       {
-           struct zip_stat *st;
+        case ZIP_SOURCE_STAT:
+        {
+            zip_stat_t *st;
 
-           st = (struct zip_stat *)data;
+           st = (zip_stat_t *)data;
 
            if (ctx->eof) {
-               /* XXX: Set comp_size, comp_method, encryption_method?
+               /* TODO: Set comp_size, comp_method, encryption_method?
                        After all, this only works for uncompressed data. */
                st->size = ctx->size;
                st->crc = ctx->crc;
-               st->valid |= ZIP_STAT_SIZE|ZIP_STAT_CRC;
+               st->comp_size = ctx->size;
+               st->comp_method = ZIP_CM_STORE;
+               st->encryption_method = ZIP_EM_NONE;
+               st->valid |= ZIP_STAT_SIZE|ZIP_STAT_CRC|ZIP_STAT_COMP_SIZE|ZIP_STAT_COMP_METHOD|ZIP_STAT_ENCRYPTION_METHOD;;
            }
-       }
-       return 0;
-       
-    case ZIP_SOURCE_ERROR:
-       memcpy(data, ctx->e, sizeof(ctx->e));
-       return 0;
-
-    case ZIP_SOURCE_FREE:
-       free(ctx);
-       return 0;
-
-    default:
-       return -1;
+            return 0;
+        }
+            
+        case ZIP_SOURCE_ERROR:
+            return zip_error_to_data(&ctx->error, data, len);
+
+        case ZIP_SOURCE_FREE:
+            free(ctx);
+            return 0;
+            
+        case ZIP_SOURCE_SUPPORTS:
+            return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, -1);
+            
+        default:
+            zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0);
+            return -1;
     }
-    
 }
index 0cbcd7c..2574ad0 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_deflate.c -- deflate (de)compressoin routines
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2015 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
-
 #include <stdlib.h>
 #include <string.h>
+#include <limits.h>
 
 #include "zipint.h"
 
 struct deflate {
-    int e[2];
-
-    int eof;
+    zip_error_t error;
+    
+    bool eof;
+    bool can_store;
+    bool is_stored;
     int mem_level;
     zip_uint64_t size;
-    char buffer[BUFSIZE];
+    zip_uint8_t buffer[BUFSIZE];
     z_stream zstr;
 };
 
-static zip_int64_t compress_read(struct zip_source *, struct deflate *,
-                                void *, zip_uint64_t);
-static zip_int64_t decompress_read(struct zip_source *, struct deflate *,
-                                  void *, zip_uint64_t);
-static zip_int64_t deflate_compress(struct zip_source *, void *, void *,
-                                   zip_uint64_t, enum zip_source_cmd);
-static zip_int64_t deflate_decompress(struct zip_source *, void *, void *,
-                                     zip_uint64_t, enum zip_source_cmd);
+static zip_int64_t compress_read(zip_source_t *, struct deflate *, void *, zip_uint64_t);
+static zip_int64_t decompress_read(zip_source_t *, struct deflate *, void *, zip_uint64_t);
+static zip_int64_t deflate_compress(zip_source_t *, void *, void *, zip_uint64_t, zip_source_cmd_t);
+static zip_int64_t deflate_decompress(zip_source_t *, void *, void *, zip_uint64_t, zip_source_cmd_t);
 static void deflate_free(struct deflate *);
 
-\f
 
-ZIP_EXTERN struct zip_source *
-zip_source_deflate(struct zip *za, struct zip_source *src,
-                  zip_uint16_t cm, int flags)
+zip_source_t *
+zip_source_deflate(zip_t *za, zip_source_t *src, zip_int32_t cm, int flags)
 {
     struct deflate *ctx;
-    struct zip_source *s2;
+    zip_source_t *s2;
 
-    if (src == NULL || cm != ZIP_CM_DEFLATE) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+    if (src == NULL || (cm != ZIP_CM_DEFLATE && !ZIP_CM_IS_DEFAULT(cm))) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
        return NULL;
     }
 
     if ((ctx=(struct deflate *)malloc(sizeof(*ctx))) == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+       zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
        return NULL;
     }
 
-    ctx->e[0] = ctx->e[1] = 0;
-    ctx->eof = 0;
+    zip_error_init(&ctx->error);
+    ctx->eof = false;
+    ctx->is_stored = false;
+    ctx->can_store = ZIP_CM_IS_DEFAULT(cm);
     if (flags & ZIP_CODEC_ENCODE) {
-       if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0))
-           ctx->mem_level = TORRENT_MEM_LEVEL;
-       else
-           ctx->mem_level = MAX_MEM_LEVEL;
+       ctx->mem_level = MAX_MEM_LEVEL;
     }
 
     if ((s2=zip_source_layered(za, src,
@@ -97,35 +91,56 @@ zip_source_deflate(struct zip *za, struct zip_source *src,
     return s2;
 }
 
-\f
 
 static zip_int64_t
-compress_read(struct zip_source *src, struct deflate *ctx,
-             void *data, zip_uint64_t len)
+compress_read(zip_source_t *src, struct deflate *ctx, void *data, zip_uint64_t len)
 {
     int end, ret;
     zip_int64_t n;
+    zip_uint64_t out_offset;
+    uInt out_len;
 
-    if (ctx->e[0] != 0)
+    if (zip_error_code_zip(&ctx->error) != ZIP_ER_OK)
        return -1;
     
-    if (len == 0)
+    if (len == 0 || ctx->is_stored) {
        return 0;
+    }
        
+    out_offset = 0;
+    out_len = (uInt)ZIP_MIN(UINT_MAX, len);
     ctx->zstr.next_out = (Bytef *)data;
-    ctx->zstr.avail_out = len;
+    ctx->zstr.avail_out = out_len;
 
     end = 0;
     while (!end) {
        ret = deflate(&ctx->zstr, ctx->eof ? Z_FINISH : 0);
 
        switch (ret) {
+        case Z_STREAM_END:
+            if (ctx->can_store && ctx->zstr.total_in <= ctx->zstr.total_out) {
+                ctx->is_stored = true;
+                ctx->size = ctx->zstr.total_in;
+                memcpy(data, ctx->buffer, ctx->size);
+                return (zip_int64_t)ctx->size;
+            }
+            /* fallthrough */
        case Z_OK:
-       case Z_STREAM_END:
            /* all ok */
 
-           if (ctx->zstr.avail_out == 0
-               || (ctx->eof && ctx->zstr.avail_in == 0))
+           if (ctx->zstr.avail_out == 0) {
+               out_offset += out_len;
+               if (out_offset < len) {
+                   out_len = (uInt)ZIP_MIN(UINT_MAX, len-out_offset);
+                   ctx->zstr.next_out = (Bytef *)data+out_offset;
+                   ctx->zstr.avail_out = out_len;
+               }
+               else {
+                    ctx->can_store = false;
+                   end = 1;
+               }
+           }
+           else if (ctx->eof && ctx->zstr.avail_in == 0)
                end = 1;
            break;
 
@@ -136,20 +151,23 @@ compress_read(struct zip_source *src, struct deflate *ctx,
                    break;
                }
 
-               if ((n=zip_source_read(src, ctx->buffer,
-                                      sizeof(ctx->buffer))) < 0) {
-                   zip_source_error(src, ctx->e, ctx->e+1);
+               if ((n=zip_source_read(src, ctx->buffer, sizeof(ctx->buffer))) < 0) {
+                    _zip_error_set_from_source(&ctx->error, src);
                    end = 1;
                    break;
                }
                else if (n == 0) {
-                   ctx->eof = 1;
+                   ctx->eof = true;
+                   /* TODO: check against stat of src? */
                    ctx->size = ctx->zstr.total_in;
-                   /* XXX: check against stat of src? */
                }
                else {
+                    if (ctx->zstr.total_in > 0) {
+                        /* we overwrote a previously filled ctx->buffer */
+                        ctx->can_store = false;
+                    }
                    ctx->zstr.next_in = (Bytef *)ctx->buffer;
-                   ctx->zstr.avail_in = n;
+                   ctx->zstr.avail_in = (uInt)n;
                }
                continue;
            }
@@ -158,44 +176,58 @@ compress_read(struct zip_source *src, struct deflate *ctx,
        case Z_DATA_ERROR:
        case Z_STREAM_ERROR:
        case Z_MEM_ERROR:
-           ctx->e[0] = ZIP_ER_ZLIB;
-           ctx->e[1] = ret;
+            zip_error_set(&ctx->error, ZIP_ER_ZLIB, ret);
 
            end = 1;
            break;
        }
     }
 
-    if (ctx->zstr.avail_out < len)
-       return len - ctx->zstr.avail_out;
+    if (ctx->zstr.avail_out < len) {
+       ctx->can_store = false;
+       return (zip_int64_t)(len - ctx->zstr.avail_out);
+    }
 
-    return (ctx->e[0] == 0) ? 0 : -1;
+    return (zip_error_code_zip(&ctx->error) == ZIP_ER_OK) ? 0 : -1;
 }
 
-\f
 
 static zip_int64_t
-decompress_read(struct zip_source *src, struct deflate *ctx,
-               void *data, zip_uint64_t len)
+decompress_read(zip_source_t *src, struct deflate *ctx, void *data, zip_uint64_t len)
 {
     int end, ret;
     zip_int64_t n;
+    zip_uint64_t out_offset;
+    uInt out_len;
 
-    if (ctx->e[0] != 0)
+    if (zip_error_code_zip(&ctx->error) != ZIP_ER_OK)
        return -1;
     
     if (len == 0)
        return 0;
-       
+
+    out_offset = 0;
+    out_len = (uInt)ZIP_MIN(UINT_MAX, len);
     ctx->zstr.next_out = (Bytef *)data;
-    ctx->zstr.avail_out = len;
+    ctx->zstr.avail_out = out_len;
 
     end = 0;
-    while (!end && ctx->zstr.avail_out) {
+    while (!end) {
        ret = inflate(&ctx->zstr, Z_SYNC_FLUSH);
 
        switch (ret) {
        case Z_OK:
+           if (ctx->zstr.avail_out == 0) {
+               out_offset += out_len;
+               if (out_offset < len) {
+                   out_len = (uInt)ZIP_MIN(UINT_MAX, len-out_offset);
+                   ctx->zstr.next_out = (Bytef *)data+out_offset;
+                   ctx->zstr.avail_out = out_len;
+               }
+               else {
+                   end = 1;
+               }
+           }
            break;
            
        case Z_STREAM_END:
@@ -210,17 +242,17 @@ decompress_read(struct zip_source *src, struct deflate *ctx,
                    break;
                }
 
-               if ((n=zip_source_read(src, ctx->buffer,
-                           sizeof(ctx->buffer))) < 0) {
-                   zip_source_error(src, ctx->e, ctx->e+1);
+               if ((n=zip_source_read(src, ctx->buffer, sizeof(ctx->buffer))) < 0) {
+                    _zip_error_set_from_source(&ctx->error, src);
                    end = 1;
                    break;
                }
-               else if (n == 0)
+               else if (n == 0) {
                    ctx->eof = 1;
+               }
                else {
                    ctx->zstr.next_in = (Bytef *)ctx->buffer;
-                   ctx->zstr.avail_in = n;
+                   ctx->zstr.avail_in = (uInt)n;
                }
                continue;
            }
@@ -229,24 +261,21 @@ decompress_read(struct zip_source *src, struct deflate *ctx,
        case Z_DATA_ERROR:
        case Z_STREAM_ERROR:
        case Z_MEM_ERROR:
-           ctx->e[0] = ZIP_ER_ZLIB;
-           ctx->e[1] = ret;
+            zip_error_set(&ctx->error, ZIP_ER_ZLIB, ret);
            end = 1;
            break;
        }
     }
 
     if (ctx->zstr.avail_out < len)
-       return len - ctx->zstr.avail_out;
+       return (zip_int64_t)(len - ctx->zstr.avail_out);
 
-    return (ctx->e[0] == 0) ? 0 : -1;
+    return (zip_error_code_zip(&ctx->error) == ZIP_ER_OK) ? 0 : -1;
 }
 
-\f
 
 static zip_int64_t
-deflate_compress(struct zip_source *src, void *ud, void *data,
-                zip_uint64_t len, enum zip_source_cmd cmd)
+deflate_compress(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zip_source_cmd_t cmd)
 {
     struct deflate *ctx;
     int ret;
@@ -264,11 +293,8 @@ deflate_compress(struct zip_source *src, void *ud, void *data,
        ctx->zstr.next_out = NULL;
 
        /* negative value to tell zlib not to write a header */
-       if ((ret=deflateInit2(&ctx->zstr, Z_BEST_COMPRESSION, Z_DEFLATED,
-                             -MAX_WBITS, ctx->mem_level,
-                             Z_DEFAULT_STRATEGY)) != Z_OK) {
-           ctx->e[0] = ZIP_ER_ZLIB;
-           ctx->e[1] = ret;
+       if ((ret=deflateInit2(&ctx->zstr, Z_BEST_COMPRESSION, Z_DEFLATED, -MAX_WBITS, ctx->mem_level, Z_DEFAULT_STRATEGY)) != Z_OK) {
+            zip_error_set(&ctx->error, ZIP_ER_ZLIB, ret);
            return -1;
        }
 
@@ -283,11 +309,11 @@ deflate_compress(struct zip_source *src, void *ud, void *data,
 
     case ZIP_SOURCE_STAT:
        {
-           struct zip_stat *st;
+           zip_stat_t *st;
 
-           st = (struct zip_stat *)data;
+           st = (zip_stat_t *)data;
 
-           st->comp_method = ZIP_CM_DEFLATE;
+           st->comp_method = ctx->is_stored ? ZIP_CM_STORE : ZIP_CM_DEFLATE;
            st->valid |= ZIP_STAT_COMP_METHOD;
            if (ctx->eof) {
                st->comp_size = ctx->size;
@@ -299,25 +325,25 @@ deflate_compress(struct zip_source *src, void *ud, void *data,
        return 0;
 
     case ZIP_SOURCE_ERROR:
-       memcpy(data, ctx->e, sizeof(int)*2);
-       return sizeof(int)*2;
+        return zip_error_to_data(&ctx->error, data, len);
 
     case ZIP_SOURCE_FREE:
        deflate_free(ctx);
        return 0;
 
+    case ZIP_SOURCE_SUPPORTS:
+        return ZIP_SOURCE_SUPPORTS_READABLE;
+            
     default:
-       ctx->e[0] = ZIP_ER_INVAL;
-       ctx->e[1] = 0;
+        zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0);
        return -1;
     }
 }
 
-\f
 
 static zip_int64_t
-deflate_decompress(struct zip_source *src, void *ud, void *data,
-                  zip_uint64_t len, enum zip_source_cmd cmd)
+deflate_decompress(zip_source_t *src, void *ud, void *data,
+                  zip_uint64_t len, zip_source_cmd_t cmd)
 {
     struct deflate *ctx;
     zip_int64_t n;
@@ -326,69 +352,64 @@ deflate_decompress(struct zip_source *src, void *ud, void *data,
     ctx = (struct deflate *)ud;
 
     switch (cmd) {
-    case ZIP_SOURCE_OPEN:
-       if ((n=zip_source_read(src, ctx->buffer, sizeof(ctx->buffer))) < 0)
-           return ZIP_SOURCE_ERR_LOWER;
-
-       ctx->zstr.zalloc = Z_NULL;
-       ctx->zstr.zfree = Z_NULL;
-       ctx->zstr.opaque = NULL;
-       ctx->zstr.next_in = (Bytef *)ctx->buffer;
-       ctx->zstr.avail_in = n;
-
-       /* negative value to tell zlib that there is no header */
-       if ((ret=inflateInit2(&ctx->zstr, -MAX_WBITS)) != Z_OK) {
-           ctx->e[0] = ZIP_ER_ZLIB;
-           ctx->e[1] = ret;
-
-           return -1;
-       }
-       return 0;
-
-    case ZIP_SOURCE_READ:
-       return decompress_read(src, ctx, data, len);
-
-    case ZIP_SOURCE_CLOSE:
-       inflateEnd(&ctx->zstr);
-       return 0;
-
-    case ZIP_SOURCE_STAT:
-       {
-           struct zip_stat *st;
-
-           st = (struct zip_stat *)data;
-
-           st->comp_method = ZIP_CM_STORE;
-           if (st->comp_size > 0 && st->size > 0)
-               st->comp_size = st->size;
-       }
-       return 0;
-
-    case ZIP_SOURCE_ERROR:
-       if (len < sizeof(int)*2)
-           return -1;
-
-       memcpy(data, ctx->e, sizeof(int)*2);
-       return sizeof(int)*2;
-
-    case ZIP_SOURCE_FREE:
-       /* XXX: inflateEnd if close was not called */
-       free(ctx);
-       return 0;
-
-    default:
-       ctx->e[0] = ZIP_ER_INVAL;
-       ctx->e[1] = 0;
-       return -1;
+        case ZIP_SOURCE_OPEN:
+            if ((n=zip_source_read(src, ctx->buffer, sizeof(ctx->buffer))) < 0) {
+                _zip_error_set_from_source(&ctx->error, src);
+                return -1;
+            }
+
+            ctx->zstr.zalloc = Z_NULL;
+            ctx->zstr.zfree = Z_NULL;
+            ctx->zstr.opaque = NULL;
+            ctx->zstr.next_in = (Bytef *)ctx->buffer;
+            ctx->zstr.avail_in = (uInt)n;
+
+            /* negative value to tell zlib that there is no header */
+            if ((ret=inflateInit2(&ctx->zstr, -MAX_WBITS)) != Z_OK) {
+                zip_error_set(&ctx->error, ZIP_ER_ZLIB, ret);
+                return -1;
+            }
+            return 0;
+
+        case ZIP_SOURCE_READ:
+            return decompress_read(src, ctx, data, len);
+
+        case ZIP_SOURCE_CLOSE:
+            inflateEnd(&ctx->zstr);
+            return 0;
+
+        case ZIP_SOURCE_STAT:
+        {
+            zip_stat_t *st;
+            
+            st = (zip_stat_t *)data;
+            
+            st->comp_method = ZIP_CM_STORE;
+            if (st->comp_size > 0 && st->size > 0)
+                st->comp_size = st->size;
+            
+            return 0;
+        }
+
+        case ZIP_SOURCE_ERROR:
+            return zip_error_to_data(&ctx->error, data, len);
+
+        case ZIP_SOURCE_FREE:
+            free(ctx);
+            return 0;
+            
+        case ZIP_SOURCE_SUPPORTS:
+            return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, -1);
+
+        default:
+            zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0);
+            return -1;
     }
-    
 }
 
-\f
 
 static void
 deflate_free(struct deflate *ctx)
 {
-    /* XXX: deflateEnd if close was not called */
     free(ctx);
 }
index 433b450..e09199b 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_error.c -- get last error from zip_source
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN void
-zip_source_error(struct zip_source *src, int *ze, int *se)
+zip_error_t *
+zip_source_error(zip_source_t *src)
 {
-    int e[2];
-
-    if (src->src == NULL) {
-    }
-    else {
-       switch (src->error_source) {
-       case ZIP_LES_NONE:
-           if (src->src == NULL) {
-               if (src->cb.f(src->ud, e, sizeof(e), ZIP_SOURCE_ERROR) < 0) {
-                   e[0] = ZIP_ER_INTERNAL;
-                   e[1] = 0;
-               }
-           }
-           else
-               e[0] = e[1] = 0;
-           break;
-
-       case ZIP_LES_INVAL:
-           e[0] = ZIP_ER_INVAL;
-           e[1] = 0;
-           break;
-
-       case ZIP_LES_LOWER:
-           zip_source_error(src->src, ze, se);
-           return;
-
-       case ZIP_LES_UPPER:
-           if (src->cb.l(src->src, src->ud, e, sizeof(e),
-                         ZIP_SOURCE_ERROR) < 0) {
-               e[0] = ZIP_ER_INTERNAL;
-               e[1] = 0;
-           }
-           break;
-
-       default:
-           e[0] = ZIP_ER_INTERNAL;
-           e[1] = 0;
-       }
-    }
-
-    if (ze)
-       *ze = e[0];
-    if (se)
-       *se = e[1];
+    return &src->error;
 }
index 79c8ee5..1465e17 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_file.c -- create data source from file
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <errno.h>
 #include <stdio.h>
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN struct zip_source *
-zip_source_file(struct zip *za, const char *fname, zip_uint64_t start,
-               zip_int64_t len)
+ZIP_EXTERN zip_source_t *
+zip_source_file(zip_t *za, const char *fname, zip_uint64_t start, zip_int64_t len)
 {
     if (za == NULL)
        return NULL;
+    
+    return zip_source_file_create(fname, start, len, &za->error);
+}
+
 
-    if (fname == NULL || len < -1) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+ZIP_EXTERN zip_source_t *
+zip_source_file_create(const char *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error)
+{
+    if (fname == NULL || length < -1) {
+       zip_error_set(error, ZIP_ER_INVAL, 0);
        return NULL;
     }
 
-    return _zip_source_file_or_p(za, fname, NULL, start, len, 1, NULL);
+    return _zip_source_file_or_p(fname, NULL, start, length, NULL, error);
 }
index 7e26ff6..22500e2 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_filep.c -- create data source from FILE *
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -31,7 +31,8 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
+
+#include "zipint.h"
 
 #include <sys/stat.h>
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
 
-#include "zipint.h"
+#ifdef _WIN32
+/* WIN32 needs <fcntl.h> for _O_BINARY */
+#include <fcntl.h>
+#endif
+
+/* Windows sys/types.h does not provide these */
+#ifndef S_ISREG
+#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#endif
+#ifndef S_IRWXG
+#define S_IRWXG (S_IRWXU >> 3)
+#endif
+#ifndef S_IRWXO
+#define S_IRWXO (S_IRWXG >> 3)
+#endif
+
+#ifdef _MSC_VER
+/* MSVC doesn't have mode_t */
+typedef int mode_t;
+#endif
 
 struct read_file {
-    char *fname;       /* name of file to copy from */
-    FILE *f;           /* file to copy from */
-    int closep;                /* close f */
-    struct zip_stat st;        /* stat information passed in */
-
-    zip_uint64_t off;  /* start offset of */
-    zip_int64_t len;   /* length of data to copy */
-    zip_int64_t remain;        /* bytes remaining to be copied */
-    int e[2];          /* error codes */
+    zip_error_t error;      /* last error information */
+    zip_int64_t supports;
+
+    /* reading */
+    char *fname;            /* name of file to read from */
+    FILE *f;                /* file to read from */
+    struct zip_stat st;     /* stat information passed in */
+    zip_uint64_t start;     /* start offset of data to read */
+    zip_uint64_t end;       /* end offset of data to read, 0 for up to EOF */
+    zip_uint64_t current;   /* current offset */
+    
+    /* writing */
+    char *tmpname;
+    FILE *fout;
 };
 
-static zip_int64_t read_file(void *state, void *data, zip_uint64_t len,
-                    enum zip_source_cmd cmd);
+static zip_int64_t read_file(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd);
+static int create_temp_output(struct read_file *ctx);
+static int _zip_fseek_u(FILE *f, zip_uint64_t offset, int whence, zip_error_t *error);
+static int _zip_fseek(FILE *f, zip_int64_t offset, int whence, zip_error_t *error);
 
-\f
 
-ZIP_EXTERN struct zip_source *
-zip_source_filep(struct zip *za, FILE *file, zip_uint64_t start,
-                zip_int64_t len)
+ZIP_EXTERN zip_source_t *
+zip_source_filep(zip_t *za, FILE *file, zip_uint64_t start, zip_int64_t len)
 {
     if (za == NULL)
        return NULL;
+    
+    return zip_source_filep_create(file, start, len, &za->error);
+}
 
-    if (file == NULL || start < 0 || len < -1) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+
+ZIP_EXTERN zip_source_t *
+zip_source_filep_create(FILE *file, zip_uint64_t start, zip_int64_t length, zip_error_t *error)
+{
+    if (file == NULL || length < -1) {
+       zip_error_set(error, ZIP_ER_INVAL, 0);
        return NULL;
     }
 
-    return _zip_source_file_or_p(za, NULL, file, start, len, 1, NULL);
+    return _zip_source_file_or_p(NULL, file, start, length, NULL, error);
 }
 
-\f
 
-struct zip_source *
-_zip_source_file_or_p(struct zip *za, const char *fname, FILE *file,
-                     zip_uint64_t start, zip_int64_t len, int closep,
-                     const struct zip_stat *st)
+zip_source_t *
+_zip_source_file_or_p(const char *fname, FILE *file, zip_uint64_t start, zip_int64_t len, const zip_stat_t *st, zip_error_t *error)
 {
-    struct read_file *f;
-    struct zip_source *zs;
-
+    struct read_file *ctx;
+    zip_source_t *zs;
+    
     if (file == NULL && fname == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       zip_error_set(error, ZIP_ER_INVAL, 0);
        return NULL;
     }
-
-    if ((f=(struct read_file *)malloc(sizeof(struct read_file))) == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+    
+    if ((ctx=(struct read_file *)malloc(sizeof(struct read_file))) == NULL) {
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
        return NULL;
     }
 
-    f->fname = NULL;
+    ctx->fname = NULL;
     if (fname) {
-       if ((f->fname=strdup(fname)) == NULL) {
-           _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
-           free(f);
+       if ((ctx->fname=strdup(fname)) == NULL) {
+           zip_error_set(error, ZIP_ER_MEMORY, 0);
+           free(ctx);
            return NULL;
        }
     }
-    f->f = file;
-    f->off = start;
-    f->len = (len ? len : -1);
-    f->closep = f->fname ? 1 : closep;
-    if (st)
-       memcpy(&f->st, st, sizeof(f->st));
-    else
-       zip_stat_init(&f->st);
-
-    if ((zs=zip_source_function(za, read_file, f)) == NULL) {
-       free(f);
+    ctx->f = file;
+    ctx->start = start;
+    ctx->end = (len < 0 ? 0 : start+(zip_uint64_t)len);
+    if (st) {
+       memcpy(&ctx->st, st, sizeof(ctx->st));
+        ctx->st.name = NULL;
+        ctx->st.valid &= ~ZIP_STAT_NAME;
+    }
+    else {
+       zip_stat_init(&ctx->st);
+    }
+    
+    ctx->tmpname = NULL;
+    ctx->fout = NULL;
+   
+    zip_error_init(&ctx->error);
+
+    ctx->supports = ZIP_SOURCE_SUPPORTS_READABLE | zip_source_make_command_bitmap(ZIP_SOURCE_SUPPORTS, ZIP_SOURCE_TELL, -1);
+    if (ctx->fname) {
+       struct stat sb;
+
+       if (stat(ctx->fname, &sb) < 0 || S_ISREG(sb.st_mode)) {
+            ctx->supports = ZIP_SOURCE_SUPPORTS_WRITABLE;
+       }
+    }
+    else if (fseeko(ctx->f, 0, SEEK_CUR) == 0) {
+        ctx->supports = ZIP_SOURCE_SUPPORTS_SEEKABLE;
+    }
+
+    if ((zs=zip_source_function_create(read_file, ctx, error)) == NULL) {
+       free(ctx->fname);
+       free(ctx);
        return NULL;
     }
 
     return zs;
 }
 
-\f
+
+static int
+create_temp_output(struct read_file *ctx)
+{
+    char *temp;
+    int tfd;
+    mode_t mask;
+    FILE *tfp;
+    
+    if ((temp=(char *)malloc(strlen(ctx->fname)+8)) == NULL) {
+       zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0);
+       return -1;
+    }
+    sprintf(temp, "%s.XXXXXX", ctx->fname);
+
+    mask = umask(S_IXUSR | S_IRWXG | S_IRWXO);
+    if ((tfd=mkstemp(temp)) == -1) {
+        zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno);
+       umask(mask);
+        free(temp);
+        return -1;
+    }
+    umask(mask);
+
+    if ((tfp=fdopen(tfd, "r+b")) == NULL) {
+        zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno);
+        close(tfd);
+        (void)remove(temp);
+        free(temp);
+        return -1;
+    }
+    
+#ifdef _WIN32
+    /*
+     According to Pierre Joye, Windows in some environments per
+     default creates text files, so force binary mode.
+     */
+    _setmode(_fileno(tfp), _O_BINARY );
+#endif
+    
+    ctx->fout = tfp;
+    ctx->tmpname = temp;
+    
+    return 0;
+}
+
 
 static zip_int64_t
-read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd)
+read_file(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd)
 {
-    struct read_file *z;
+    struct read_file *ctx;
     char *buf;
-    int i, n;
+    zip_uint64_t n;
+    size_t i;
 
-    z = (struct read_file *)state;
+    ctx = (struct read_file *)state;
     buf = (char *)data;
 
     switch (cmd) {
-    case ZIP_SOURCE_OPEN:
-       if (z->fname) {
-           if ((z->f=fopen(z->fname, "rb")) == NULL) {
-               z->e[0] = ZIP_ER_OPEN;
-               z->e[1] = errno;
-               return -1;
-           }
+        case ZIP_SOURCE_BEGIN_WRITE:
+            if (ctx->fname == NULL) {
+                zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0);
+                return -1;
+            }
+            return create_temp_output(ctx);
+            
+        case ZIP_SOURCE_COMMIT_WRITE: {
+           mode_t mask;
+
+            if (fclose(ctx->fout) < 0) {
+                ctx->fout = NULL;
+                zip_error_set(&ctx->error, ZIP_ER_WRITE, errno);
+            }
+            ctx->fout = NULL;
+            if (rename(ctx->tmpname, ctx->fname) < 0) {
+                zip_error_set(&ctx->error, ZIP_ER_RENAME, errno);
+                return -1;
+            }
+           mask = umask(022);
+           umask(mask);
+           /* not much we can do if chmod fails except make the whole commit fail */
+           (void)chmod(ctx->fname, 0666&~mask);
+           free(ctx->tmpname);
+           ctx->tmpname = NULL;
+            return 0;
        }
-
-       if (z->closep) {
-           if (fseeko(z->f, (off_t)z->off, SEEK_SET) < 0) {
-               z->e[0] = ZIP_ER_SEEK;
-               z->e[1] = errno;
-               return -1;
-           }
-       }
-       z->remain = z->len;
-       return 0;
-       
-    case ZIP_SOURCE_READ:
-       /* XXX: return INVAL if len > size_t max */
-       if (z->remain != -1)
-           n = len > z->remain ? z->remain : len;
-       else
-           n = len;
-
-       if (!z->closep) {
-           /* we might share this file with others, so let's be safe */
-           if (fseeko(z->f, (off_t)(z->off + z->len-z->remain),
-                      SEEK_SET) < 0) {
-               z->e[0] = ZIP_ER_SEEK;
-               z->e[1] = errno;
-               return -1;
-           }
-       }
-
-       if ((i=fread(buf, 1, n, z->f)) < 0) {
-           z->e[0] = ZIP_ER_READ;
-           z->e[1] = errno;
-           return -1;
-       }
-
-       if (z->remain != -1)
-           z->remain -= i;
-
-       return i;
+            
+        case ZIP_SOURCE_CLOSE:
+            if (ctx->fname) {
+                fclose(ctx->f);
+                ctx->f = NULL;
+            }
+            return 0;
+            
+        case ZIP_SOURCE_ERROR:
+            return zip_error_to_data(&ctx->error, data, len);
+            
+        case ZIP_SOURCE_FREE:
+            free(ctx->fname);
+           free(ctx->tmpname);
+            if (ctx->f)
+                fclose(ctx->f);
+            free(ctx);
+            return 0;
+            
+        case ZIP_SOURCE_OPEN:
+            if (ctx->fname) {
+                if ((ctx->f=fopen(ctx->fname, "rb")) == NULL) {
+                    zip_error_set(&ctx->error, ZIP_ER_OPEN, errno);
+                    return -1;
+                }
+            }
+            
+            if (ctx->start > 0) {
+                if (_zip_fseek_u(ctx->f, ctx->start, SEEK_SET, &ctx->error) < 0) {
+                    return -1;
+                }
+            }
+            ctx->current = ctx->start;
+            return 0;
+            
+        case ZIP_SOURCE_READ:
+            if (ctx->end > 0) {
+                n = ctx->end-ctx->current;
+                if (n > len) {
+                    n = len;
+                }
+            }
+            else {
+                n = len;
+            }
+            
+            if (n > SIZE_MAX)
+                n = SIZE_MAX;
+
+            if ((i=fread(buf, 1, (size_t)n, ctx->f)) == 0) {
+                if (ferror(ctx->f)) {
+                    zip_error_set(&ctx->error, ZIP_ER_READ, errno);
+                    return -1;
+                }
+            }
+            ctx->current += i;
+
+            return (zip_int64_t)i;
+            
+        case ZIP_SOURCE_REMOVE:
+            if (remove(ctx->fname) < 0) {
+                zip_error_set(&ctx->error, ZIP_ER_REMOVE, errno);
+                return -1;
+            }
+            return 0;
+            
+        case ZIP_SOURCE_ROLLBACK_WRITE:
+            if (ctx->fout) {
+                fclose(ctx->fout);
+                ctx->fout = NULL;
+            }
+            (void)remove(ctx->tmpname);
+           free(ctx->tmpname);
+            ctx->tmpname = NULL;
+            return 0;
        
-    case ZIP_SOURCE_CLOSE:
-       if (z->fname) {
-           fclose(z->f);
-           z->f = NULL;
-       }
-       return 0;
+        case ZIP_SOURCE_SEEK: {
+            zip_int64_t new_current;
+            int need_seek;
+           zip_source_args_seek_t *args = ZIP_SOURCE_GET_ARGS(zip_source_args_seek_t, data, len, &ctx->error);
 
-    case ZIP_SOURCE_STAT:
-        {
-           if (len < sizeof(z->st))
+           if (args == NULL)
+               return -1;
+            
+            need_seek = 1;
+            
+            switch (args->whence) {
+                case SEEK_SET:
+                    new_current = args->offset;
+                    break;
+                    
+                case SEEK_END:
+                    if (ctx->end == 0) {
+                        if (_zip_fseek(ctx->f, args->offset, SEEK_END, &ctx->error) < 0) {
+                            return -1;
+                        }
+                        if ((new_current = ftello(ctx->f)) < 0) {
+                            zip_error_set(&ctx->error, ZIP_ER_SEEK, errno);
+                            return -1;
+                        }
+                        need_seek = 0;
+                    }
+                    else {
+                        new_current = (zip_int64_t)ctx->end + args->offset;
+                    }
+                    break;
+                case SEEK_CUR:
+                    new_current = (zip_int64_t)ctx->current + args->offset;
+                    break;
+
+                default:
+                    zip_error_set(&ctx->error, ZIP_ER_INVAL, 0);
+                    return -1;
+            }
+
+            if (new_current < 0 || (zip_uint64_t)new_current < ctx->start || (ctx->end != 0 && (zip_uint64_t)new_current > ctx->end)) {
+                zip_error_set(&ctx->error, ZIP_ER_INVAL, 0);
+                return -1;
+            }
+            
+            ctx->current = (zip_uint64_t)new_current;
+
+            if (need_seek) {
+                if (_zip_fseek_u(ctx->f, ctx->current, SEEK_SET, &ctx->error) < 0) {
+                    return -1;
+                }
+            }
+            return 0;
+        }
+            
+        case ZIP_SOURCE_SEEK_WRITE: {
+            zip_source_args_seek_t *args;
+            
+            args = ZIP_SOURCE_GET_ARGS(zip_source_args_seek_t, data, len, &ctx->error);
+            if (args == NULL) {
+                return -1;
+            }
+            
+            if (_zip_fseek(ctx->fout, args->offset, args->whence, &ctx->error) < 0) {
+                return -1;
+            }
+            return 0;
+        }
+
+        case ZIP_SOURCE_STAT: {
+           if (len < sizeof(ctx->st))
                return -1;
 
-           if (z->st.valid != 0)
-               memcpy(data, &z->st, sizeof(z->st));
+           if (ctx->st.valid != 0)
+               memcpy(data, &ctx->st, sizeof(ctx->st));
            else {
-               struct zip_stat *st;
+               zip_stat_t *st;
                struct stat fst;
                int err;
            
-               if (z->f)
-                   err = fstat(fileno(z->f), &fst);
+               if (ctx->f)
+                   err = fstat(fileno(ctx->f), &fst);
                else
-                   err = stat(z->fname, &fst);
+                   err = stat(ctx->fname, &fst);
 
                if (err != 0) {
-                   z->e[0] = ZIP_ER_READ; /* best match */
-                   z->e[1] = errno;
+                    zip_error_set(&ctx->error, ZIP_ER_READ, errno);
                    return -1;
                }
 
-               st = (struct zip_stat *)data;
+               st = (zip_stat_t *)data;
                
                zip_stat_init(st);
                st->mtime = fst.st_mtime;
                st->valid |= ZIP_STAT_MTIME;
-               if (z->len != -1) {
-                   st->size = z->len;
+               if (ctx->end != 0) {
+                    st->size = ctx->end - ctx->start;
                    st->valid |= ZIP_STAT_SIZE;
                }
                else if ((fst.st_mode&S_IFMT) == S_IFREG) {
-                   st->size = fst.st_size;
+                   st->size = (zip_uint64_t)fst.st_size;
                    st->valid |= ZIP_STAT_SIZE;
                }
            }
-           return sizeof(z->st);
+           return sizeof(ctx->st);
        }
 
-    case ZIP_SOURCE_ERROR:
-       if (len < sizeof(int)*2)
-           return -1;
-
-       memcpy(data, z->e, sizeof(int)*2);
-       return sizeof(int)*2;
+        case ZIP_SOURCE_SUPPORTS:
+           return ctx->supports;
+            
+        case ZIP_SOURCE_TELL:
+            return (zip_int64_t)ctx->current;
+            
+        case ZIP_SOURCE_TELL_WRITE:
+        {
+            off_t ret = ftello(ctx->fout);
+            
+            if (ret < 0) {
+                zip_error_set(&ctx->error, ZIP_ER_TELL, errno);
+                return -1;
+            }
+            return ret;
+        }
+            
+        case ZIP_SOURCE_WRITE:
+        {
+            size_t ret;
+            
+           clearerr(ctx->fout);
+            ret = fwrite(data, 1, len, ctx->fout);
+            if (ret != len || ferror(ctx->fout)) {
+                zip_error_set(&ctx->error, ZIP_ER_WRITE, errno);
+                return -1;
+            }
+            
+            return (zip_int64_t)ret;
+        }
+
+        default:
+            zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0);
+            return -1;
+    }
+}
 
-    case ZIP_SOURCE_FREE:
-       free(z->fname);
-       if (z->closep && z->f)
-           fclose(z->f);
-       free(z);
-       return 0;
 
-    default:
-       ;
+static int
+_zip_fseek_u(FILE *f, zip_uint64_t offset, int whence, zip_error_t *error)
+{
+    if (offset > ZIP_INT64_MAX) {
+       zip_error_set(error, ZIP_ER_SEEK, EOVERFLOW);
+       return -1;
     }
+    return _zip_fseek(f, (zip_int64_t)offset, whence, error);
+}
+
 
-    return -1;
+static int
+_zip_fseek(FILE *f, zip_int64_t offset, int whence, zip_error_t *error)
+{
+    if (offset > ZIP_FSEEK_MAX || offset < ZIP_FSEEK_MIN) {
+       zip_error_set(error, ZIP_ER_SEEK, EOVERFLOW);
+       return -1;
+    }
+    if (fseeko(f, (off_t)offset, whence) < 0) {
+       zip_error_set(error, ZIP_ER_SEEK, errno);
+       return -1;
+    }
+    return 0;
 }
index b1e7840..9070469 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_free.c -- free zip data source
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN void
-zip_source_free(struct zip_source *src)
+zip_source_free(zip_source_t *src)
 {
     if (src == NULL)
        return;
 
-    if (src->is_open)
+    if (src->refcount > 0) {
+        src->refcount--;
+    }
+    if (src->refcount > 0) {
+        return;
+    }
+    
+    if (ZIP_SOURCE_IS_OPEN_READING(src)) {
+       src->open_count = 1; /* force close */
        zip_source_close(src);
-
-    if (src->src == NULL)
-       (void)src->cb.f(src->ud, NULL, 0, ZIP_SOURCE_FREE);
-    else {
-       (void)src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_FREE);
-       zip_source_free(src->src);
+    }
+    if (ZIP_SOURCE_IS_OPEN_WRITING(src)) {
+        zip_source_rollback_write(src);
+    }
+    
+    if (src->source_archive && !src->source_closed) {
+        _zip_deregister_source(src->source_archive, src);
+    }
+    
+    (void)_zip_source_call(src, NULL, 0, ZIP_SOURCE_FREE);
+    
+    if (src->src) {
+        zip_source_free(src->src);
     }
 
     free(src);
index cb92e33..1d4be93 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_function.c -- create zip data source from callback function
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN struct zip_source *
-zip_source_function(struct zip *za, zip_source_callback zcb, void *ud)
+ZIP_EXTERN zip_source_t *
+zip_source_function(zip_t *za, zip_source_callback zcb, void *ud)
 {
-    struct zip_source *zs;
+    if (za == NULL) {
+        return NULL;
+    }
+    
+    return zip_source_function_create(zcb, ud, &za->error);
+}
 
-    if (za == NULL)
-       return NULL;
 
-    if ((zs=_zip_source_new(za)) == NULL)
+ZIP_EXTERN zip_source_t *
+zip_source_function_create(zip_source_callback zcb, void *ud, zip_error_t *error)
+{
+    zip_source_t *zs;
+
+    if ((zs=_zip_source_new(error)) == NULL)
        return NULL;
 
     zs->cb.f = zcb;
     zs->ud = ud;
     
+    zs->supports = zcb(ud, NULL, 0, ZIP_SOURCE_SUPPORTS);
+    if (zs->supports < 0) {
+        zs->supports = ZIP_SOURCE_SUPPORTS_READABLE;
+    }
+    
     return zs;
 }
 
-\f
 
-struct zip_source *
-_zip_source_new(struct zip *za)
+ZIP_EXTERN void
+zip_source_keep(zip_source_t *src)
+{
+    src->refcount++;
+}
+
+
+zip_source_t *
+_zip_source_new(zip_error_t *error)
 {
-    struct zip_source *src;
+    zip_source_t *src;
 
-    if ((src=(struct zip_source *)malloc(sizeof(*src))) == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+    if ((src=(zip_source_t *)malloc(sizeof(*src))) == NULL) {
+        zip_error_set(error, ZIP_ER_MEMORY, 0);
        return NULL;
     }
 
     src->src = NULL;
     src->cb.f = NULL;
     src->ud = NULL;
-    src->error_source = ZIP_LES_NONE;
-    src->is_open = 0;
+    src->open_count = 0;
+    src->write_state = ZIP_SOURCE_WRITE_CLOSED;
+    src->source_closed = false;
+    src->source_archive = NULL;
+    src->refcount = 1;
+    zip_error_init(&src->error);
 
     return src;
 }
diff --git a/lib/zip_source_is_deleted.c b/lib/zip_source_is_deleted.c
new file mode 100644 (file)
index 0000000..e50cdd9
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+  zip_source_is_deleted.c -- was archive was removed?
+  Copyright (C) 2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "zipint.h"
+
+
+ZIP_EXTERN int
+zip_source_is_deleted(zip_source_t *src)
+{
+    return src->write_state == ZIP_SOURCE_WRITE_REMOVED;
+}
index 9bdf3c5..94b3310 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_layered.c -- create layered source
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN struct zip_source *
-zip_source_layered(struct zip *za, struct zip_source *src,
-                  zip_source_layered_callback cb, void *ud)
+zip_source_t *
+zip_source_layered(zip_t *za, zip_source_t *src, zip_source_layered_callback cb, void *ud)
 {
-    struct zip_source *zs;
-
     if (za == NULL)
-       return NULL;
+        return NULL;
+
+    return zip_source_layered_create(src, cb, ud, &za->error);
+}
 
-    if ((zs=_zip_source_new(za)) == NULL)
-       return NULL;
 
+zip_source_t *
+zip_source_layered_create(zip_source_t *src, zip_source_layered_callback cb, void *ud, zip_error_t *error)
+{
+    zip_source_t *zs;
+    
+    if ((zs=_zip_source_new(error)) == NULL)
+        return NULL;
+    
+    zip_source_keep(src);
     zs->src = src;
     zs->cb.l = cb;
     zs->ud = ud;
-    
+
+    zs->supports = cb(src, ud, NULL, 0, ZIP_SOURCE_SUPPORTS);
+    if (zs->supports < 0) {
+        zs->supports = ZIP_SOURCE_SUPPORTS_READABLE;
+    }
+
     return zs;
 }
index a279e20..ec5e39d 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_open.c -- open zip_source (prepare for reading)
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
-
 ZIP_EXTERN int
-zip_source_open(struct zip_source *src)
+zip_source_open(zip_source_t *src)
 {
-    zip_int64_t ret;
-
-    if (src->is_open) {
-       src->error_source = ZIP_LES_INVAL;
+    if (src->source_closed) {
+        return -1;
+    }
+    if (src->write_state == ZIP_SOURCE_WRITE_REMOVED) {
+        zip_error_set(&src->error, ZIP_ER_DELETED, 0);
        return -1;
     }
 
-    if (src->src == NULL) {
-       if (src->cb.f(src->ud, NULL, 0, ZIP_SOURCE_OPEN) < 0)
+    if (ZIP_SOURCE_IS_OPEN_READING(src)) {
+       if ((zip_source_supports(src) & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK)) == 0) {
+           zip_error_set(&src->error, ZIP_ER_INUSE, 0);
            return -1;
+       }
     }
     else {
-       if (zip_source_open(src->src) < 0) {
-           src->error_source = ZIP_LES_LOWER;
-           return -1;
+       if (ZIP_SOURCE_IS_LAYERED(src)) {
+           if (zip_source_open(src->src) < 0) {
+               _zip_error_set_from_source(&src->error, src->src);
+               return -1;
+           }
        }
-
-       ret = src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_OPEN);
        
-       if (ret < 0) {
-           (void)zip_source_close(src->src);
-           
-           if (ret == ZIP_SOURCE_ERR_LOWER)
-               src->error_source = ZIP_LES_LOWER;
-           else
-               src->error_source = ZIP_LES_UPPER;
+       if (_zip_source_call(src, NULL, 0, ZIP_SOURCE_OPEN) < 0) {
+           if (ZIP_SOURCE_IS_LAYERED(src)) {
+               zip_source_close(src->src);
+           }
            return -1;
        }
     }
 
-    src->is_open = 1;
+    src->open_count++;
     
     return 0;
 }
index c1f3e42..ce281ac 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_pkware.c -- Traditional PKWARE de/encryption routines
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -31,7 +31,6 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 #include <string.h>
@@ -39,8 +38,7 @@
 #include "zipint.h"
 
 struct trad_pkware {
-    int e[2];
-
+    zip_error_t error;
     zip_uint32_t key[3];
 };
 
@@ -49,46 +47,37 @@ struct trad_pkware {
 #define KEY1           591751049
 #define KEY2           878082192
 
-static const uLongf *crc = NULL;
-
-#define CRC32(c, b) (crc[((c) ^ (b)) & 0xff] ^ ((c) >> 8))
-
-\f
 
 static void decrypt(struct trad_pkware *, zip_uint8_t *,
                    const zip_uint8_t *, zip_uint64_t, int);
-static int decrypt_header(struct zip_source *, struct trad_pkware *);
-static zip_int64_t pkware_decrypt(struct zip_source *, void *, void *,
-                                 zip_uint64_t, enum zip_source_cmd);
+static int decrypt_header(zip_source_t *, struct trad_pkware *);
+static zip_int64_t pkware_decrypt(zip_source_t *, void *, void *,
+                                 zip_uint64_t, zip_source_cmd_t);
 static void pkware_free(struct trad_pkware *);
 
-\f
 
-ZIP_EXTERN struct zip_source *
-zip_source_pkware(struct zip *za, struct zip_source *src,
+zip_source_t *
+zip_source_pkware(zip_t *za, zip_source_t *src,
                  zip_uint16_t em, int flags, const char *password)
 {
     struct trad_pkware *ctx;
-    struct zip_source *s2;
+    zip_source_t *s2;
 
     if (password == NULL || src == NULL || em != ZIP_EM_TRAD_PKWARE) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
        return NULL;
     }
     if (flags & ZIP_CODEC_ENCODE) {
-       _zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0);
+       zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0);
        return NULL;
     }
 
-    if (crc == NULL)
-       crc = get_crc_table();
-
     if ((ctx=(struct trad_pkware *)malloc(sizeof(*ctx))) == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+       zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
        return NULL;
     }
 
-    ctx->e[0] = ctx->e[1] = 0;
+    zip_error_init(&ctx->error);
 
     ctx->key[0] = KEY0;
     ctx->key[1] = KEY1;
@@ -103,7 +92,6 @@ zip_source_pkware(struct zip *za, struct zip_source *src,
     return s2;
 }
 
-\f
 
 static void
 decrypt(struct trad_pkware *ctx, zip_uint8_t *out, const zip_uint8_t *in,
@@ -118,9 +106,9 @@ decrypt(struct trad_pkware *ctx, zip_uint8_t *out, const zip_uint8_t *in,
 
        if (!update_only) {
            /* decrypt next byte */
-           tmp = ctx->key[2] | 2;
-           tmp = (tmp * (tmp ^ 1)) >> 8;
-           b ^= tmp;
+           tmp = (zip_uint16_t)(ctx->key[2] | 2);
+           tmp = (zip_uint16_t)((tmp * (tmp ^ 1)) >> 8);
+           b ^= (Bytef)tmp;
        }
 
        /* store cleartext */
@@ -128,17 +116,16 @@ decrypt(struct trad_pkware *ctx, zip_uint8_t *out, const zip_uint8_t *in,
            out[i] = b;
 
        /* update keys */
-       ctx->key[0] = CRC32(ctx->key[0], b);
+       ctx->key[0] = (zip_uint32_t)crc32(ctx->key[0] ^ 0xffffffffUL, &b, 1) ^ 0xffffffffUL;
        ctx->key[1] = (ctx->key[1] + (ctx->key[0] & 0xff)) * 134775813 + 1;
-       b = ctx->key[1] >> 24;
-       ctx->key[2] = CRC32(ctx->key[2], b);
+       b = (Bytef)(ctx->key[1] >> 24);
+       ctx->key[2] = (zip_uint32_t)crc32(ctx->key[2] ^ 0xffffffffUL, &b, 1) ^ 0xffffffffUL;
     }
 }
 
-\f
 
 static int
-decrypt_header(struct zip_source *src, struct trad_pkware *ctx)
+decrypt_header(zip_source_t *src, struct trad_pkware *ctx)
 {
     zip_uint8_t header[HEADERLEN];
     struct zip_stat st;
@@ -146,13 +133,12 @@ decrypt_header(struct zip_source *src, struct trad_pkware *ctx)
     unsigned short dostime, dosdate;
 
     if ((n=zip_source_read(src, header, HEADERLEN)) < 0) {
-       zip_source_error(src, ctx->e, ctx->e+1);
+        _zip_error_set_from_source(&ctx->error, src);
        return -1;
     }
     
     if (n != HEADERLEN) {
-       ctx->e[0] = ZIP_ER_EOF;
-       ctx->e[1] = 0;
+        zip_error_set(&ctx->error, ZIP_ER_EOF, 0);
        return -1;
     }
 
@@ -165,21 +151,18 @@ decrypt_header(struct zip_source *src, struct trad_pkware *ctx)
 
     _zip_u2d_time(st.mtime, &dostime, &dosdate);
 
-    if (header[HEADERLEN-1] != st.crc>>24
-       && header[HEADERLEN-1] != dostime>>8) {
-       ctx->e[0] = ZIP_ER_WRONGPASSWD;
-       ctx->e[1] = 0;
+    if (header[HEADERLEN-1] != st.crc>>24 && header[HEADERLEN-1] != dostime>>8) {
+        zip_error_set(&ctx->error, ZIP_ER_WRONGPASSWD, 0);
        return -1;
     }
 
     return 0;
 }
 
-\f
 
 static zip_int64_t
-pkware_decrypt(struct zip_source *src, void *ud, void *data,
-              zip_uint64_t len, enum zip_source_cmd cmd)
+pkware_decrypt(zip_source_t *src, void *ud, void *data,
+              zip_uint64_t len, zip_source_cmd_t cmd)
 {
     struct trad_pkware *ctx;
     zip_int64_t n;
@@ -187,52 +170,54 @@ pkware_decrypt(struct zip_source *src, void *ud, void *data,
     ctx = (struct trad_pkware *)ud;
 
     switch (cmd) {
-    case ZIP_SOURCE_OPEN:
-       if (decrypt_header(src, ctx) < 0)
-           return -1;
-       return 0;
+        case ZIP_SOURCE_OPEN:
+            if (decrypt_header(src, ctx) < 0)
+                return -1;
+            return 0;
 
-    case ZIP_SOURCE_READ:
-       if ((n=zip_source_read(src, data, len)) < 0)
-           return ZIP_SOURCE_ERR_LOWER;
+        case ZIP_SOURCE_READ:
+            if ((n=zip_source_read(src, data, len)) < 0) {
+                _zip_error_set_from_source(&ctx->error, src);
+                return -1;
+            }
 
-       decrypt(ud, (zip_uint8_t *)data, (zip_uint8_t *)data, (zip_uint64_t)n,
-               0);
-       return n;
+            decrypt((struct trad_pkware *)ud, (zip_uint8_t *)data, (zip_uint8_t *)data, (zip_uint64_t)n, 0);
+            return n;
 
-    case ZIP_SOURCE_CLOSE:
-       return 0;
+        case ZIP_SOURCE_CLOSE:
+            return 0;
 
-    case ZIP_SOURCE_STAT:
-       {
-           struct zip_stat *st;
+        case ZIP_SOURCE_STAT:
+        {
+           zip_stat_t *st;
 
-           st = (struct zip_stat *)data;
+           st = (zip_stat_t *)data;
 
            st->encryption_method = ZIP_EM_NONE;
            st->valid |= ZIP_STAT_ENCRYPTION_METHOD;
-           /* XXX: deduce HEADERLEN from size for uncompressed */
+           /* TODO: deduce HEADERLEN from size for uncompressed */
            if (st->valid & ZIP_STAT_COMP_SIZE)
                st->comp_size -= HEADERLEN;
-       }
-       return 0;
-
-    case ZIP_SOURCE_ERROR:
-       memcpy(data, ctx->e, sizeof(int)*2);
-       return sizeof(int)*2;
-
-    case ZIP_SOURCE_FREE:
-       pkware_free(ctx);
-       return 0;
-
-    default:
-       ctx->e[0] = ZIP_ER_INVAL;
-       ctx->e[1] = 0;
-       return -1;
+       
+            return 0;
+        }
+            
+        case ZIP_SOURCE_SUPPORTS:
+            return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, -1);
+
+        case ZIP_SOURCE_ERROR:
+            return zip_error_to_data(&ctx->error, data, len);
+
+        case ZIP_SOURCE_FREE:
+            pkware_free(ctx);
+            return 0;
+
+        default:
+            zip_error_set(&ctx->error, ZIP_ER_INVAL, 0);
+            return -1;
     }
 }
 
-\f
 
 static void
 pkware_free(struct trad_pkware *ctx)
index 432243b..061a6f9 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_read.c -- read data from zip_source
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN zip_int64_t
-zip_source_read(struct zip_source *src, void *data, zip_uint64_t len)
+zip_int64_t
+zip_source_read(zip_source_t *src, void *data, zip_uint64_t len)
 {
-    zip_int64_t ret;
-
-    if (!src->is_open || len > ZIP_INT64_MAX || (len > 0 && data == NULL)) {
-       src->error_source = ZIP_LES_INVAL;
-       return -1;
+    if (src->source_closed) {
+        return -1;
     }
-
-    if (src->src == NULL)
-       return src->cb.f(src->ud, data, len, ZIP_SOURCE_READ);
-
-    ret = src->cb.l(src->src, src->ud, data, len, ZIP_SOURCE_READ);
-
-    if (ret < 0) {
-       if (ret == ZIP_SOURCE_ERR_LOWER)
-           src->error_source = ZIP_LES_LOWER;
-       else
-           src->error_source = ZIP_LES_UPPER;
+    if (!ZIP_SOURCE_IS_OPEN_READING(src) || len > ZIP_INT64_MAX || (len > 0 && data == NULL)) {
+        zip_error_set(&src->error, ZIP_ER_INVAL, 0);
        return -1;
     }
-    
-    return ret;
+
+    return _zip_source_call(src, data, len, ZIP_SOURCE_READ);
 }
diff --git a/lib/zip_source_remove.c b/lib/zip_source_remove.c
new file mode 100644 (file)
index 0000000..470a5ed
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ zip_source_remove.c -- remove empty archive
+ Copyright (C) 2014 Dieter Baron and Thomas Klausner
+ This file is part of libzip, a library to manipulate ZIP archives.
+ The authors can be contacted at <libzip@nih.at>
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 3. The names of the authors may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#include "zipint.h"
+
+
+int
+zip_source_remove(zip_source_t *src)
+{
+    if (src->write_state == ZIP_SOURCE_WRITE_REMOVED) {
+        return 0;
+    }
+    
+    if (ZIP_SOURCE_IS_OPEN_READING(src)) {
+       if (zip_source_close(src) < 0) {
+           return -1;
+       }
+    }
+    if (src->write_state != ZIP_SOURCE_WRITE_CLOSED) {
+        zip_source_rollback_write(src);
+    }
+    
+    if (_zip_source_call(src, NULL, 0, ZIP_SOURCE_REMOVE) < 0) {
+        return -1;
+    }
+    
+    src->write_state = ZIP_SOURCE_WRITE_REMOVED;
+    
+    return 0;
+}
diff --git a/lib/zip_source_rollback_write.c b/lib/zip_source_rollback_write.c
new file mode 100644 (file)
index 0000000..c35f30f
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+  zip_source_rollback_write.c -- discard changes
+  Copyright (C) 2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "zipint.h"
+
+
+ZIP_EXTERN void
+zip_source_rollback_write(zip_source_t *src)
+{
+    if (src->write_state != ZIP_SOURCE_WRITE_OPEN && src->write_state != ZIP_SOURCE_WRITE_FAILED) {
+       return;
+    }
+    
+    _zip_source_call(src, NULL, 0, ZIP_SOURCE_ROLLBACK_WRITE);
+    src->write_state = ZIP_SOURCE_WRITE_CLOSED;
+}
similarity index 50%
rename from regress/add_from_file.c
rename to lib/zip_source_seek.c
index cbcf5d9..c3f4703 100644 (file)
@@ -1,6 +1,6 @@
 /*
-  add_from_file.c -- test case for adding file to archive
-  Copyright (C) 1999, 2003, 2005 Dieter Baron and Thomas Klausner
+  zip_source_seek.c -- seek to offset
+  Copyright (C) 2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include "zipint.h"
 
-#include "zip.h"
 
-static const char *prg;
-
-int
-main(int argc, char *argv[])
+ZIP_EXTERN int
+zip_source_seek(zip_source_t *src, zip_int64_t offset, int whence)
 {
-    const char *archive;
-    const char *file;
-    const char *name;
-    struct zip *za;
-    struct zip_source *zs;
-    char buf[100];
-    int err;
-
-    prg = argv[0];
-
-    if (argc != 3) {
-       fprintf(stderr, "usage: %s archive file\n", prg);
-       return 1;
-    }
-
-    archive = argv[1];
-    file = argv[2];
+    zip_source_args_seek_t args;
     
-    if ((za=zip_open(archive, ZIP_CREATE, &err)) == NULL) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't open zip archive %s: %s\n", prg,
-               archive, buf);
-       return 1;
+    if (src->source_closed) {
+        return -1;
     }
-
-    if ((zs=zip_source_file(za, file, 0, -1)) == NULL) {
-       fprintf(stderr, "%s: error creating file source for `%s': %s\n", prg,
-               file, zip_strerror(za));
-       return 1;
+    if (!ZIP_SOURCE_IS_OPEN_READING(src) || (whence != SEEK_SET && whence != SEEK_CUR && whence != SEEK_END)) {
+        zip_error_set(&src->error, ZIP_ER_INVAL, 0);
+        return -1;
     }
 
-    if ((name=strrchr(file, '/')) == NULL)
-       name = file;
+    args.offset = offset;
+    args.whence = whence;
+    
+    return (_zip_source_call(src, &args, sizeof(args), ZIP_SOURCE_SEEK) < 0 ? -1 : 0);
+}
 
-    if (zip_add(za, name, zs) == -1) {
-       zip_source_free(zs);
-       fprintf(stderr, "%s: can't add file `%s': %s\n", prg,
-               file, zip_strerror(za));
-       return 1;
-    }
 
-    if (zip_close(za) == -1) {
-       fprintf(stderr, "%s: can't close zip archive `%s'\n", prg,
-               archive);
-       return 1;
+zip_int64_t
+zip_source_seek_compute_offset(zip_uint64_t offset, zip_uint64_t length, void *data, zip_uint64_t data_length, zip_error_t *error)
+{
+    zip_int64_t new_offset;
+    zip_source_args_seek_t *args = ZIP_SOURCE_GET_ARGS(zip_source_args_seek_t, data, data_length, error);
+    
+    if (args == NULL) {
+        return -1;
     }
-
-    return 0;
+    
+    switch (args->whence) {
+        case SEEK_CUR:
+            new_offset = (zip_int64_t)offset + args->offset;
+            break;
+            
+        case SEEK_END:
+            new_offset = (zip_int64_t)length + args->offset;
+            break;
+            
+        case SEEK_SET:
+            new_offset = args->offset;
+            break;
+            
+        default:
+            zip_error_set(error, ZIP_ER_INVAL, 0);
+            return -1;
+    }
+    
+    if (new_offset < 0 || (zip_uint64_t)new_offset > length) {
+        zip_error_set(error, ZIP_ER_INVAL, 0);
+        return -1;
+    }
+    
+    return new_offset;
 }
diff --git a/lib/zip_source_seek_write.c b/lib/zip_source_seek_write.c
new file mode 100644 (file)
index 0000000..6660766
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+  zip_source_seek_write.c -- seek to offset for writing
+  Copyright (C) 2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "zipint.h"
+
+
+ZIP_EXTERN int
+zip_source_seek_write(zip_source_t *src, zip_int64_t offset, int whence)
+{
+    zip_source_args_seek_t args;
+        
+    if (!ZIP_SOURCE_IS_OPEN_WRITING(src) || (whence != SEEK_SET && whence != SEEK_CUR && whence != SEEK_END)) {
+        zip_error_set(&src->error, ZIP_ER_INVAL, 0);
+        return -1;
+    }
+    
+    args.offset = offset;
+    args.whence = whence;
+    
+    return (_zip_source_call(src, &args, sizeof(args), ZIP_SOURCE_SEEK_WRITE) < 0 ? -1 : 0);
+}
index 2166074..34cb05f 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_stat.c -- get meta information from zip_source
-  Copyright (C) 2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
-ZIP_EXTERN int
-zip_source_stat(struct zip_source *src, struct zip_stat *st)
+int
+zip_source_stat(zip_source_t *src, zip_stat_t *st)
 {
-    zip_int64_t ret;
-
+    if (src->source_closed) {
+        return -1;
+    }
     if (st == NULL) {
-       src->error_source = ZIP_LES_INVAL;
+        zip_error_set(&src->error, ZIP_ER_INVAL, 0);
        return -1;
     }
 
-    if (src->src == NULL) {
-       if (src->cb.f(src->ud, st, sizeof(*st), ZIP_SOURCE_STAT) < 0)
-           return -1;
-       return 0;
+    zip_stat_init(st);
+    
+    if (ZIP_SOURCE_IS_LAYERED(src)) {
+        if (zip_source_stat(src->src, st) < 0) {
+            _zip_error_set_from_source(&src->error, src->src);
+            return -1;
+        }
     }
 
-    if (zip_source_stat(src->src, st) < 0) {
-       src->error_source = ZIP_LES_LOWER;
+    if (_zip_source_call(src, st, sizeof(*st), ZIP_SOURCE_STAT) < 0) {
        return -1;
     }
 
-    ret = src->cb.l(src->src, src->ud, st, sizeof(*st), ZIP_SOURCE_STAT);
-
-    if (ret < 0) {
-       if (ret == ZIP_SOURCE_ERR_LOWER)
-           src->error_source = ZIP_LES_LOWER;
-       else
-           src->error_source = ZIP_LES_UPPER;
-       return -1;
-    }
-    
     return 0;
 }
diff --git a/lib/zip_source_supports.c b/lib/zip_source_supports.c
new file mode 100644 (file)
index 0000000..3c100fb
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+  zip_source_supports.c -- check for supported functions
+  Copyright (C) 2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <stdarg.h>
+
+#include "zipint.h"
+
+
+zip_int64_t
+zip_source_supports(zip_source_t *src)
+{
+    return src->supports;
+}
+
+
+zip_int64_t
+zip_source_make_command_bitmap(zip_source_cmd_t cmd0, ...)
+{
+    zip_int64_t bitmap;
+    va_list ap;
+    
+    bitmap = ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd0);
+    
+    
+    
+    va_start(ap, cmd0);
+    for (;;) {
+        int cmd = va_arg(ap, int);
+        if (cmd < 0) {
+            break;
+        }
+        bitmap |= ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd);
+    }
+    va_end(ap);
+    
+    return bitmap;
+}
diff --git a/lib/zip_source_tell.c b/lib/zip_source_tell.c
new file mode 100644 (file)
index 0000000..f1c10b5
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+  zip_source_tell.c -- report current offset
+  Copyright (C) 2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "zipint.h"
+
+
+ZIP_EXTERN zip_int64_t
+zip_source_tell(zip_source_t *src)
+{
+    if (src->source_closed) {
+        return -1;
+    }
+    if (!ZIP_SOURCE_IS_OPEN_READING(src)) {
+        zip_error_set(&src->error, ZIP_ER_INVAL, 0);
+        return -1;
+    }
+    
+    return _zip_source_call(src, NULL, 0, ZIP_SOURCE_TELL);
+}
diff --git a/lib/zip_source_tell_write.c b/lib/zip_source_tell_write.c
new file mode 100644 (file)
index 0000000..2fa1507
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+  zip_source_tell_write.c -- report current offset for writing
+  Copyright (C) 2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "zipint.h"
+
+
+ZIP_EXTERN zip_int64_t
+zip_source_tell_write(zip_source_t *src)
+{
+    if (!ZIP_SOURCE_IS_OPEN_WRITING(src)) {
+        zip_error_set(&src->error, ZIP_ER_INVAL, 0);
+        return -1;
+    }
+    
+    return _zip_source_call(src, NULL, 0, ZIP_SOURCE_TELL_WRITE);
+}
diff --git a/lib/zip_source_win32a.c b/lib/zip_source_win32a.c
new file mode 100644 (file)
index 0000000..c20e891
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+zip_source_win32a.c -- create data source from Windows file (ANSI)
+Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
+
+This file is part of libzip, a library to manipulate ZIP archives.
+The authors can be contacted at <libzip@nih.at>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the
+distribution.
+3. The names of the authors may not be used to endorse or promote
+products derived from this software without specific prior
+written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <errno.h>
+#include <stdio.h>
+
+#include "zipint.h"
+#include "zipwin32.h"
+
+static void * _win32_strdup_a(const void *str);
+static HANDLE _win32_open_a(_zip_source_win32_read_file_t *ctx);
+static HANDLE _win32_create_temp_a(_zip_source_win32_read_file_t *ctx, void **temp, zip_uint32_t value, PSECURITY_ATTRIBUTES sa);
+static int _win32_rename_temp_a(_zip_source_win32_read_file_t *ctx);
+static int _win32_remove_a(const void *fname);
+
+static _zip_source_win32_file_ops_t win32_ops_a = {
+    .op_strdup         = _win32_strdup_a,
+    .op_open           = _win32_open_a,
+    .op_create_temp    = _win32_create_temp_a,
+    .op_rename_temp    = _win32_rename_temp_a,
+    .op_remove         = _win32_remove_a
+};
+
+ZIP_EXTERN zip_source_t *
+zip_source_win32a(zip_t *za, const char *fname, zip_uint64_t start, zip_int64_t len)
+{
+    if (za == NULL)
+       return NULL;
+
+    return zip_source_win32a_create(fname, start, len, &za->error);
+}
+
+
+ZIP_EXTERN zip_source_t *
+zip_source_win32a_create(const char *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error)
+{
+    if (fname == NULL || length < -1) {
+       zip_error_set(error, ZIP_ER_INVAL, 0);
+       return NULL;
+    }
+
+    return _zip_source_win32_handle_or_name(fname, INVALID_HANDLE_VALUE, start, length, 1, NULL, &win32_ops_a, error);
+}
+
+
+static void *
+_win32_strdup_a(const void *str)
+{
+    return strdup((const char *)str);
+}
+
+
+static HANDLE
+_win32_open_a(_zip_source_win32_read_file_t *ctx)
+{
+    return CreateFileA(ctx->fname, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+}
+
+
+static HANDLE
+_win32_create_temp_a(_zip_source_win32_read_file_t *ctx, void **temp, zip_uint32_t value, PSECURITY_ATTRIBUTES sa)
+{
+    int len;
+
+    len = strlen((const char *)ctx->fname) + 10;
+    if (*temp == NULL) {
+       if ((*temp = malloc(sizeof(char) * len)) == NULL) {
+           zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0);
+           return INVALID_HANDLE_VALUE;
+       }
+    }
+    if (sprintf((char *)*temp, "%s.%08x", (const char *)ctx->fname, value) != len - 1) {
+       return INVALID_HANDLE_VALUE;
+    }
+
+    return CreateFileA((const char *)*temp, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, sa, CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY, NULL);
+}
+
+
+static int
+_win32_rename_temp_a(_zip_source_win32_read_file_t *ctx)
+{
+    if (!MoveFileExA(ctx->tmpname, ctx->fname, MOVEFILE_REPLACE_EXISTING))
+       return -1;
+    return 0;
+}
+
+
+static int
+_win32_remove_a(const void *fname)
+{
+    DeleteFileA((const char *)fname);
+    return 0;
+}
diff --git a/lib/zip_source_win32handle.c b/lib/zip_source_win32handle.c
new file mode 100644 (file)
index 0000000..dd17c02
--- /dev/null
@@ -0,0 +1,607 @@
+/*
+zip_source_win32file.c -- create data source from HANDLE (Win32)
+Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
+
+This file is part of libzip, a library to manipulate ZIP archives.
+The authors can be contacted at <libzip@nih.at>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the
+distribution.
+3. The names of the authors may not be used to endorse or promote
+products derived from this software without specific prior
+written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <wchar.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "zipint.h"
+#include "zipwin32.h"
+
+static zip_int64_t _win32_read_file(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd);
+static int _win32_create_temp_file(_zip_source_win32_read_file_t *ctx);
+static int _zip_filetime_to_time_t(FILETIME ft, time_t *t);
+static int _zip_seek_win32_u(void *h, zip_uint64_t offset, int whence, zip_error_t *error);
+static int _zip_seek_win32(void *h, zip_int64_t offset, int whence, zip_error_t *error);
+static int _zip_win32_error_to_errno(unsigned long win32err);
+static int _zip_stat_win32(void *h, zip_stat_t *st, _zip_source_win32_read_file_t *ctx);
+
+ZIP_EXTERN zip_source_t *
+zip_source_win32handle(zip_t *za, HANDLE h, zip_uint64_t start, zip_int64_t len)
+{
+    if (za == NULL)
+       return NULL;
+
+    return zip_source_win32handle_create(h, start, len, &za->error);
+}
+
+
+ZIP_EXTERN zip_source_t *
+zip_source_win32handle_create(HANDLE h, zip_uint64_t start, zip_int64_t length, zip_error_t *error)
+{
+    if (h == INVALID_HANDLE_VALUE || length < -1) {
+       zip_error_set(error, ZIP_ER_INVAL, 0);
+       return NULL;
+    }
+
+    return _zip_source_win32_handle_or_name(NULL, h, start, length, 1, NULL, NULL, error);
+}
+
+
+zip_source_t *
+_zip_source_win32_handle_or_name(const void *fname, HANDLE h, zip_uint64_t start, zip_int64_t len, int closep, const zip_stat_t *st, _zip_source_win32_file_ops_t *ops, zip_error_t *error)
+{
+    _zip_source_win32_read_file_t *ctx;
+    zip_source_t *zs;
+
+    if (h == INVALID_HANDLE_VALUE && fname == NULL) {
+       zip_error_set(error, ZIP_ER_INVAL, 0);
+       return NULL;
+    }
+
+    if ((ctx = (_zip_source_win32_read_file_t *)malloc(sizeof(_zip_source_win32_read_file_t))) == NULL) {
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
+       return NULL;
+    }
+
+    ctx->fname = NULL;
+    if (fname) {
+       if ((ctx->fname = ops->op_strdup(fname)) == NULL) {
+           zip_error_set(error, ZIP_ER_MEMORY, 0);
+           free(ctx);
+           return NULL;
+       }
+    }
+
+    ctx->ops = ops;
+    ctx->h = h;
+    ctx->start = start;
+    ctx->end = (len < 0 ? 0 : start + (zip_uint64_t)len);
+    ctx->closep = ctx->fname ? 1 : closep;
+    if (st) {
+       memcpy(&ctx->st, st, sizeof(ctx->st));
+       ctx->st.name = NULL;
+       ctx->st.valid &= ~ZIP_STAT_NAME;
+    }
+    else {
+       zip_stat_init(&ctx->st);
+    }
+
+    ctx->tmpname = NULL;
+    ctx->hout = INVALID_HANDLE_VALUE;
+
+    zip_error_init(&ctx->error);
+
+    ctx->supports = ZIP_SOURCE_SUPPORTS_READABLE | zip_source_make_command_bitmap(ZIP_SOURCE_SUPPORTS, ZIP_SOURCE_TELL, -1);
+    if (ctx->fname) {
+       HANDLE th;
+
+       th = ops->op_open(ctx);
+       if (th == INVALID_HANDLE_VALUE || GetFileType(th) == FILE_TYPE_DISK) {
+           ctx->supports = ZIP_SOURCE_SUPPORTS_WRITABLE;
+       }
+       if (th != INVALID_HANDLE_VALUE) {
+           CloseHandle(th);
+       }
+    }
+    else if (GetFileType(ctx->h) == FILE_TYPE_DISK) {
+       ctx->supports = ZIP_SOURCE_SUPPORTS_SEEKABLE;
+    }
+
+    if ((zs = zip_source_function_create(_win32_read_file, ctx, error)) == NULL) {
+       free(ctx->fname);
+       free(ctx);
+       return NULL;
+    }
+
+    return zs;
+}
+
+
+static zip_int64_t
+_win32_read_file(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd)
+{
+    _zip_source_win32_read_file_t *ctx;
+    char *buf;
+    zip_uint64_t n;
+    DWORD i;
+
+    ctx = (_zip_source_win32_read_file_t *)state;
+    buf = (char *)data;
+
+    switch (cmd) {
+    case ZIP_SOURCE_BEGIN_WRITE:
+       if (ctx->fname == NULL) {
+           zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0);
+           return -1;
+       }
+       return _win32_create_temp_file(ctx);
+
+    case ZIP_SOURCE_COMMIT_WRITE: {
+       if (!CloseHandle(ctx->hout)) {
+           ctx->hout = INVALID_HANDLE_VALUE;
+           zip_error_set(&ctx->error, ZIP_ER_WRITE, _zip_win32_error_to_errno(GetLastError()));
+       }
+       ctx->hout = INVALID_HANDLE_VALUE;
+       if (ctx->ops->op_rename_temp(ctx) < 0) {
+           zip_error_set(&ctx->error, ZIP_ER_RENAME, _zip_win32_error_to_errno(GetLastError()));
+           return -1;
+       }
+       free(ctx->tmpname);
+       ctx->tmpname = NULL;
+       return 0;
+    }
+
+    case ZIP_SOURCE_CLOSE:
+       if (ctx->fname) {
+           CloseHandle(ctx->h);
+           ctx->h = INVALID_HANDLE_VALUE;
+       }
+       return 0;
+
+    case ZIP_SOURCE_ERROR:
+       return zip_error_to_data(&ctx->error, data, len);
+
+    case ZIP_SOURCE_FREE:
+       free(ctx->fname);
+       free(ctx->tmpname);
+       if (ctx->closep && ctx->h != INVALID_HANDLE_VALUE)
+           CloseHandle(ctx->h);
+       free(ctx);
+       return 0;
+
+    case ZIP_SOURCE_OPEN:
+       if (ctx->fname) {
+           if ((ctx->h = ctx->ops->op_open(ctx)) == INVALID_HANDLE_VALUE) {
+               zip_error_set(&ctx->error, ZIP_ER_OPEN, _zip_win32_error_to_errno(GetLastError()));
+               return -1;
+           }
+       }
+
+       if (ctx->closep && ctx->start > 0) {
+           if (_zip_seek_win32_u(ctx->h, ctx->start, SEEK_SET, &ctx->error) < 0) {
+               return -1;
+           }
+       }
+       ctx->current = ctx->start;
+       return 0;
+
+    case ZIP_SOURCE_READ:
+       if (ctx->end > 0) {
+           n = ctx->end - ctx->current;
+           if (n > len) {
+               n = len;
+           }
+       }
+       else {
+           n = len;
+       }
+
+       if (n > SIZE_MAX)
+           n = SIZE_MAX;
+
+       if (!ctx->closep) {
+           if (_zip_seek_win32_u(ctx->h, ctx->current, SEEK_SET, &ctx->error) < 0) {
+               return -1;
+           }
+       }
+
+       if (!ReadFile(ctx->h, buf, (DWORD)n, &i, NULL)) {
+           zip_error_set(&ctx->error, ZIP_ER_READ, _zip_win32_error_to_errno(GetLastError()));
+           return -1;
+       }
+       ctx->current += i;
+
+       return (zip_int64_t)i;
+
+    case ZIP_SOURCE_REMOVE:
+       if (ctx->ops->op_remove(ctx->fname) < 0) {
+           zip_error_set(&ctx->error, ZIP_ER_REMOVE, _zip_win32_error_to_errno(GetLastError()));
+           return -1;
+       }
+       return 0;
+
+    case ZIP_SOURCE_ROLLBACK_WRITE:
+       if (ctx->hout) {
+           CloseHandle(ctx->hout);
+           ctx->hout = INVALID_HANDLE_VALUE;
+       }
+       ctx->ops->op_remove(ctx->tmpname);
+       free(ctx->tmpname);
+       ctx->tmpname = NULL;
+       return 0;
+
+    case ZIP_SOURCE_SEEK: {
+       zip_int64_t new_current;
+       int need_seek;
+       zip_source_args_seek_t *args = ZIP_SOURCE_GET_ARGS(zip_source_args_seek_t, data, len, &ctx->error);
+
+       if (args == NULL)
+           return -1;
+
+       need_seek = ctx->closep;
+
+       switch (args->whence) {
+       case SEEK_SET:
+           new_current = args->offset;
+           break;
+
+       case SEEK_END:
+           if (ctx->end == 0) {
+               LARGE_INTEGER zero;
+               LARGE_INTEGER new_offset;
+
+               if (_zip_seek_win32(ctx->h, args->offset, SEEK_END, &ctx->error) < 0) {
+                   return -1;
+               }
+               zero.QuadPart = 0;
+               if (!SetFilePointerEx(ctx->h, zero, &new_offset, FILE_CURRENT)) {
+                   zip_error_set(&ctx->error, ZIP_ER_SEEK, _zip_win32_error_to_errno(GetLastError()));
+                   return -1;
+               }
+               new_current = new_offset.QuadPart;
+               need_seek = 0;
+           }
+           else {
+               new_current = (zip_int64_t)ctx->end + args->offset;
+           }
+           break;
+       case SEEK_CUR:
+           new_current = (zip_int64_t)ctx->current + args->offset;
+           break;
+
+       default:
+           zip_error_set(&ctx->error, ZIP_ER_INVAL, 0);
+           return -1;
+       }
+
+       if (new_current < 0 || (zip_uint64_t)new_current < ctx->start || (ctx->end != 0 && (zip_uint64_t)new_current > ctx->end)) {
+           zip_error_set(&ctx->error, ZIP_ER_INVAL, 0);
+           return -1;
+       }
+
+       ctx->current = (zip_uint64_t)new_current;
+
+       if (need_seek) {
+           if (_zip_seek_win32_u(ctx->h, ctx->current, SEEK_SET, &ctx->error) < 0) {
+               return -1;
+           }
+       }
+       return 0;
+    }
+
+    case ZIP_SOURCE_SEEK_WRITE: {
+       zip_source_args_seek_t *args;
+
+       args = ZIP_SOURCE_GET_ARGS(zip_source_args_seek_t, data, len, &ctx->error);
+       if (args == NULL) {
+           return -1;
+       }
+
+       if (_zip_seek_win32(ctx->hout, args->offset, args->whence, &ctx->error) < 0) {
+           return -1;
+       }
+       return 0;
+    }
+
+    case ZIP_SOURCE_STAT: {
+       if (len < sizeof(ctx->st))
+           return -1;
+
+       if (ctx->st.valid != 0)
+           memcpy(data, &ctx->st, sizeof(ctx->st));
+       else {
+           DWORD win32err;
+           zip_stat_t *st;
+           HANDLE h;
+           int success;
+
+           st = (zip_stat_t *)data;
+
+           if (ctx->h != INVALID_HANDLE_VALUE) {
+               h = ctx->h;
+           }
+           else {
+               h = ctx->ops->op_open(ctx);
+               if (h == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_NOT_FOUND) {
+                   zip_error_set(&ctx->error, ZIP_ER_READ, ENOENT);
+                   return -1;
+               }
+           }
+
+           success = _zip_stat_win32(h, st, ctx);
+           win32err = GetLastError();
+
+           /* We're done with the handle, so close it if we just opened it. */
+           if (h != ctx->h) {
+               CloseHandle(h);
+           }
+
+           if (success < 0) {
+               /* TODO: Is this the correct error to return in all cases? */
+               zip_error_set(&ctx->error, ZIP_ER_READ, _zip_win32_error_to_errno(win32err));
+               return -1;
+           }
+       }
+       return sizeof(ctx->st);
+    }
+
+    case ZIP_SOURCE_SUPPORTS:
+       return ctx->supports;
+
+    case ZIP_SOURCE_TELL:
+       return (zip_int64_t)ctx->current;
+
+    case ZIP_SOURCE_TELL_WRITE:
+    {
+       LARGE_INTEGER zero;
+       LARGE_INTEGER offset;
+
+       zero.QuadPart = 0;
+       if (!SetFilePointerEx(ctx->hout, zero, &offset, FILE_CURRENT)) {
+           zip_error_set(&ctx->error, ZIP_ER_TELL, _zip_win32_error_to_errno(GetLastError()));
+           return -1;
+       }
+
+       return offset.QuadPart;
+    }
+
+    case ZIP_SOURCE_WRITE:
+    {
+       DWORD ret;
+       if (!WriteFile(ctx->hout, data, (DWORD)len, &ret, NULL) || ret != len) {
+           zip_error_set(&ctx->error, ZIP_ER_WRITE, _zip_win32_error_to_errno(GetLastError()));
+           return -1;
+       }
+
+       return (zip_int64_t)ret;
+    }
+
+    default:
+       zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0);
+       return -1;
+    }
+}
+
+
+static int
+_win32_create_temp_file(_zip_source_win32_read_file_t *ctx)
+{
+    /*
+    Windows has GetTempFileName(), but it closes the file after
+    creation, leaving it open to a horrible race condition. So
+    we reinvent the wheel.
+    */
+    int i;
+    HANDLE th = INVALID_HANDLE_VALUE;
+    void *temp = NULL;
+    SECURITY_INFORMATION si;
+    SECURITY_ATTRIBUTES sa;
+    PSECURITY_DESCRIPTOR psd = NULL;
+    PSECURITY_ATTRIBUTES psa = NULL;
+    DWORD len;
+    BOOL success;
+
+    /*
+    Read the DACL from the original file, so we can copy it to the temp file.
+    If there is no original file, or if we can't read the DACL, we'll use the
+    default security descriptor.
+    */
+    if (ctx->h != INVALID_HANDLE_VALUE && GetFileType(ctx->h) == FILE_TYPE_DISK) {
+       si = DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION;
+       len = 0;
+       success = GetUserObjectSecurity(ctx->h, &si, NULL, len, &len);
+       if (!success && GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+           if ((psd = (PSECURITY_DESCRIPTOR)malloc(len)) == NULL) {
+               zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0);
+               return -1;
+           }
+           success = GetUserObjectSecurity(ctx->h, &si, psd, len, &len);
+       }
+       if (success) {
+           sa.nLength = sizeof(SECURITY_ATTRIBUTES);
+           sa.bInheritHandle = FALSE;
+           sa.lpSecurityDescriptor = psd;
+           psa = &sa;
+       }
+    }
+
+    zip_uint32_t value = GetTickCount();
+    for (i = 0; i < 1024 && th == INVALID_HANDLE_VALUE; i++) {
+       th = ctx->ops->op_create_temp(ctx, &temp, value + i, psa);
+       if (th == INVALID_HANDLE_VALUE && GetLastError() != ERROR_FILE_EXISTS)
+           break;
+    }
+
+    if (th == INVALID_HANDLE_VALUE) {
+       free(temp);
+       free(psd);
+       zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, _zip_win32_error_to_errno(GetLastError()));
+       return -1;
+    }
+
+    free(psd);
+    ctx->hout = th;
+    ctx->tmpname = temp;
+
+    return 0;
+}
+
+
+static int
+_zip_seek_win32_u(HANDLE h, zip_uint64_t offset, int whence, zip_error_t *error)
+{
+    if (offset > ZIP_INT64_MAX) {
+       zip_error_set(error, ZIP_ER_SEEK, EOVERFLOW);
+       return -1;
+    }
+    return _zip_seek_win32(h, (zip_int64_t)offset, whence, error);
+}
+
+
+static int
+_zip_seek_win32(HANDLE h, zip_int64_t offset, int whence, zip_error_t *error)
+{
+    LARGE_INTEGER li;
+    DWORD method;
+
+    switch (whence) {
+    case SEEK_SET:
+       method = FILE_BEGIN;
+       break;
+    case SEEK_END:
+       method = FILE_END;
+       break;
+    case SEEK_CUR:
+       method = FILE_CURRENT;
+       break;
+    default:
+       zip_error_set(error, ZIP_ER_SEEK, EINVAL);
+       return -1;
+    }
+
+    li.QuadPart = (LONGLONG)offset;
+    if (!SetFilePointerEx(h, li, NULL, method)) {
+       zip_error_set(error, ZIP_ER_SEEK, _zip_win32_error_to_errno(GetLastError()));
+       return -1;
+    }
+
+    return 0;
+}
+
+
+static int
+_zip_win32_error_to_errno(DWORD win32err)
+{
+    /*
+    Note: This list isn't exhaustive, but should cover common cases.
+    */
+    switch (win32err) {
+    case ERROR_INVALID_PARAMETER:
+       return EINVAL;
+    case ERROR_FILE_NOT_FOUND:
+       return ENOENT;
+    case ERROR_INVALID_HANDLE:
+       return EBADF;
+    case ERROR_ACCESS_DENIED:
+       return EACCES;
+    case ERROR_FILE_EXISTS:
+       return EEXIST;
+    case ERROR_TOO_MANY_OPEN_FILES:
+       return EMFILE;
+    case ERROR_DISK_FULL:
+       return ENOSPC;
+    default:
+       return 0;
+    }
+}
+
+
+static int
+_zip_stat_win32(HANDLE h, zip_stat_t *st, _zip_source_win32_read_file_t *ctx)
+{
+    FILETIME mtimeft;
+    time_t mtime;
+    LARGE_INTEGER size;
+    int regularp;
+
+    if (!GetFileTime(h, NULL, NULL, &mtimeft)) {
+       zip_error_set(&ctx->error, ZIP_ER_READ, _zip_win32_error_to_errno(GetLastError()));
+       return -1;
+    }
+    if (_zip_filetime_to_time_t(mtimeft, &mtime) < 0) {
+       zip_error_set(&ctx->error, ZIP_ER_READ, ERANGE);
+       return -1;
+    }
+
+    regularp = 0;
+    if (GetFileType(h) == FILE_TYPE_DISK) {
+       regularp = 1;
+    }
+
+    if (!GetFileSizeEx(h, &size)) {
+       zip_error_set(&ctx->error, ZIP_ER_READ, _zip_win32_error_to_errno(GetLastError()));
+       return -1;
+    }
+
+    zip_stat_init(st);
+    st->mtime = mtime;
+    st->valid |= ZIP_STAT_MTIME;
+    if (ctx->end != 0) {
+       st->size = ctx->end - ctx->start;
+       st->valid |= ZIP_STAT_SIZE;
+    }
+    else if (regularp) {
+       st->size = (zip_uint64_t)size.QuadPart;
+       st->valid |= ZIP_STAT_SIZE;
+    }
+
+    return 0;
+}
+
+
+static int
+_zip_filetime_to_time_t(FILETIME ft, time_t *t)
+{
+    /*
+    Inspired by http://stackoverflow.com/questions/6161776/convert-windows-filetime-to-second-in-unix-linux
+    */
+    const zip_int64_t WINDOWS_TICK = 10000000LL;
+    const zip_int64_t SEC_TO_UNIX_EPOCH = 11644473600LL;
+    ULARGE_INTEGER li;
+    zip_int64_t secs;
+    time_t temp;
+
+    li.LowPart = ft.dwLowDateTime;
+    li.HighPart = ft.dwHighDateTime;
+    secs = (li.QuadPart / WINDOWS_TICK - SEC_TO_UNIX_EPOCH);
+
+    temp = (time_t)secs;
+    if (secs != (zip_int64_t)temp)
+       return -1;
+
+    *t = temp;
+    return 0;
+}
diff --git a/lib/zip_source_win32utf8.c b/lib/zip_source_win32utf8.c
new file mode 100644 (file)
index 0000000..e11214b
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+zip_source_win32utf8.c -- create data source from Windows file (UTF-8)
+Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
+
+This file is part of libzip, a library to manipulate ZIP archives.
+The authors can be contacted at <libzip@nih.at>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the
+distribution.
+3. The names of the authors may not be used to endorse or promote
+products derived from this software without specific prior
+written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <errno.h>
+#include <stdio.h>
+
+#include "zipint.h"
+#include "zipwin32.h"
+
+
+ZIP_EXTERN zip_source_t *
+zip_source_file(zip_t *za, const char *fname, zip_uint64_t start, zip_int64_t len)
+{
+    if (za == NULL)
+       return NULL;
+
+    return zip_source_file_create(fname, start, len, &za->error);
+}
+
+
+ZIP_EXTERN zip_source_t *
+zip_source_file_create(const char *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error)
+{
+    int size;
+    wchar_t *wfname;
+    zip_source_t *source;
+
+    if (fname == NULL || length < -1) {
+       zip_error_set(error, ZIP_ER_INVAL, 0);
+       return NULL;
+    }
+
+    /* Convert fname from UTF-8 to Windows-friendly UTF-16. */
+    size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, fname, -1, NULL, 0);
+    if (size == 0) {
+       zip_error_set(error, ZIP_ER_INVAL, 0);
+       return NULL;
+    }
+    if ((wfname = (wchar_t *)malloc(sizeof(wchar_t) * size)) == NULL) {
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
+       return NULL;
+    }
+    MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, fname, -1, wfname, size);
+
+    source = zip_source_win32w_create(wfname, start, length, error);
+
+    free(wfname);
+    return source;
+}
diff --git a/lib/zip_source_win32w.c b/lib/zip_source_win32w.c
new file mode 100644 (file)
index 0000000..27cdf91
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+zip_source_win32w.c -- create data source from Windows file (UTF-16)
+Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
+
+This file is part of libzip, a library to manipulate ZIP archives.
+The authors can be contacted at <libzip@nih.at>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the
+distribution.
+3. The names of the authors may not be used to endorse or promote
+products derived from this software without specific prior
+written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <errno.h>
+#include <stdio.h>
+
+#include "zipint.h"
+#include "zipwin32.h"
+
+static void * _win32_strdup_w(const void *str);
+static HANDLE _win32_open_w(_zip_source_win32_read_file_t *ctx);
+static HANDLE _win32_create_temp_w(_zip_source_win32_read_file_t *ctx, void **temp, zip_uint32_t value, PSECURITY_ATTRIBUTES sa);
+static int _win32_rename_temp_w(_zip_source_win32_read_file_t *ctx);
+static int _win32_remove_w(const void *fname);
+
+static _zip_source_win32_file_ops_t win32_ops_w = {
+    .op_strdup       = _win32_strdup_w,
+    .op_open         = _win32_open_w,
+    .op_create_temp  = _win32_create_temp_w,
+    .op_rename_temp  = _win32_rename_temp_w,
+    .op_remove       = _win32_remove_w
+};
+
+ZIP_EXTERN zip_source_t *
+zip_source_win32w(zip_t *za, const wchar_t *fname, zip_uint64_t start, zip_int64_t len)
+{
+    if (za == NULL)
+       return NULL;
+
+    return zip_source_win32w_create(fname, start, len, &za->error);
+}
+
+
+ZIP_EXTERN zip_source_t *
+zip_source_win32w_create(const wchar_t *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error)
+{
+    if (fname == NULL || length < -1) {
+       zip_error_set(error, ZIP_ER_INVAL, 0);
+       return NULL;
+    }
+
+    return _zip_source_win32_handle_or_name(fname, INVALID_HANDLE_VALUE, start, length, 1, NULL, &win32_ops_w, error);
+}
+
+
+static void *
+_win32_strdup_w(const void *str)
+{
+    return _wcsdup((const wchar_t *)str);
+}
+
+
+static HANDLE
+_win32_open_w(_zip_source_win32_read_file_t *ctx)
+{
+    return CreateFileW(ctx->fname, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+}
+
+
+static HANDLE
+_win32_create_temp_w(_zip_source_win32_read_file_t *ctx, void **temp, zip_uint32_t value, PSECURITY_ATTRIBUTES sa)
+{
+    int len;
+
+    len = wcslen((const wchar_t *)ctx->fname) + 10;
+    if (*temp == NULL) {
+       if ((*temp = malloc(sizeof(wchar_t) * len)) == NULL) {
+           zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0);
+           return INVALID_HANDLE_VALUE;
+       }
+    }
+    if (swprintf((wchar_t *)*temp, len, L"%s.%08x", (const wchar_t *)ctx->fname, value) != len - 1) {
+       return INVALID_HANDLE_VALUE;
+    }
+
+    return CreateFileW((const wchar_t *)*temp, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, sa, CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY, NULL);
+}
+
+
+static int
+_win32_rename_temp_w(_zip_source_win32_read_file_t *ctx)
+{
+    if (!MoveFileExW(ctx->tmpname, ctx->fname, MOVEFILE_REPLACE_EXISTING))
+       return -1;
+    return 0;
+}
+
+
+static int
+_win32_remove_w(const void *fname)
+{
+    DeleteFileW((const wchar_t *)fname);
+    return 0;
+}
diff --git a/lib/zip_source_window.c b/lib/zip_source_window.c
new file mode 100644 (file)
index 0000000..f02d048
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+  zip_source_window.c -- return part of lower source
+  Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "zipint.h"
+
+struct window {
+    zip_uint64_t start;
+    zip_uint64_t end;
+    zip_uint64_t offset;
+    zip_stat_t stat;
+    zip_error_t error;
+    zip_int64_t supports;
+    bool needs_seek;
+};
+
+static zip_int64_t window_read(zip_source_t *, void *, void *, zip_uint64_t, zip_source_cmd_t);
+
+
+zip_source_t *
+zip_source_window(zip_t *za, zip_source_t *src, zip_uint64_t start, zip_uint64_t len)
+{
+    return _zip_source_window_new(src, start, len, NULL, &za->error);
+}
+
+
+zip_source_t *
+_zip_source_window_new(zip_source_t *src, zip_uint64_t start, zip_uint64_t length, zip_stat_t *st, zip_error_t *error)
+{
+    struct window *ctx;
+    
+    if (src == NULL || start + length < start) {
+        zip_error_set(error, ZIP_ER_INVAL, 0);
+        return NULL;
+    }
+    
+    if ((ctx=(struct window *)malloc(sizeof(*ctx))) == NULL) {
+        zip_error_set(error, ZIP_ER_MEMORY, 0);
+        return NULL;
+    }
+    
+    ctx->start = start;
+    ctx->end = start + length;
+    zip_stat_init(&ctx->stat);
+    zip_error_init(&ctx->error);
+    ctx->supports = (zip_source_supports(src) & ZIP_SOURCE_SUPPORTS_SEEKABLE) | (zip_source_make_command_bitmap(ZIP_SOURCE_SUPPORTS, ZIP_SOURCE_TELL, -1));
+    ctx->needs_seek = (ctx->supports & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK)) ? true : false;
+    
+    if (st) {
+        if (_zip_stat_merge(&ctx->stat, st, error) < 0) {
+            free(ctx);
+            return NULL;
+        }
+    }
+    
+    return zip_source_layered_create(src, window_read, ctx, error);
+}
+
+
+int
+_zip_source_set_source_archive(zip_source_t *src, zip_t *za)
+{
+    src->source_archive = za;
+    return _zip_register_source(za, src);
+}
+
+
+/* called by zip_discard to avoid operating on file from closed archive */
+void
+_zip_source_invalidate(zip_source_t *src)
+{
+    src->source_closed = 1;
+
+    if (zip_error_code_zip(&src->error) == ZIP_ER_OK) {
+        zip_error_set(&src->error, ZIP_ER_ZIPCLOSED, 0);
+    }
+}
+
+
+static zip_int64_t
+window_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_source_cmd_t cmd)
+{
+    struct window *ctx;
+    zip_int64_t ret;
+    zip_uint64_t n, i;
+    char b[8192];
+
+    ctx = (struct window *)_ctx;
+
+    switch (cmd) {
+        case ZIP_SOURCE_CLOSE:
+            return 0;
+            
+        case ZIP_SOURCE_ERROR:
+            return zip_error_to_data(&ctx->error, data, len);
+            
+        case ZIP_SOURCE_FREE:
+            free(ctx);
+            return 0;
+
+        case ZIP_SOURCE_OPEN:
+            if (!ctx->needs_seek) {
+                for (n=0; n<ctx->start; n+=(zip_uint64_t)ret) {
+                    i = (ctx->start-n > sizeof(b) ? sizeof(b) : ctx->start-n);
+                    if ((ret=zip_source_read(src, b, i)) < 0) {
+                        _zip_error_set_from_source(&ctx->error, src);
+                        return -1;
+                    }
+                    if (ret==0) {
+                        zip_error_set(&ctx->error, ZIP_ER_EOF, 0);
+                        return -1;
+                    }
+                }
+               
+            }
+           ctx->offset = ctx->start;
+            return 0;
+
+        case ZIP_SOURCE_READ:
+            if (len > ctx->end - ctx->offset)
+                len = ctx->end - ctx->offset;
+            
+            if (len == 0)
+                return 0;
+            
+            if (ctx->needs_seek) {
+                if (zip_source_seek(src, (zip_int64_t)ctx->offset, SEEK_SET) < 0) {
+                    _zip_error_set_from_source(&ctx->error, src);
+                    return -1;
+                }
+            }
+            
+            if ((ret=zip_source_read(src, data, len)) < 0) {
+                zip_error_set(&ctx->error, ZIP_ER_EOF, 0);
+                return -1;
+            }
+
+            ctx->offset += (zip_uint64_t)ret;
+
+            if (ret == 0) {
+                if (ctx->offset < ctx->end) {
+                    zip_error_set(&ctx->error, ZIP_ER_EOF, 0);
+                    return -1;
+                }
+            }
+            return ret;
+            
+        case ZIP_SOURCE_SEEK:
+        {
+            zip_int64_t new_offset = zip_source_seek_compute_offset(ctx->offset - ctx->start, ctx->end - ctx->start, data, len, &ctx->error);
+
+            if (new_offset < 0) {
+                return -1;
+            }
+            
+            ctx->offset = (zip_uint64_t)new_offset + ctx->start;
+            return 0;
+        }
+
+       case ZIP_SOURCE_STAT:
+        {
+            zip_stat_t *st;
+            
+           st = (zip_stat_t *)data;
+            
+            if (_zip_stat_merge(st, &ctx->stat, &ctx->error) < 0) {
+                return -1;
+            }
+            return 0;
+        }
+            
+        case ZIP_SOURCE_SUPPORTS:
+            return ctx->supports;
+            
+        case ZIP_SOURCE_TELL:
+            return (zip_int64_t)(ctx->offset - ctx->start);
+            
+       default:
+            zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0);
+            return -1;
+    }
+}
+
+
+void
+_zip_deregister_source(zip_t *za, zip_source_t *src)
+{
+    unsigned int i;
+    
+    for (i=0; i<za->nopen_source; i++) {
+        if (za->open_source[i] == src) {
+            za->open_source[i] = za->open_source[za->nopen_source-1];
+            za->nopen_source--;
+            break;
+        }
+    }
+}
+
+
+int
+_zip_register_source(zip_t *za, zip_source_t *src)
+{
+    zip_source_t **open_source;
+    
+    if (za->nopen_source+1 >= za->nopen_source_alloc) {
+        unsigned int n;
+        n = za->nopen_source_alloc + 10;
+        open_source = (zip_source_t **)realloc(za->open_source, n*sizeof(zip_source_t *));
+        if (open_source == NULL) {
+            zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+            return -1;
+        }
+        za->nopen_source_alloc = n;
+        za->open_source = open_source;
+    }
+    
+    za->open_source[za->nopen_source++] = src;
+    
+    return 0;
+}
diff --git a/lib/zip_source_write.c b/lib/zip_source_write.c
new file mode 100644 (file)
index 0000000..c98f567
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+  zip_source_write.c -- start a new file for writing
+  Copyright (C) 2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "zipint.h"
+
+
+ZIP_EXTERN zip_int64_t
+zip_source_write(zip_source_t *src, const void *data, zip_uint64_t length)
+{
+    if (!ZIP_SOURCE_IS_OPEN_WRITING(src) || length > ZIP_INT64_MAX) {
+        zip_error_set(&src->error, ZIP_ER_INVAL, 0);
+        return -1;
+    }
+    
+    return _zip_source_call(src, (void *)data, length, ZIP_SOURCE_WRITE);
+}
index 2b9061f..e172ca2 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_source_zip.c -- create data source from zip file
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 #include <string.h>
 
 #include "zipint.h"
 
-struct read_zip {
-    struct zip_file *zf;
-    struct zip_stat st;
-    zip_uint64_t off;
-    zip_int64_t len;
-};
 
-static zip_int64_t read_zip(void *st, void *data, zip_uint64_t len,
-                       enum zip_source_cmd cmd);
-
-\f
-
-ZIP_EXTERN struct zip_source *
-zip_source_zip(struct zip *za, struct zip *srcza, zip_uint64_t srcidx,
-              int flags, zip_uint64_t start, zip_int64_t len)
+ZIP_EXTERN zip_source_t *
+zip_source_zip(zip_t *za, zip_t *srcza, zip_uint64_t srcidx,
+              zip_flags_t flags, zip_uint64_t start, zip_int64_t len)
 {
-    struct zip_error error;
-    struct zip_source *zs;
-    struct read_zip *p;
-
-    /* XXX: ZIP_FL_RECOMPRESS */
-
-    if (za == NULL)
-       return NULL;
-
-    if (srcza == NULL || len < -1 || srcidx < 0 || srcidx >= srcza->nentry) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-       return NULL;
+    if (len < -1) {
+        zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+        return NULL;
     }
-
-    if ((flags & ZIP_FL_UNCHANGED) == 0
-       && ZIP_ENTRY_DATA_CHANGED(srcza->entry+srcidx)) {
-       _zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
-       return NULL;
-    }
-
-    if (len == 0)
-       len = -1;
-
-    if (start == 0 && len == -1 && (flags & ZIP_FL_RECOMPRESS) == 0)
+        
+    if (len == -1)
+       len = 0;
+    
+    if (start == 0 && len == 0)
        flags |= ZIP_FL_COMPRESSED;
     else
        flags &= ~ZIP_FL_COMPRESSED;
 
-    if ((p=(struct read_zip *)malloc(sizeof(*p))) == NULL) {
-       _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
-       return NULL;
-    }
-       
-    _zip_error_copy(&error, &srcza->error);
-       
-    if (zip_stat_index(srcza, srcidx, flags, &p->st) < 0
-       || (p->zf=zip_fopen_index(srcza, srcidx, flags)) == NULL) {
-       free(p);
-       _zip_error_copy(&za->error, &srcza->error);
-       _zip_error_copy(&srcza->error, &error);
-       
-       return NULL;
-    }
-    p->off = start;
-    p->len = len;
-
-    if ((flags & ZIP_FL_COMPRESSED) == 0) {
-       p->st.size = p->st.comp_size = len;
-       p->st.comp_method = ZIP_CM_STORE;
-       p->st.crc = 0;
-    }
-    
-    if ((zs=zip_source_function(za, read_zip, p)) == NULL) {
-       free(p);
-       return NULL;
-    }
-
-    return zs;
-}
-
-\f
-
-static zip_int64_t
-read_zip(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd)
-{
-    struct read_zip *z;
-    char b[8192], *buf;
-    int i;
-    zip_uint64_t n;
-
-    z = (struct read_zip *)state;
-    buf = (char *)data;
-
-    switch (cmd) {
-    case ZIP_SOURCE_OPEN:
-       for (n=0; n<z->off; n+= i) {
-           i = (z->off-n > sizeof(b) ? sizeof(b) : z->off-n);
-           if ((i=zip_fread(z->zf, b, i)) < 0) {
-               zip_fclose(z->zf);
-               z->zf = NULL;
-               return -1;
-           }
-       }
-       return 0;
-       
-    case ZIP_SOURCE_READ:
-       if (z->len != -1)
-           n = len > z->len ? z->len : len;
-       else
-           n = len;
-       
-
-       if ((i=zip_fread(z->zf, buf, n)) < 0)
-           return -1;
-
-       if (z->len != -1)
-           z->len -= i;
-
-       return i;
-       
-    case ZIP_SOURCE_CLOSE:
-       return 0;
-
-    case ZIP_SOURCE_STAT:
-       if (len < sizeof(z->st))
-           return -1;
-       len = sizeof(z->st);
-
-       memcpy(data, &z->st, len);
-       return len;
-
-    case ZIP_SOURCE_ERROR:
-       {
-           int *e;
-
-           if (len < sizeof(int)*2)
-               return -1;
-
-           e = (int *)data;
-           zip_file_error_get(z->zf, e, e+1);
-       }
-       return sizeof(int)*2;
-
-    case ZIP_SOURCE_FREE:
-       zip_fclose(z->zf);
-       free(z);
-       return 0;
-
-    default:
-       ;
-    }
-
-    return -1;
+    return _zip_source_zip_new(za, srcza, srcidx, flags, start, (zip_uint64_t)len, NULL);
 }
diff --git a/lib/zip_source_zip_new.c b/lib/zip_source_zip_new.c
new file mode 100644 (file)
index 0000000..40f1195
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+  zip_source_zip_new.c -- prepare data structures for zip_fopen/zip_source_zip
+  Copyright (C) 2012-2015 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <stdlib.h>
+
+#include "zipint.h"
+
+
+zip_source_t *
+_zip_source_zip_new(zip_t *za, zip_t *srcza, zip_uint64_t srcidx, zip_flags_t flags, zip_uint64_t start, zip_uint64_t len, const char *password)
+{
+    zip_compression_implementation comp_impl;
+    zip_encryption_implementation enc_impl;
+    zip_source_t *src, *s2;
+    zip_uint64_t offset;
+    struct zip_stat st;
+
+    if (za == NULL)
+       return NULL;
+
+    if (srcza == NULL || srcidx >= srcza->nentry) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return NULL;
+    }
+
+    if ((flags & ZIP_FL_UNCHANGED) == 0
+       && (ZIP_ENTRY_DATA_CHANGED(srcza->entry+srcidx) || srcza->entry[srcidx].deleted)) {
+       zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
+       return NULL;
+    }
+
+    if (zip_stat_index(srcza, srcidx, flags|ZIP_FL_UNCHANGED, &st) < 0) {
+       zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+       return NULL;
+    }
+
+    if (flags & ZIP_FL_ENCRYPTED)
+       flags |= ZIP_FL_COMPRESSED;
+
+    if ((start > 0 || len > 0) && (flags & ZIP_FL_COMPRESSED)) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return NULL;
+    }
+
+    /* overflow or past end of file */
+    if ((start > 0 || len > 0) && (start+len < start || start+len > st.size)) {
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return NULL;
+    }
+
+    enc_impl = NULL;
+    if (((flags & ZIP_FL_ENCRYPTED) == 0) && (st.encryption_method != ZIP_EM_NONE)) {
+       if (password == NULL) {
+           zip_error_set(&za->error, ZIP_ER_NOPASSWD, 0);
+           return NULL;
+       }
+       if ((enc_impl=_zip_get_encryption_implementation(st.encryption_method)) == NULL) {
+           zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0);
+           return NULL;
+       }
+    }
+
+    comp_impl = NULL;
+    if ((flags & ZIP_FL_COMPRESSED) == 0) {
+       if (st.comp_method != ZIP_CM_STORE) {
+           if ((comp_impl=_zip_get_compression_implementation(st.comp_method)) == NULL) {
+               zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0);
+               return NULL;
+           }
+       }
+    }
+
+    if ((offset=_zip_file_get_offset(srcza, srcidx, &za->error)) == 0)
+       return NULL;
+
+    if (st.comp_size == 0) {
+       return zip_source_buffer(za, NULL, 0, 0);
+    }
+
+    if (start+len > 0 && enc_impl == NULL && comp_impl == NULL) {
+       struct zip_stat st2;
+       
+       st2.size = len ? len : st.size-start;
+       st2.comp_size = st2.size;
+       st2.comp_method = ZIP_CM_STORE;
+       st2.mtime = st.mtime;
+       st2.valid = ZIP_STAT_SIZE|ZIP_STAT_COMP_SIZE|ZIP_STAT_COMP_METHOD|ZIP_STAT_MTIME;
+       
+       if ((src = _zip_source_window_new(srcza->src, offset+start, st2.size, &st2, &za->error)) == NULL) {
+           return NULL;
+       }
+    }
+    else {
+       if ((src = _zip_source_window_new(srcza->src, offset, st.comp_size, &st, &za->error)) == NULL) {
+           return NULL;
+       }
+    }
+       
+    if (_zip_source_set_source_archive(src, srcza) < 0) {
+       zip_source_free(src);
+       return NULL;
+    }
+
+    /* creating a layered source calls zip_keep() on the lower layer, so we free it */
+       
+    if (enc_impl) {
+       s2 = enc_impl(za, src, st.encryption_method, 0, password);
+       zip_source_free(src);
+       if (s2 == NULL) {
+           return NULL;
+       }
+       src = s2;
+    }
+    if (comp_impl) {
+       s2 = comp_impl(za, src, st.comp_method, 0);
+       zip_source_free(src);
+       if (s2 == NULL) {
+           return NULL;
+       }
+       src = s2;
+    }
+    if (((flags & ZIP_FL_COMPRESSED) == 0 || st.comp_method == ZIP_CM_STORE) && (len == 0 || len == st.comp_size)) {
+       /* when reading the whole file, check for CRC errors */
+       s2 = zip_source_crc(za, src, 1);
+       zip_source_free(src);
+       if (s2 == NULL) {
+           return NULL;
+       }
+       src = s2;
+    }
+
+    if (start+len > 0 && (comp_impl || enc_impl)) {
+       s2 = zip_source_window(za, src, start, len ? len : st.size-start);
+       zip_source_free(src);
+       if (s2 == NULL) {
+           return NULL;
+       }
+       src = s2;
+    }
+
+    return src;
+}
index df1c0b5..cf8e566 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_stat.c -- get information about file by name
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_stat(struct zip *za, const char *fname, int flags, struct zip_stat *st)
+zip_stat(zip_t *za, const char *fname, zip_flags_t flags, zip_stat_t *st)
 {
-    int idx;
+    zip_int64_t idx;
 
     if ((idx=zip_name_locate(za, fname, flags)) < 0)
        return -1;
 
-    return zip_stat_index(za, idx, flags, st);
+    return zip_stat_index(za, (zip_uint64_t)idx, flags, st);
 }
index 0e15b55..601e3f7 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_stat_index.c -- get information about file by index
-  Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_stat_index(struct zip *za, zip_uint64_t index, int flags,
-              struct zip_stat *st)
+zip_stat_index(zip_t *za, zip_uint64_t index, zip_flags_t flags,
+              zip_stat_t *st)
 {
     const char *name;
-    
-    if (index >= za->nentry) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+    zip_dirent_t *de;
+
+    if ((de=_zip_get_dirent(za, index, flags, NULL)) == NULL)
        return -1;
-    }
 
     if ((name=zip_get_name(za, index, flags)) == NULL)
        return -1;
@@ -55,26 +52,21 @@ zip_stat_index(struct zip *za, zip_uint64_t index, int flags,
     if ((flags & ZIP_FL_UNCHANGED) == 0
        && ZIP_ENTRY_DATA_CHANGED(za->entry+index)) {
        if (zip_source_stat(za->entry[index].source, st) < 0) {
-           _zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
+           zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
            return -1;
        }
     }
     else {
-       if (za->cdir == NULL || index >= za->cdir->nentry) {
-           _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
-           return -1;
-       }
-
        zip_stat_init(st);
 
-       st->crc = za->cdir->entry[index].crc;
-       st->size = za->cdir->entry[index].uncomp_size;
-       st->mtime = za->cdir->entry[index].last_mod;
-       st->comp_size = za->cdir->entry[index].comp_size;
-       st->comp_method = za->cdir->entry[index].comp_method;
-       if (za->cdir->entry[index].bitflags & ZIP_GPBF_ENCRYPTED) {
-           if (za->cdir->entry[index].bitflags & ZIP_GPBF_STRONG_ENCRYPTION) {
-               /* XXX */
+       st->crc = de->crc;
+       st->size = de->uncomp_size;
+       st->mtime = de->last_mod;
+       st->comp_size = de->comp_size;
+       st->comp_method = (zip_uint16_t)de->comp_method;
+       if (de->bitflags & ZIP_GPBF_ENCRYPTED) {
+           if (de->bitflags & ZIP_GPBF_STRONG_ENCRYPTION) {
+               /* TODO */
                st->encryption_method = ZIP_EM_UNKNOWN;
            }
            else
index d17613b..6b7d633 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_stat_init.c -- initialize struct zip_stat.
-  Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
+#include <string.h>
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN void
-zip_stat_init(struct zip_stat *st)
+zip_stat_init(zip_stat_t *st)
 {
     st->valid = 0;
     st->name = NULL;
@@ -50,3 +49,37 @@ zip_stat_init(struct zip_stat *st)
     st->comp_method = ZIP_CM_STORE;
     st->encryption_method = ZIP_EM_NONE;
 }
+
+
+int
+_zip_stat_merge(zip_stat_t *dst, const zip_stat_t *src, zip_error_t *error)
+{
+    /* name is not merged, since zip_stat_t doesn't own it, and src may not be valid as long as dst */
+    if (src->valid & ZIP_STAT_INDEX) {
+        dst->index = src->index;
+    }
+    if (src->valid & ZIP_STAT_SIZE) {
+        dst->size = src->size;
+    }
+    if (src->valid & ZIP_STAT_COMP_SIZE) {
+        dst->comp_size = src->comp_size;
+    }
+    if (src->valid & ZIP_STAT_MTIME) {
+        dst->mtime = src->mtime;
+    }
+    if (src->valid & ZIP_STAT_CRC) {
+        dst->crc = src->crc;
+    }
+    if (src->valid & ZIP_STAT_COMP_METHOD) {
+        dst->comp_method = src->comp_method;
+    }
+    if (src->valid & ZIP_STAT_ENCRYPTION_METHOD) {
+        dst->encryption_method = src->encryption_method;
+    }
+    if (src->valid & ZIP_STAT_FLAGS) {
+        dst->flags = src->flags;
+    }
+    dst->valid |= src->valid;
+    
+    return 0;
+}
index 9ebee14..98c4f6b 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_sterror.c -- get string representation of zip error
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN const char *
-zip_strerror(struct zip *za)
+zip_strerror(zip_t *za)
 {
-    return _zip_error_strerror(&za->error);
+    return zip_error_strerror(&za->error);
 }
diff --git a/lib/zip_string.c b/lib/zip_string.c
new file mode 100644 (file)
index 0000000..307a425
--- /dev/null
@@ -0,0 +1,188 @@
+/*
+  zip_string.c -- string handling (with encoding)
+  Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "zipint.h"
+
+
+zip_uint32_t
+_zip_string_crc32(const zip_string_t *s)
+{
+    zip_uint32_t crc;
+    
+    crc = (zip_uint32_t)crc32(0L, Z_NULL, 0);
+
+    if (s != NULL)    
+       crc = (zip_uint32_t)crc32(crc, s->raw, s->length);
+
+    return crc;
+}
+
+
+int
+_zip_string_equal(const zip_string_t *a, const zip_string_t *b)
+{
+    if (a == NULL || b == NULL)
+       return a == b;
+
+    if (a->length != b->length)
+       return 0;
+
+    /* TODO: encoding */
+
+    return (memcmp(a->raw, b->raw, a->length) == 0);
+}
+
+
+void
+_zip_string_free(zip_string_t *s)
+{
+    if (s == NULL)
+       return;
+
+    free(s->raw);
+    free(s->converted);
+    free(s);
+}
+
+
+const zip_uint8_t *
+_zip_string_get(zip_string_t *string, zip_uint32_t *lenp, zip_flags_t flags, zip_error_t *error)
+{
+    static const zip_uint8_t empty[1] = "";
+
+    if (string == NULL) {
+       if (lenp)
+           *lenp = 0;
+       return empty;
+    }
+
+    if ((flags & ZIP_FL_ENC_RAW) == 0) {
+       /* start guessing */
+       if (string->encoding == ZIP_ENCODING_UNKNOWN)
+           _zip_guess_encoding(string, ZIP_ENCODING_UNKNOWN);
+
+       if (((flags & ZIP_FL_ENC_STRICT)
+            && string->encoding != ZIP_ENCODING_ASCII && string->encoding != ZIP_ENCODING_UTF8_KNOWN)
+           || (string->encoding == ZIP_ENCODING_CP437)) {
+           if (string->converted == NULL) {
+               if ((string->converted=_zip_cp437_to_utf8(string->raw, string->length,
+                                                         &string->converted_length, error)) == NULL)
+                   return NULL;
+           }
+           if (lenp)
+               *lenp = string->converted_length;
+           return string->converted;
+       }
+    }
+    
+    if (lenp)
+       *lenp = string->length;
+    return string->raw;
+}
+
+
+zip_uint16_t
+_zip_string_length(const zip_string_t *s)
+{
+    if (s == NULL)
+       return 0;
+
+    return s->length;
+}
+
+
+zip_string_t *
+_zip_string_new(const zip_uint8_t *raw, zip_uint16_t length, zip_flags_t flags, zip_error_t *error)
+{
+    zip_string_t *s;
+    zip_encoding_type_t expected_encoding;
+    
+    if (length == 0)
+       return NULL;
+
+    switch (flags & ZIP_FL_ENCODING_ALL) {
+    case ZIP_FL_ENC_GUESS:
+       expected_encoding = ZIP_ENCODING_UNKNOWN;
+       break;
+    case ZIP_FL_ENC_UTF_8:
+       expected_encoding = ZIP_ENCODING_UTF8_KNOWN;
+       break;
+    case ZIP_FL_ENC_CP437:
+       expected_encoding = ZIP_ENCODING_CP437;
+       break;
+    default:
+       zip_error_set(error, ZIP_ER_INVAL, 0);
+       return NULL;
+    }
+       
+    if ((s=(zip_string_t *)malloc(sizeof(*s))) == NULL) {
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
+       return NULL;
+    }
+
+    if ((s->raw=(zip_uint8_t *)malloc((size_t)(length+1))) == NULL) {
+       free(s);
+       return NULL;
+    }
+
+    memcpy(s->raw, raw, length);
+    s->raw[length] = '\0';
+    s->length = length;
+    s->encoding = ZIP_ENCODING_UNKNOWN;
+    s->converted = NULL;
+    s->converted_length = 0;
+
+    if (expected_encoding != ZIP_ENCODING_UNKNOWN) {
+       if (_zip_guess_encoding(s, expected_encoding) == ZIP_ENCODING_ERROR) {
+           _zip_string_free(s);
+           zip_error_set(error, ZIP_ER_INVAL, 0);
+           return NULL;
+       }
+    }
+    
+    return s;
+}
+
+
+int
+_zip_string_write(zip_t *za, const zip_string_t *s)
+{
+    if (s == NULL)
+       return 0;
+    
+    return _zip_write(za, s->raw, s->length);
+}
index e64186e..6c8a495 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_unchange.c -- undo changes to file in zip archive
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_unchange(struct zip *za, zip_uint64_t idx)
+zip_unchange(zip_t *za, zip_uint64_t idx)
 {
     return _zip_unchange(za, idx, 0);
 }
 
-\f
 
 int
-_zip_unchange(struct zip *za, zip_uint64_t idx, int allow_duplicates)
+_zip_unchange(zip_t *za, zip_uint64_t idx, int allow_duplicates)
 {
-    int i;
+    zip_int64_t i;
     
     if (idx >= za->nentry) {
-       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       zip_error_set(&za->error, ZIP_ER_INVAL, 0);
        return -1;
     }
 
-    if (za->entry[idx].ch_filename) {
-       if (!allow_duplicates) {
-           i = _zip_name_locate(za,
-                        _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL),
-                                0, NULL);
-           if (i != -1 && i != idx) {
-               _zip_error_set(&za->error, ZIP_ER_EXISTS, 0);
-               return -1;
-           }
+    if (!allow_duplicates && za->entry[idx].changes && (za->entry[idx].changes->changed & ZIP_DIRENT_FILENAME)) {
+       i = _zip_name_locate(za, _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL), 0, NULL);
+       if (i >= 0 && (zip_uint64_t)i != idx) {
+           zip_error_set(&za->error, ZIP_ER_EXISTS, 0);
+           return -1;
        }
-
-       free(za->entry[idx].ch_filename);
-       za->entry[idx].ch_filename = NULL;
     }
 
-    free(za->entry[idx].ch_extra);
-    za->entry[idx].ch_extra = NULL;
-    za->entry[idx].ch_extra_len = -1;
-    free(za->entry[idx].ch_comment);
-    za->entry[idx].ch_comment = NULL;
-    za->entry[idx].ch_comment_len = -1;
+    _zip_dirent_free(za->entry[idx].changes);
+    za->entry[idx].changes = NULL;
 
     _zip_unchange_data(za->entry+idx);
 
index 54a7a0d..6007683 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_unchange.c -- undo changes to all files in zip archive
-  Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_unchange_all(struct zip *za)
+zip_unchange_all(zip_t *za)
 {
-    int ret, i;
+    int ret;
+    zip_uint64_t i;
 
     ret = 0;
     for (i=0; i<za->nentry; i++)
index 8f9c024..920255c 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_unchange_archive.c -- undo global changes to ZIP archive
-  Copyright (C) 2006-2008 Dieter Baron and Thomas Klausner
+  Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <stdlib.h>
 
 #include "zipint.h"
 
-\f
 
 ZIP_EXTERN int
-zip_unchange_archive(struct zip *za)
+zip_unchange_archive(zip_t *za)
 {
-    free(za->ch_comment);
-    za->ch_comment = NULL;
-    za->ch_comment_len = -1;
-
+    if (za->comment_changed) {
+       _zip_string_free(za->comment_changes);
+       za->comment_changes = NULL;
+       za->comment_changed = 0;
+    }
+    
     za->ch_flags = za->flags;
 
     return 0;
index 431f2d0..839d9a3 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zip_unchange_data.c -- undo helper function
-  Copyright (C) 1999, 2004 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
-
-#include <stdlib.h>
 
 #include "zipint.h"
 
 void
-_zip_unchange_data(struct zip_entry *ze)
+_zip_unchange_data(zip_entry_t *ze)
 {
     if (ze->source) {
        zip_source_free(ze->source);
        ze->source = NULL;
     }
-    
-    ze->state = ze->ch_filename ? ZIP_ST_RENAMED : ZIP_ST_UNCHANGED;
+
+    if (ze->changes != NULL && (ze->changes->changed & ZIP_DIRENT_COMP_METHOD) && ze->changes->comp_method == ZIP_CM_REPLACED_DEFAULT) {
+       ze->changes->changed &= ~ZIP_DIRENT_COMP_METHOD;
+       if (ze->changes->changed == 0) {
+           _zip_dirent_free(ze->changes);
+           ze->changes = NULL;
+       }
+    }
+
+    ze->deleted = 0;
 }
 
diff --git a/lib/zip_utf-8.c b/lib/zip_utf-8.c
new file mode 100644 (file)
index 0000000..f38eea0
--- /dev/null
@@ -0,0 +1,249 @@
+/*
+  zip_utf-8.c -- UTF-8 support functions for libzip
+  Copyright (C) 2011-2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "zipint.h"
+
+#include <stdlib.h>
+
+
+static const zip_uint16_t _cp437_to_unicode[256] = {
+    /* 0x00 - 0x0F */
+    0x2007, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
+    0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C,
+
+    /* 0x10 - 0x1F */
+    0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8,
+    0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC,
+
+    /* 0x20 - 0x2F */
+    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+    0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+
+    /* 0x30 - 0x3F */
+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+
+    /* 0x40 - 0x4F */
+    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+
+    /* 0x50 - 0x5F */
+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+    0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+
+    /* 0x60 - 0x6F */
+    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+
+    /* 0x70 - 0x7F */
+    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+    0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2302,
+
+    /* 0x80 - 0x8F */
+    0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7,
+    0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,
+
+    /* 0x90 - 0x9F */
+    0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9,
+    0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192,
+
+    /* 0xA0 - 0xAF */
+    0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA,
+    0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,
+
+    /* 0xB0 - 0xBF */
+    0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
+    0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,
+
+    /* 0xC0 - 0xCF */
+    0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,
+    0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,
+
+    /* 0xD0 - 0xDF */
+    0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,
+    0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,
+
+    /* 0xE0 - 0xEF */
+    0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4,
+    0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,
+
+    /* 0xF0 - 0xFF */
+    0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248,
+    0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0
+};
+
+#define UTF_8_LEN_2_MASK     0xe0
+#define UTF_8_LEN_2_MATCH    0xc0
+#define UTF_8_LEN_3_MASK     0xf0
+#define UTF_8_LEN_3_MATCH    0xe0
+#define UTF_8_LEN_4_MASK     0xf8
+#define UTF_8_LEN_4_MATCH    0xf0
+#define UTF_8_CONTINUE_MASK  0xc0
+#define UTF_8_CONTINUE_MATCH 0x80
+
+
+zip_encoding_type_t
+_zip_guess_encoding(zip_string_t *str, zip_encoding_type_t expected_encoding)
+{
+    zip_encoding_type_t enc;
+    const zip_uint8_t *name;
+    zip_uint32_t i, j, ulen;
+
+    if (str == NULL)
+       return ZIP_ENCODING_ASCII;
+
+    name = str->raw;
+
+    if (str->encoding != ZIP_ENCODING_UNKNOWN)
+       enc = str->encoding;
+    else {
+       enc = ZIP_ENCODING_ASCII;
+       for (i=0; i<str->length; i++) {
+           if ((name[i] > 31 && name[i] < 128) || name[i] == '\r' || name[i] == '\n' || name[i] == '\t')
+               continue;
+
+           enc = ZIP_ENCODING_UTF8_GUESSED;
+           if ((name[i] & UTF_8_LEN_2_MASK) == UTF_8_LEN_2_MATCH)
+               ulen = 1;
+           else if ((name[i] & UTF_8_LEN_3_MASK) == UTF_8_LEN_3_MATCH)
+               ulen = 2;
+           else if ((name[i] & UTF_8_LEN_4_MASK) == UTF_8_LEN_4_MATCH)
+               ulen = 3;
+           else {
+               enc = ZIP_ENCODING_CP437;
+               break;
+           }
+
+           if (i + ulen >= str->length) {
+               enc = ZIP_ENCODING_CP437;
+               break;
+           }
+
+           for (j=1; j<=ulen; j++) {
+               if ((name[i+j] & UTF_8_CONTINUE_MASK) != UTF_8_CONTINUE_MATCH) {
+                   enc = ZIP_ENCODING_CP437;
+                   goto done;
+               }
+           }
+           i += ulen;
+       }
+    }
+
+done:
+    str->encoding = enc;
+
+    if (expected_encoding != ZIP_ENCODING_UNKNOWN) {
+       if (expected_encoding == ZIP_ENCODING_UTF8_KNOWN && enc == ZIP_ENCODING_UTF8_GUESSED)
+           str->encoding = enc = ZIP_ENCODING_UTF8_KNOWN;
+
+       if (expected_encoding != enc && enc != ZIP_ENCODING_ASCII)
+           return ZIP_ENCODING_ERROR;
+    }
+    
+    return enc;
+}
+
+
+static zip_uint32_t
+_zip_unicode_to_utf8_len(zip_uint32_t codepoint)
+{
+    if (codepoint < 0x0080)
+       return 1;
+    if (codepoint < 0x0800)
+       return 2;
+    if (codepoint < 0x10000)
+       return 3;
+    return 4;
+}
+
+
+static zip_uint32_t
+_zip_unicode_to_utf8(zip_uint32_t codepoint, zip_uint8_t *buf)
+{
+    if (codepoint < 0x0080) {
+       buf[0] = codepoint & 0xff;
+       return 1;
+    }
+    if (codepoint < 0x0800) {
+       buf[0] = (zip_uint8_t)(UTF_8_LEN_2_MATCH | ((codepoint >> 6) & 0x1f));
+       buf[1] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | (codepoint & 0x3f));
+       return 2;
+    }
+    if (codepoint < 0x10000) {
+       buf[0] = (zip_uint8_t)(UTF_8_LEN_3_MATCH | ((codepoint >> 12) & 0x0f));
+       buf[1] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | ((codepoint >> 6) & 0x3f));
+       buf[2] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | (codepoint & 0x3f));
+       return 3;
+    }
+    buf[0] = (zip_uint8_t)(UTF_8_LEN_4_MATCH | ((codepoint >> 18) & 0x07));
+    buf[1] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | ((codepoint >> 12) & 0x3f));
+    buf[2] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | ((codepoint >> 6) & 0x3f));
+    buf[3] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | (codepoint & 0x3f));
+    return 4;
+}
+
+
+zip_uint8_t *
+_zip_cp437_to_utf8(const zip_uint8_t * const _cp437buf, zip_uint32_t len,
+                  zip_uint32_t *utf8_lenp, zip_error_t *error)
+{
+    zip_uint8_t *cp437buf = (zip_uint8_t *)_cp437buf;
+    zip_uint8_t *utf8buf;
+    zip_uint32_t buflen, i, offset;
+
+    if (len == 0) {
+       if (utf8_lenp)
+           *utf8_lenp = 0;
+       return NULL;
+    }
+
+    buflen = 1;
+    for (i=0; i<len; i++)
+       buflen += _zip_unicode_to_utf8_len(_cp437_to_unicode[cp437buf[i]]);
+
+    if ((utf8buf=(zip_uint8_t*)malloc(buflen)) == NULL) {
+       zip_error_set(error, ZIP_ER_MEMORY, 0);
+       return NULL;
+    }
+
+    offset = 0;
+    for (i=0; i<len; i++)
+       offset += _zip_unicode_to_utf8(_cp437_to_unicode[cp437buf[i]],
+                                      utf8buf+offset);
+
+    utf8buf[buflen-1] = 0;
+    if (utf8_lenp)
+       *utf8_lenp = buflen-1;
+    return utf8buf;
+}
index 2f748bd..9954056 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
   zipint.h -- internal declarations.
-  Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* to have *_MAX definitions for all types when compiling with g++ */
+#define __STDC_LIMIT_MACROS
+
 #include <zlib.h>
 
 #ifdef _WIN32
 #include <io.h>
 #endif
 
+#ifndef _ZIP_COMPILING_DEPRECATED
+#define ZIP_DISABLE_DEPRECATED
+#endif
+
 #include "zip.h"
-#include "config.h"
 
-#ifndef HAVE_FSEEKO
-#define fseeko(s, o, w)        (fseek((s), (long int)(o), (w)))
+#ifdef HAVE_STDBOOL_H
+#include <stdbool.h>
+#else
+typedef char bool;
+#define true    1
+#define false   0
 #endif
 
-#ifndef HAVE_FTELLO
-#define ftello(s)      ((long)ftell((s)))
+#ifdef _WIN32
+#if defined(HAVE__CLOSE)
+#define close          _close
 #endif
-
-#ifndef HAVE_MKSTEMP
-int _zip_mkstemp(char *);
-#define mkstemp _zip_mkstemp
+#if defined(HAVE__DUP)
+#define dup            _dup
 #endif
-
-#ifdef HAVE_MOVEFILEEXA
-#include <windows.h>
-#define _zip_rename(s, t)                                              \
-       (!MoveFileExA((s), (t),                                         \
-                    MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING))
-#else
-#define _zip_rename    rename
+/* crashes reported when using fdopen instead of _fdopen on Windows/Visual Studio 10/Win64 */
+#if defined(HAVE__FDOPEN)
+#define fdopen         _fdopen
+#endif
+#if defined(HAVE__FILENO)
+#define fileno         _fileno
 #endif
-
 /* Windows' open() doesn't understand Unix permissions */
-#if !defined(HAVE_OPEN)
 #if defined(HAVE__OPEN)
 #define open(a, b, c)  _open((a), (b))
 #endif
-#endif
-
-#if !defined(HAVE_SNPRINTF)
 #if defined(HAVE__SNPRINTF)
 #define snprintf       _snprintf
 #endif
+#if defined(HAVE__STRDUP)
+#if !defined(HAVE_STRDUP) || defined(_WIN32)
+#undef strdup
+#define strdup         _strdup
+#endif
+#endif
+#endif
+
+#ifndef HAVE_FSEEKO
+#define fseeko(s, o, w)        (fseek((s), (long int)(o), (w)))
+#endif
+
+#ifndef HAVE_FTELLO
+#define ftello(s)      ((long)ftell((s)))
+#endif
+
+#ifndef HAVE_MKSTEMP
+int _zip_mkstemp(char *);
+#define mkstemp _zip_mkstemp
 #endif
 
 #if !defined(HAVE_STRCASECMP)
-#if defined(HAVE__STRCMPI)
-#define strcasecmp     _strcmpi
-#elif defined(HAVE__STRICMP)
+#if defined(HAVE__STRICMP)
 #define strcasecmp     _stricmp
 #endif
 #endif
 
-#if !defined(HAVE_STRDUP)
-#if defined(HAVE__STRDUP)
-#define strdup         _strdup
+#if SIZEOF_OFF_T == 8
+#define ZIP_OFF_MAX ZIP_INT64_MAX
+#define ZIP_OFF_MIN ZIP_INT64_MIN
+#elif SIZEOF_OFF_T == 4
+#define ZIP_OFF_MAX ZIP_INT32_MAX
+#define ZIP_OFF_MIN ZIP_INT32_MIN
+#elif SIZEOF_OFF_T == 2
+#define ZIP_OFF_MAX ZIP_INT16_MAX
+#define ZIP_OFF_MIN ZIP_INT16_MIN
+#else
+#error unsupported size of off_t
 #endif
+
+#if defined(HAVE_FTELLO) && defined(HAVE_FSEEKO)
+#define ZIP_FSEEK_MAX ZIP_OFF_MAX
+#define ZIP_FSEEK_MIN ZIP_OFF_MIN
+#else
+#define ZIP_FSEEK_MAX LONG_MAX
+#define ZIP_FSEEK_MIN LONG_MIN
 #endif
 
-\f
+#ifndef SIZE_MAX
+#if SIZEOF_SIZE_T == 8
+#define SIZE_MAX ZIP_INT64_MAX
+#elif SIZEOF_SIZE_T == 4
+#define SIZE_MAX ZIP_INT32_MAX
+#elif SIZEOF_SIZE_T == 2
+#define SIZE_MAX ZIP_INT16_MAX
+#else
+#error unsupported size of size_t
+#endif
+#endif
 
 #define CENTRAL_MAGIC "PK\1\2"
 #define LOCAL_MAGIC   "PK\3\4"
 #define EOCD_MAGIC    "PK\5\6"
 #define DATADES_MAGIC "PK\7\8"
-#define TORRENT_SIG    "TORRENTZIPPED-"
-#define TORRENT_SIG_LEN        14
-#define TORRENT_CRC_LEN 8
-#define TORRENT_MEM_LEVEL      8
+#define EOCD64LOC_MAGIC "PK\6\7"
+#define EOCD64_MAGIC  "PK\6\6"
 #define CDENTRYSIZE         46u
 #define LENTRYSIZE          30
 #define MAXCOMLEN        65536
 #define MAXEXTLEN        65536
 #define EOCDLEN             22
-#define CDBUFSIZE       (MAXCOMLEN+EOCDLEN)
+#define EOCD64LOCLEN       20
+#define EOCD64LEN          56
+#define CDBUFSIZE       (MAXCOMLEN+EOCDLEN+EOCD64LOCLEN)
 #define BUFSIZE                8192
+#define EFZIP64SIZE 28
+
+#define ZIP_CM_REPLACED_DEFAULT        (-2)
+
+#define ZIP_CM_IS_DEFAULT(x)   ((x) == ZIP_CM_DEFAULT || (x) == ZIP_CM_REPLACED_DEFAULT)
+
+#define ZIP_EF_UTF_8_COMMENT   0x6375
+#define ZIP_EF_UTF_8_NAME      0x7075
+#define ZIP_EF_ZIP64           0x0001
+
+#define ZIP_EF_IS_INTERNAL(id) ((id) == ZIP_EF_UTF_8_COMMENT || (id) == ZIP_EF_UTF_8_NAME || (id) == ZIP_EF_ZIP64)
 
-\f
+/* according to unzip-6.0's zipinfo.c, this corresponds to a regular file with rw permissions for everyone */
+#define ZIP_EXT_ATTRIB_DEFAULT         (0100666u<<16)
+/* according to unzip-6.0's zipinfo.c, this corresponds to a directory with rwx permissions for everyone */
+#define ZIP_EXT_ATTRIB_DEFAULT_DIR     (0040777u<<16)
+
+
+#define ZIP_MAX(a, b)          ((a) > (b) ? (a) : (b))
+#define ZIP_MIN(a, b)          ((a) < (b) ? (a) : (b))
 
 /* This section contains API that won't materialize like this.  It's
    placed in the internal section, pending cleanup. */
 
-typedef struct zip_source *(*zip_compression_implementation)(struct zip *,
-                                                    struct zip_source *,
-                                                    zip_uint16_t, int);
-typedef struct zip_source *(*zip_encryption_implementation)(struct zip *,
-                                                   struct zip_source *,
-                                                   zip_uint16_t, int,
-                                                   const char *);
-
-ZIP_EXTERN zip_compression_implementation zip_get_compression_implementation(
-    zip_uint16_t);
-ZIP_EXTERN zip_encryption_implementation zip_get_encryption_implementation(
-    zip_uint16_t);
+/* flags for compression and encryption sources */
 
+#define ZIP_CODEC_DECODE       0 /* decompress/decrypt (encode flag not set) */
+#define ZIP_CODEC_ENCODE       1 /* compress/encrypt */
 
-\f
 
-/* This section contains API that is of limited use until support for
-   user-supplied compression/encryption implementation is finished.
-   Thus we will keep it private for now. */
+typedef zip_source_t *(*zip_compression_implementation)(zip_t *, zip_source_t *, zip_int32_t, int);
+typedef zip_source_t *(*zip_encryption_implementation)(zip_t *, zip_source_t *, zip_uint16_t, int, const char *);
 
-typedef zip_int64_t (*zip_source_layered_callback)(struct zip_source *, void *,
-                                                  void *, zip_uint64_t,
-                                                  enum zip_source_cmd);
+zip_compression_implementation _zip_get_compression_implementation(zip_int32_t);
+zip_encryption_implementation _zip_get_encryption_implementation(zip_uint16_t);
 
-ZIP_EXTERN void zip_source_close(struct zip_source *);
-ZIP_EXTERN struct zip_source *zip_source_crc(struct zip *, struct zip_source *,
-                                            int);
-ZIP_EXTERN struct zip_source *zip_source_deflate(struct zip *,
-                                                struct zip_source *,
-                                                zip_uint16_t, int);
-ZIP_EXTERN void zip_source_error(struct zip_source *, int *, int *);
-ZIP_EXTERN struct zip_source *zip_source_layered(struct zip *,
-                                                struct zip_source *,
-                                                zip_source_layered_callback,
-                                                void *);
-ZIP_EXTERN int zip_source_open(struct zip_source *);
-ZIP_EXTERN struct zip_source *zip_source_pkware(struct zip *,
-                                               struct zip_source *,
-                                               zip_uint16_t, int,
-                                               const char *);
-ZIP_EXTERN zip_int64_t zip_source_read(struct zip_source *, void *,
-                                      zip_uint64_t);
-ZIP_EXTERN int zip_source_stat(struct zip_source *, struct zip_stat *);
 
 
-/* This function will probably remain private.  It is not needed to
-   implement compression/encryption routines.  (We should probably
-   rename it to _zip_source_pop.) */
+/* This API is not final yet, but we need it internally, so it's private for now. */
 
-ZIP_EXTERN struct zip_source *zip_source_pop(struct zip_source *);
+const zip_uint8_t *zip_get_extra_field_by_id(zip_t *, int, int, zip_uint16_t, int, zip_uint16_t *);
 
-\f
+/* This section contains API that is of limited use until support for
+   user-supplied compression/encryption implementation is finished.
+   Thus we will keep it private for now. */
 
-/* state of change of a file in zip archive */
+typedef zip_int64_t (*zip_source_layered_callback)(zip_source_t *, void *, void *, zip_uint64_t, enum zip_source_cmd);
+zip_source_t *zip_source_crc(zip_t *, zip_source_t *, int);
+zip_source_t *zip_source_deflate(zip_t *, zip_source_t *, zip_int32_t, int);
+zip_source_t *zip_source_layered(zip_t *, zip_source_t *, zip_source_layered_callback, void *);
+zip_source_t *zip_source_layered_create(zip_source_t *src, zip_source_layered_callback cb, void *ud, zip_error_t *error);
+zip_source_t *zip_source_pkware(zip_t *, zip_source_t *, zip_uint16_t, int, const char *);
+int zip_source_remove(zip_source_t *);
+zip_int64_t zip_source_supports(zip_source_t *src);
+zip_source_t *zip_source_window(zip_t *, zip_source_t *, zip_uint64_t, zip_uint64_t);
 
-enum zip_state { ZIP_ST_UNCHANGED, ZIP_ST_DELETED, ZIP_ST_REPLACED,
-                ZIP_ST_ADDED, ZIP_ST_RENAMED };
 
 /* error source for layered sources */
 
@@ -184,176 +225,321 @@ enum zip_les { ZIP_LES_NONE, ZIP_LES_UPPER, ZIP_LES_LOWER, ZIP_LES_INVAL };
 #define ZIP_GPBF_ENCRYPTED             0x0001  /* is encrypted */
 #define ZIP_GPBF_DATA_DESCRIPTOR       0x0008  /* crc/size after file data */
 #define ZIP_GPBF_STRONG_ENCRYPTION     0x0040  /* uses strong encryption */
+#define ZIP_GPBF_ENCODING_UTF_8                0x0800  /* file name encoding is UTF-8 */
+
+
+/* extra fields */
+#define ZIP_EF_LOCAL           ZIP_FL_LOCAL                    /* include in local header */
+#define ZIP_EF_CENTRAL         ZIP_FL_CENTRAL                  /* include in central directory */
+#define ZIP_EF_BOTH            (ZIP_EF_LOCAL|ZIP_EF_CENTRAL)   /* include in both */
+
+#define ZIP_FL_FORCE_ZIP64     1024  /* force zip64 extra field (_zip_dirent_write) */
 
-/* error information */
+#define ZIP_FL_ENCODING_ALL    (ZIP_FL_ENC_GUESS|ZIP_FL_ENC_CP437|ZIP_FL_ENC_UTF_8)
 
-struct zip_error {
-    int zip_err;       /* libzip error code (ZIP_ER_*) */
-    int sys_err;       /* copy of errno (E*) or zlib error code */
-    char *str;         /* string representation or NULL */
+
+/* encoding type */
+enum zip_encoding_type {
+    ZIP_ENCODING_UNKNOWN,       /* not yet analyzed */
+    ZIP_ENCODING_ASCII,         /* plain ASCII */
+    ZIP_ENCODING_UTF8_KNOWN,    /* is UTF-8 */
+    ZIP_ENCODING_UTF8_GUESSED,  /* possibly UTF-8 */
+    ZIP_ENCODING_CP437,         /* Code Page 437 */
+    ZIP_ENCODING_ERROR          /* should be UTF-8 but isn't */
 };
 
+typedef enum zip_encoding_type zip_encoding_type_t;
+
+typedef struct zip_cdir zip_cdir_t;
+typedef struct zip_dirent zip_dirent_t;
+typedef struct zip_entry zip_entry_t;
+typedef struct zip_extra_field zip_extra_field_t;
+typedef struct zip_string zip_string_t;
+typedef struct zip_buffer zip_buffer_t;
+
+
 /* zip archive, part of API */
 
 struct zip {
-    char *zn;                  /* file name */
-    FILE *zp;                  /* file */
-    struct zip_error error;    /* error information */
-
-    unsigned int flags;                /* archive global flags */
-    unsigned int ch_flags;     /* changed archive global flags */
-
-    char *default_password;    /* password used when no other supplied */
-
-    struct zip_cdir *cdir;     /* central directory */
-    char *ch_comment;          /* changed archive comment */
-    int ch_comment_len;                /* length of changed zip archive
-                                * comment, -1 if unchanged */
-    zip_uint64_t nentry;       /* number of entries */
-    zip_uint64_t nentry_alloc; /* number of entries allocated */
-    struct zip_entry *entry;   /* entries */
-    int nfile;                 /* number of opened files within archive */
-    int nfile_alloc;           /* number of files allocated */
-    struct zip_file **file;    /* opened files within archive */
+    zip_source_t *src;                  /* data source for archive */
+    unsigned int open_flags;           /* flags passed to zip_open */
+    zip_error_t error;                  /* error information */
+
+    unsigned int flags;                        /* archive global flags */
+    unsigned int ch_flags;             /* changed archive global flags */
+
+    char *default_password;            /* password used when no other supplied */
+
+    zip_string_t *comment_orig;         /* archive comment */
+    zip_string_t *comment_changes;  /* changed archive comment */
+    bool comment_changed;              /* whether archive comment was changed */
+
+    zip_uint64_t nentry;               /* number of entries */
+    zip_uint64_t nentry_alloc;         /* number of entries allocated */
+    zip_entry_t *entry;                 /* entries */
+
+    unsigned int nopen_source;         /* number of open sources using archive */
+    unsigned int nopen_source_alloc;   /* number of sources allocated */
+    zip_source_t **open_source;         /* open sources using archive */
+    
+    char *tempdir;                      /* custom temp dir (needed e.g. for OS X sandboxing) */
 };
 
 /* file in zip archive, part of API */
 
 struct zip_file {
-    struct zip *za;            /* zip archive containing this file */
-    struct zip_error error;    /* error information */
-    int eof;
-    struct zip_source *src;    /* data source */
+    zip_t *za;         /* zip archive containing this file */
+    zip_error_t error; /* error information */
+    bool eof;
+    zip_source_t *src; /* data source */
 };
 
 /* zip archive directory entry (central or local) */
 
+#define ZIP_DIRENT_COMP_METHOD 0x0001u
+#define ZIP_DIRENT_FILENAME    0x0002u
+#define ZIP_DIRENT_COMMENT     0x0004u
+#define ZIP_DIRENT_EXTRA_FIELD 0x0008u
+#define ZIP_DIRENT_ATTRIBUTES  0x0010u
+#define ZIP_DIRENT_LAST_MOD    0x0020u
+#define ZIP_DIRENT_ALL         0xffffu
+
 struct zip_dirent {
-    unsigned short version_madeby;     /* (c)  version of creator */
-    unsigned short version_needed;     /* (cl) version needed to extract */
-    unsigned short bitflags;           /* (cl) general purpose bit flag */
-    unsigned short comp_method;                /* (cl) compression method used */
+    zip_uint32_t changed;
+    bool local_extra_fields_read;      /*      whether we already read in local header extra fields */
+    bool cloned;                         /*      whether this instance is cloned, and thus shares non-changed strings */
+
+    zip_uint16_t version_madeby;       /* (c)  version of creator */
+    zip_uint16_t version_needed;       /* (cl) version needed to extract */
+    zip_uint16_t bitflags;             /* (cl) general purpose bit flag */
+    zip_int32_t comp_method;           /* (cl) compression method used (uint16 and ZIP_CM_DEFAULT (-1)) */
     time_t last_mod;                   /* (cl) time of last modification */
-    unsigned int crc;                  /* (cl) CRC-32 of uncompressed data */
-    unsigned int comp_size;            /* (cl) size of commpressed data */
-    unsigned int uncomp_size;          /* (cl) size of uncommpressed data */
-    char *filename;                    /* (cl) file name (NUL-terminated) */
-    unsigned short filename_len;       /* (cl) length of filename (w/o NUL) */
-    char *extrafield;                  /* (cl) extra field */
-    unsigned short extrafield_len;     /* (cl) length of extra field */
-    char *comment;                     /* (c)  file comment */
-    unsigned short comment_len;                /* (c)  length of file comment */
-    unsigned short disk_number;                /* (c)  disk number start */
-    unsigned short int_attrib;         /* (c)  internal file attributes */
-    unsigned int ext_attrib;           /* (c)  external file attributes */
-    unsigned int offset;               /* (c)  offset of local header  */
+    zip_uint32_t crc;                  /* (cl) CRC-32 of uncompressed data */
+    zip_uint64_t comp_size;            /* (cl) size of compressed data */
+    zip_uint64_t uncomp_size;          /* (cl) size of uncompressed data */
+    zip_string_t *filename;            /* (cl) file name (NUL-terminated) */
+    zip_extra_field_t *extra_fields;   /* (cl) extra fields, parsed */
+    zip_string_t *comment;             /* (c)  file comment */
+    zip_uint32_t disk_number;          /* (c)  disk number start */
+    zip_uint16_t int_attrib;           /* (c)  internal file attributes */
+    zip_uint32_t ext_attrib;           /* (c)  external file attributes */
+    zip_uint64_t offset;               /* (c)  offset of local header */
 };
 
 /* zip archive central directory */
 
 struct zip_cdir {
-    struct zip_dirent *entry;  /* directory entries */
-    int nentry;                        /* number of entries */
+    zip_entry_t *entry;                        /* directory entries */
+    zip_uint64_t nentry;               /* number of entries */
+    zip_uint64_t nentry_alloc;         /* number of entries allocated */
+
+    zip_uint64_t size;                  /* size of central directory */
+    zip_uint64_t offset;               /* offset of central directory in file */
+    zip_string_t *comment;             /* zip archive comment */
+};
 
-    unsigned int size;         /* size of central direcotry */
-    unsigned int offset;       /* offset of central directory in file */
-    char *comment;             /* zip archive comment */
-    unsigned short comment_len;        /* length of zip archive comment */
+struct zip_extra_field {
+    zip_extra_field_t *next;
+    zip_flags_t flags;                 /* in local/central header */
+    zip_uint16_t id;                   /* header id */
+    zip_uint16_t size;                 /* data size */
+    zip_uint8_t *data;
 };
 
-\f
+enum zip_source_write_state {
+    ZIP_SOURCE_WRITE_CLOSED,    /* write is not in progress */
+    ZIP_SOURCE_WRITE_OPEN,      /* write is in progress */
+    ZIP_SOURCE_WRITE_FAILED,    /* commit failed, only rollback allowed */
+    ZIP_SOURCE_WRITE_REMOVED    /* file was removed */
+};
+typedef enum zip_source_write_state zip_source_write_state_t;
 
 struct zip_source {
-    struct zip_source *src;
+    zip_source_t *src;
     union {
        zip_source_callback f;
        zip_source_layered_callback l;
     } cb;
     void *ud;
-    enum zip_les error_source;
-    int is_open;
+    zip_error_t error;
+    zip_int64_t supports;       /* supported commands */
+    unsigned int open_count;    /* number of times source was opened (directly or as lower layer) */
+    zip_source_write_state_t write_state;          /* whether source is open for writing */
+    bool source_closed;         /* set if source archive is closed */
+    zip_t *source_archive;      /* zip archive we're reading from, NULL if not from archive */
+    unsigned int refcount;
 };
 
+#define ZIP_SOURCE_IS_OPEN_READING(src) ((src)->open_count > 0)
+#define ZIP_SOURCE_IS_OPEN_WRITING(src) ((src)->write_state == ZIP_SOURCE_WRITE_OPEN)
+#define ZIP_SOURCE_IS_LAYERED(src)  ((src)->src != NULL)
+
 /* entry in zip archive directory */
 
 struct zip_entry {
-    enum zip_state state;
-    struct zip_source *source;
-    char *ch_filename;
-    char *ch_extra;
-    int ch_extra_len;
-    char *ch_comment;
-    int ch_comment_len;
+    zip_dirent_t *orig;
+    zip_dirent_t *changes;
+    zip_source_t *source;
+    bool deleted;
 };
 
-\f
+
+/* file or archive comment, or filename */
+
+struct zip_string {
+    zip_uint8_t *raw;                  /* raw string */
+    zip_uint16_t length;               /* length of raw string */
+    enum zip_encoding_type encoding;   /* autorecognized encoding */
+    zip_uint8_t *converted;            /* autoconverted string */
+    zip_uint32_t converted_length;     /* length of converted */
+};
+
+
+/* bounds checked access to memory buffer */
+
+struct zip_buffer {
+    bool ok;
+    bool free_data;
+    
+    zip_uint8_t *data;
+    zip_uint64_t size;
+    zip_uint64_t offset;
+};
+
+/* which files to write in which order */
+
+struct zip_filelist {
+    zip_uint64_t idx;
+// TODO    const char *name;
+};
+
+typedef struct zip_filelist zip_filelist_t;
+
 
 extern const char * const _zip_err_str[];
 extern const int _zip_nerr_str;
 extern const int _zip_err_type[];
 
-\f
 
-#define ZIP_ENTRY_DATA_CHANGED(x)      \
-                       ((x)->state == ZIP_ST_REPLACED  \
-                        || (x)->state == ZIP_ST_ADDED)
+#define ZIP_ENTRY_CHANGED(e, f)        ((e)->changes && ((e)->changes->changed & (f)))
+
+#define ZIP_ENTRY_DATA_CHANGED(x)      ((x)->source != NULL)
 
 #define ZIP_IS_RDONLY(za)      ((za)->ch_flags & ZIP_AFL_RDONLY)
 
-\f
-
-int _zip_cdir_compute_crc(struct zip *, uLong *);
-void _zip_cdir_free(struct zip_cdir *);
-int _zip_cdir_grow(struct zip_cdir *, int, struct zip_error *);
-struct zip_cdir *_zip_cdir_new(int, struct zip_error *);
-int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *);
-
-void _zip_dirent_finalize(struct zip_dirent *);
-void _zip_dirent_init(struct zip_dirent *);
-int _zip_dirent_read(struct zip_dirent *, FILE *, unsigned char **,
-                    zip_uint32_t *, int, struct zip_error *);
-void _zip_dirent_torrent_normalize(struct zip_dirent *);
-int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *);
-
-void _zip_entry_free(struct zip_entry *);
-void _zip_entry_init(struct zip *, int);
-struct zip_entry *_zip_entry_new(struct zip *);
-
-void _zip_error_clear(struct zip_error *);
-void _zip_error_copy(struct zip_error *, struct zip_error *);
-void _zip_error_fini(struct zip_error *);
-void _zip_error_get(struct zip_error *, int *, int *);
-void _zip_error_init(struct zip_error *);
-void _zip_error_set(struct zip_error *, int, int);
-void _zip_error_set_from_source(struct zip_error *, struct zip_source *);
-const char *_zip_error_strerror(struct zip_error *);
-
-int _zip_file_fillbuf(void *, size_t, struct zip_file *);
-unsigned int _zip_file_get_offset(struct zip *, int);
-
-int _zip_filerange_crc(FILE *, off_t, off_t, uLong *, struct zip_error *);
-
-struct zip *_zip_open(const char *, FILE *, int, int, int *);
-
-struct zip_source *_zip_source_file_or_p(struct zip *, const char *, FILE *,
-                                        zip_uint64_t, zip_int64_t, int,
-                                        const struct zip_stat *);
-struct zip_source *_zip_source_new(struct zip *);
-
-int _zip_changed(struct zip *, int *);
-void _zip_free(struct zip *);
-const char *_zip_get_name(struct zip *, zip_uint64_t, int, struct zip_error *);
-int _zip_local_header_read(struct zip *, int);
-void *_zip_memdup(const void *, size_t, struct zip_error *);
-int _zip_name_locate(struct zip *, const char *, int, struct zip_error *);
-struct zip *_zip_new(struct zip_error *);
-unsigned short _zip_read2(unsigned char **);
-unsigned int _zip_read4(unsigned char **);
-zip_int64_t _zip_replace(struct zip *, zip_uint64_t, const char *,
-                        struct zip_source *);
-int _zip_set_name(struct zip *, zip_uint64_t, const char *);
-void _zip_u2d_time(time_t, unsigned short *, unsigned short *);
-int _zip_unchange(struct zip *, zip_uint64_t, int);
-void _zip_unchange_data(struct zip_entry *);
+
+zip_int64_t _zip_add_entry(zip_t *);
+
+zip_uint8_t *_zip_buffer_data(zip_buffer_t *buffer);
+bool _zip_buffer_eof(zip_buffer_t *buffer);
+void _zip_buffer_free(zip_buffer_t *buffer);
+zip_uint8_t *_zip_buffer_get(zip_buffer_t *buffer, zip_uint64_t length);
+zip_uint16_t _zip_buffer_get_16(zip_buffer_t *buffer);
+zip_uint32_t _zip_buffer_get_32(zip_buffer_t *buffer);
+zip_uint64_t _zip_buffer_get_64(zip_buffer_t *buffer);
+zip_uint8_t _zip_buffer_get_8(zip_buffer_t *buffer);
+zip_uint64_t _zip_buffer_left(zip_buffer_t *buffer);
+zip_buffer_t *_zip_buffer_new(zip_uint8_t *data, zip_uint64_t size);
+zip_buffer_t *_zip_buffer_new_from_source(zip_source_t *src, zip_uint64_t size, zip_uint8_t *buf, zip_error_t *error);
+zip_uint64_t _zip_buffer_offset(zip_buffer_t *buffer);
+bool _zip_buffer_ok(zip_buffer_t *buffer);
+int _zip_buffer_put(zip_buffer_t *buffer, const void *src, size_t length);
+int _zip_buffer_put_16(zip_buffer_t *buffer, zip_uint16_t i);
+int _zip_buffer_put_32(zip_buffer_t *buffer, zip_uint32_t i);
+int _zip_buffer_put_64(zip_buffer_t *buffer, zip_uint64_t i);
+int _zip_buffer_put_8(zip_buffer_t *buffer, zip_uint8_t i);
+int _zip_buffer_set_offset(zip_buffer_t *buffer, zip_uint64_t offset);
+zip_uint64_t _zip_buffer_size(zip_buffer_t *buffer);
+
+int _zip_cdir_compute_crc(zip_t *, uLong *);
+void _zip_cdir_free(zip_cdir_t *);
+zip_cdir_t *_zip_cdir_new(zip_uint64_t, zip_error_t *);
+zip_int64_t _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivors);
+void _zip_deregister_source(zip_t *za, zip_source_t *src);
+
+zip_dirent_t *_zip_dirent_clone(const zip_dirent_t *);
+void _zip_dirent_free(zip_dirent_t *);
+void _zip_dirent_finalize(zip_dirent_t *);
+void _zip_dirent_init(zip_dirent_t *);
+bool _zip_dirent_needs_zip64(const zip_dirent_t *, zip_flags_t);
+zip_dirent_t *_zip_dirent_new(void);
+zip_int64_t _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, bool local, zip_error_t *error);
+zip_int32_t _zip_dirent_size(zip_source_t *src, zip_uint16_t, zip_error_t *);
+int _zip_dirent_write(zip_t *za, zip_dirent_t *dirent, zip_flags_t flags);
+
+zip_extra_field_t *_zip_ef_clone(const zip_extra_field_t *, zip_error_t *);
+zip_extra_field_t *_zip_ef_delete_by_id(zip_extra_field_t *, zip_uint16_t, zip_uint16_t, zip_flags_t);
+void _zip_ef_free(zip_extra_field_t *);
+const zip_uint8_t *_zip_ef_get_by_id(const zip_extra_field_t *, zip_uint16_t *, zip_uint16_t, zip_uint16_t, zip_flags_t, zip_error_t *);
+zip_extra_field_t *_zip_ef_merge(zip_extra_field_t *, zip_extra_field_t *);
+zip_extra_field_t *_zip_ef_new(zip_uint16_t, zip_uint16_t, const zip_uint8_t *, zip_flags_t);
+zip_extra_field_t *_zip_ef_parse(const zip_uint8_t *, zip_uint16_t, zip_flags_t, zip_error_t *);
+zip_extra_field_t *_zip_ef_remove_internal(zip_extra_field_t *);
+zip_uint16_t _zip_ef_size(const zip_extra_field_t *, zip_flags_t);
+int _zip_ef_write(zip_t *za, const zip_extra_field_t *ef, zip_flags_t flags);
+
+void _zip_entry_finalize(zip_entry_t *);
+void _zip_entry_init(zip_entry_t *);
+
+void _zip_error_clear(zip_error_t *);
+void _zip_error_get(const zip_error_t *, int *, int *);
+
+void _zip_error_copy(zip_error_t *dst, const zip_error_t *src);
+void _zip_error_set_from_source(zip_error_t *, zip_source_t *);
+
+const zip_uint8_t *_zip_extract_extra_field_by_id(zip_error_t *, zip_uint16_t, int, const zip_uint8_t *, zip_uint16_t, zip_uint16_t *);
+
+int _zip_file_extra_field_prepare_for_change(zip_t *, zip_uint64_t);
+int _zip_file_fillbuf(void *, size_t, zip_file_t *);
+zip_uint64_t _zip_file_get_offset(const zip_t *, zip_uint64_t, zip_error_t *);
+
+int _zip_filerange_crc(zip_source_t *src, zip_uint64_t offset, zip_uint64_t length, uLong *crcp, zip_error_t *error);
+
+zip_dirent_t *_zip_get_dirent(zip_t *, zip_uint64_t, zip_flags_t, zip_error_t *);
+
+enum zip_encoding_type _zip_guess_encoding(zip_string_t *, enum zip_encoding_type);
+zip_uint8_t *_zip_cp437_to_utf8(const zip_uint8_t * const, zip_uint32_t, zip_uint32_t *, zip_error_t *);
+
+zip_t *_zip_open(zip_source_t *, unsigned int, zip_error_t *);
+
+int _zip_read(zip_source_t *src, zip_uint8_t *data, zip_uint64_t length, zip_error_t *error);
+int _zip_read_at_offset(zip_source_t *src, zip_uint64_t offset, unsigned char *b, size_t length, zip_error_t *error);
+zip_uint8_t *_zip_read_data(zip_buffer_t *buffer, zip_source_t *src, size_t length, bool nulp, zip_error_t *error);
+int _zip_read_local_ef(zip_t *, zip_uint64_t);
+zip_string_t *_zip_read_string(zip_buffer_t *buffer, zip_source_t *src, zip_uint16_t lenght, bool nulp, zip_error_t *error);
+int _zip_register_source(zip_t *za, zip_source_t *src);
+
+void _zip_set_open_error(int *zep, const zip_error_t *err, int ze);
+
+zip_int64_t _zip_source_call(zip_source_t *src, void *data, zip_uint64_t length, zip_source_cmd_t command);
+zip_source_t *_zip_source_file_or_p(const char *, FILE *, zip_uint64_t, zip_int64_t, const zip_stat_t *, zip_error_t *error);
+void _zip_source_invalidate(zip_source_t *src);
+zip_source_t *_zip_source_new(zip_error_t *error);
+int _zip_source_set_source_archive(zip_source_t *, zip_t *);
+zip_source_t *_zip_source_window_new(zip_source_t *src, zip_uint64_t start, zip_uint64_t length, zip_stat_t *st, zip_error_t *error);
+zip_source_t *_zip_source_zip_new(zip_t *, zip_t *, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_uint64_t, const char *);
+
+int _zip_stat_merge(zip_stat_t *dst, const zip_stat_t *src, zip_error_t *error);
+int _zip_string_equal(const zip_string_t *, const zip_string_t *);
+void _zip_string_free(zip_string_t *);
+zip_uint32_t _zip_string_crc32(const zip_string_t *);
+const zip_uint8_t *_zip_string_get(zip_string_t *, zip_uint32_t *, zip_flags_t, zip_error_t *);
+zip_uint16_t _zip_string_length(const zip_string_t *);
+zip_string_t *_zip_string_new(const zip_uint8_t *, zip_uint16_t, zip_flags_t, zip_error_t *);
+int _zip_string_write(zip_t *za, const zip_string_t *string);
+
+int _zip_changed(const zip_t *, zip_uint64_t *);
+const char *_zip_get_name(zip_t *, zip_uint64_t, zip_flags_t, zip_error_t *);
+int _zip_local_header_read(zip_t *, int);
+void *_zip_memdup(const void *, size_t, zip_error_t *);
+zip_int64_t _zip_name_locate(zip_t *, const char *, zip_flags_t, zip_error_t *);
+zip_t *_zip_new(zip_error_t *);
+
+zip_int64_t _zip_file_replace(zip_t *, zip_uint64_t, const char *, zip_source_t *, zip_flags_t);
+int _zip_set_name(zip_t *, zip_uint64_t, const char *, zip_flags_t);
+void _zip_u2d_time(time_t, zip_uint16_t *, zip_uint16_t *);
+int _zip_unchange(zip_t *, zip_uint64_t, int);
+void _zip_unchange_data(zip_entry_t *);
+int _zip_write(zip_t *za, const void *data, zip_uint64_t length);
 
 #endif /* zipint.h */
diff --git a/lib/zipwin32.h b/lib/zipwin32.h
new file mode 100644 (file)
index 0000000..4fa29cc
--- /dev/null
@@ -0,0 +1,80 @@
+#ifndef _HAD_ZIPWIN32_H
+#define _HAD_ZIPWIN32_H
+
+/*
+  zipwin32.h -- internal declarations for Windows.
+  Copyright (C) 1999-2015 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <windows.h>
+
+/* context for Win32 source */
+
+struct _zip_source_win32_file_ops;
+
+struct _zip_source_win32_read_file {
+    zip_error_t error;      /* last error information */
+    zip_int64_t supports;
+
+    /* operations */
+    struct _zip_source_win32_file_ops *ops;
+
+    /* reading */
+    void *fname;            /* name of file to read from - ANSI (char *) or Unicode (wchar_t *) */
+    void *h;                /* HANDLE for file to read from */
+    int closep;             /* whether to close f on ZIP_CMD_FREE */
+    struct zip_stat st;     /* stat information passed in */
+    zip_uint64_t start;     /* start offset of data to read */
+    zip_uint64_t end;       /* end offset of data to read, 0 for up to EOF */
+    zip_uint64_t current;   /* current offset */
+
+    /* writing */
+    void *tmpname;          /* name of temp file - ANSI (char *) or Unicode (wchar_t *) */
+    void *hout;             /* HANDLE for output file */
+};
+
+typedef struct _zip_source_win32_read_file _zip_source_win32_read_file_t;
+
+/* internal operations for Win32 source */
+
+struct _zip_source_win32_file_ops {
+    void *(*op_strdup)(const void *);
+    void *(*op_open)(_zip_source_win32_read_file_t *);
+    void *(*op_create_temp)(_zip_source_win32_read_file_t *, void **, zip_uint32_t, PSECURITY_ATTRIBUTES);
+    int (*op_rename_temp)(_zip_source_win32_read_file_t *);
+    int (*op_remove)(const void *);
+};
+
+typedef struct _zip_source_win32_file_ops _zip_source_win32_file_ops_t;
+
+zip_source_t *_zip_source_win32_handle_or_name(const void *, void *, zip_uint64_t, zip_int64_t, int, const zip_stat_t *, _zip_source_win32_file_ops_t *, zip_error_t *);
+
+#endif /* zipwin32.h */
index f1301be..ef8af2d 100644 (file)
@@ -2,13 +2,13 @@ prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
 includedir=@includedir@
-libincludedir=@libdir@/libzip/include
+libincludedir=@libdir@/@PACKAGE@/include
 
 zipcmp=@prefix@/bin/zipcmp
 
 Name: libzip
 Description: library for handling zip archives
 Version: @VERSION@
-Libs: -L${libdir} -lzip @LIBS@
+Libs: @PKG_CONFIG_RPATH@ -L${libdir} -lzip @LIBS@
 Cflags: -I${includedir} -I${libincludedir}
 
old mode 100755 (executable)
new mode 100644 (file)
index 8239238..f07ffc8
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -1,9 +1,9 @@
-# Generated from ltmain.m4sh.
 
-# ltmain.sh (GNU libtool) 2.2.6b
+# libtool (GNU libtool) 2.4.2
 # Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 # This is free software; see the source for copying conditions.  There is NO
 # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 #
 # Provide generalized library-building support services.
 #
-#     --config             show all configuration variables
-#     --debug              enable verbose shell tracing
-# -n, --dry-run            display commands without modifying any files
-#     --features           display basic configuration information and exit
-#     --mode=MODE          use operation mode MODE
-#     --preserve-dup-deps  don't remove duplicate dependency libraries
-#     --quiet, --silent    don't print informational messages
-#     --tag=TAG            use configuration variables from tag TAG
-# -v, --verbose            print informational messages (default)
-#     --version            print version information
-# -h, --help               print short or long help message
+#       --config             show all configuration variables
+#       --debug              enable verbose shell tracing
+#   -n, --dry-run            display commands without modifying any files
+#       --features           display basic configuration information and exit
+#       --mode=MODE          use operation mode MODE
+#       --preserve-dup-deps  don't remove duplicate dependency libraries
+#       --quiet, --silent    don't print informational messages
+#       --no-quiet, --no-silent
+#                            print informational messages (default)
+#       --no-warn            don't display warning messages
+#       --tag=TAG            use configuration variables from tag TAG
+#   -v, --verbose            print more informational messages than default
+#       --no-verbose         don't print the extra informational messages
+#       --version            print version information
+#   -h, --help, --help-all   print short, long, or detailed help message
 #
 # MODE must be one of the following:
 #
-#       clean              remove files from the build directory
-#       compile            compile a source file into a libtool object
-#       execute            automatically set library path, then run a program
-#       finish             complete the installation of libtool libraries
-#       install            install libraries or executables
-#       link               create a library or an executable
-#       uninstall          remove libraries from an installed directory
+#         clean              remove files from the build directory
+#         compile            compile a source file into a libtool object
+#         execute            automatically set library path, then run a program
+#         finish             complete the installation of libtool libraries
+#         install            install libraries or executables
+#         link               create a library or an executable
+#         uninstall          remove libraries from an installed directory
 #
-# MODE-ARGS vary depending on the MODE.
+# MODE-ARGS vary depending on the MODE.  When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
 # Try `$progname --help --mode=MODE' for a more detailed description of MODE.
 #
 # When reporting a bug, please describe a test case to reproduce it and
 # include the following information:
 #
-#       host-triplet:  $host
-#       shell:         $SHELL
-#       compiler:              $LTCC
-#       compiler flags:                $LTCFLAGS
-#       linker:                $LD (gnu? $with_gnu_ld)
-#       $progname:             (GNU libtool) 2.2.6b
-#       automake:              $automake_version
-#       autoconf:              $autoconf_version
+#         host-triplet:        $host
+#         shell:               $SHELL
+#         compiler:            $LTCC
+#         compiler flags:              $LTCFLAGS
+#         linker:              $LD (gnu? $with_gnu_ld)
+#         $progname:   (GNU libtool) 2.4.2
+#         automake:    $automake_version
+#         autoconf:    $autoconf_version
 #
 # Report bugs to <bug-libtool@gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
 
-PROGRAM=ltmain.sh
+PROGRAM=libtool
 PACKAGE=libtool
-VERSION=2.2.6b
+VERSION=2.4.2
 TIMESTAMP=""
-package_revision=1.3017
+package_revision=1.3337
 
 # Be Bourne compatible
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
@@ -91,10 +98,15 @@ fi
 BIN_SH=xpg4; export BIN_SH # for Tru64
 DUALCASE=1; export DUALCASE # for MKS sh
 
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
 # NLS nuisances: We save the old values to restore during execute mode.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
 lt_user_locale=
 lt_safe_locale=
 for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
@@ -107,24 +119,29 @@ do
          lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
        fi"
 done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
 
 $lt_unset CDPATH
 
 
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
 unset CP
 unset MV
 unset RM
 : ${CP="cp -f"}
-: ${ECHO="echo"}
-: ${EGREP="/bin/grep -E"}
-: ${FGREP="/bin/grep -F"}
-: ${GREP="/bin/grep"}
-: ${LN_S="ln -s"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
 : ${MAKE="make"}
 : ${MKDIR="mkdir"}
 : ${MV="mv -f"}
 : ${RM="rm -f"}
-: ${SED="/bin/sed"}
 : ${SHELL="${CONFIG_SHELL-/bin/sh}"}
 : ${Xsed="$SED -e 1s/^X//"}
 
@@ -144,6 +161,27 @@ IFS="      $lt_nl"
 dirname="s,/[^/]*$,,"
 basename="s,^.*/,,"
 
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+} # func_dirname may be replaced by extended shell implementation
+
+
+# func_basename file
+func_basename ()
+{
+    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+} # func_basename may be replaced by extended shell implementation
+
+
 # func_dirname_and_basename file append nondir_replacement
 # perform func_basename and func_dirname in a single function
 # call:
@@ -158,33 +196,183 @@ basename="s,^.*/,,"
 # those functions but instead duplicate the functionality here.
 func_dirname_and_basename ()
 {
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+    # Extract subdirectory from the argument.
+    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+} # func_dirname_and_basename may be replaced by extended shell implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+    case ${2} in
+      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+    esac
+} # func_stripname may be replaced by extended shell implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+               s@/\./@/@g
+               t dotsl
+               s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+#             value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+  # Start from root dir and reassemble the path.
+  func_normal_abspath_result=
+  func_normal_abspath_tpath=$1
+  func_normal_abspath_altnamespace=
+  case $func_normal_abspath_tpath in
+    "")
+      # Empty path, that just means $cwd.
+      func_stripname '' '/' "`pwd`"
+      func_normal_abspath_result=$func_stripname_result
+      return
+    ;;
+    # The next three entries are used to spot a run of precisely
+    # two leading slashes without using negated character classes;
+    # we take advantage of case's first-match behaviour.
+    ///*)
+      # Unusual form of absolute path, do nothing.
+    ;;
+    //*)
+      # Not necessarily an ordinary path; POSIX reserves leading '//'
+      # and for example Cygwin uses it to access remote file shares
+      # over CIFS/SMB, so we conserve a leading double slash if found.
+      func_normal_abspath_altnamespace=/
+    ;;
+    /*)
+      # Absolute path, do nothing.
+    ;;
+    *)
+      # Relative path, prepend $cwd.
+      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+    ;;
+  esac
+  # Cancel out all the simple stuff to save iterations.  We also want
+  # the path to end with a slash for ease of parsing, so make sure
+  # there is one (and only one) here.
+  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+  while :; do
+    # Processed it all yet?
+    if test "$func_normal_abspath_tpath" = / ; then
+      # If we ascended to the root using ".." the result may be empty now.
+      if test -z "$func_normal_abspath_result" ; then
+        func_normal_abspath_result=/
+      fi
+      break
+    fi
+    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcar"`
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcdr"`
+    # Figure out what to do with it
+    case $func_normal_abspath_tcomponent in
+      "")
+        # Trailing empty path component, ignore it.
+      ;;
+      ..)
+        # Parent dir; strip last assembled component from result.
+        func_dirname "$func_normal_abspath_result"
+        func_normal_abspath_result=$func_dirname_result
+      ;;
+      *)
+        # Actual path component, append it.
+        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+      ;;
+    esac
+  done
+  # Restore leading double-slash if one was found on entry.
+  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
 }
 
-# Generated shell functions inserted here.
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+#             value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+  func_relative_path_result=
+  func_normal_abspath "$1"
+  func_relative_path_tlibdir=$func_normal_abspath_result
+  func_normal_abspath "$2"
+  func_relative_path_tbindir=$func_normal_abspath_result
+
+  # Ascend the tree starting from libdir
+  while :; do
+    # check if we have found a prefix of bindir
+    case $func_relative_path_tbindir in
+      $func_relative_path_tlibdir)
+        # found an exact match
+        func_relative_path_tcancelled=
+        break
+        ;;
+      $func_relative_path_tlibdir*)
+        # found a matching prefix
+        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+        func_relative_path_tcancelled=$func_stripname_result
+        if test -z "$func_relative_path_result"; then
+          func_relative_path_result=.
+        fi
+        break
+        ;;
+      *)
+        func_dirname $func_relative_path_tlibdir
+        func_relative_path_tlibdir=${func_dirname_result}
+        if test "x$func_relative_path_tlibdir" = x ; then
+          # Have to descend all the way to the root!
+          func_relative_path_result=../$func_relative_path_result
+          func_relative_path_tcancelled=$func_relative_path_tbindir
+          break
+        fi
+        func_relative_path_result=../$func_relative_path_result
+        ;;
+    esac
+  done
 
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
+  # Now calculate path; take care to avoid doubling-up slashes.
+  func_stripname '' '/' "$func_relative_path_result"
+  func_relative_path_result=$func_stripname_result
+  func_stripname '/' '/' "$func_relative_path_tcancelled"
+  if test "x$func_stripname_result" != x ; then
+    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+  fi
+
+  # Normalisation. If bindir is libdir, return empty string,
+  # else relative path ending with a slash; either way, target
+  # file name can be directly appended.
+  if test ! -z "$func_relative_path_result"; then
+    func_stripname './' '' "$func_relative_path_result/"
+    func_relative_path_result=$func_stripname_result
+  fi
+}
 
 # The name of this program:
-# In the unlikely event $progname began with a '-', it would play havoc with
-# func_echo (imagine progname=-n), so we prepend ./ in that case:
 func_dirname_and_basename "$progpath"
 progname=$func_basename_result
-case $progname in
-  -*) progname=./$progname ;;
-esac
 
 # Make sure we have an absolute path for reexecution:
 case $progpath in
@@ -196,7 +384,7 @@ case $progpath in
      ;;
   *)
      save_IFS="$IFS"
-     IFS=:
+     IFS=${PATH_SEPARATOR-:}
      for progdir in $PATH; do
        IFS="$save_IFS"
        test -x "$progdir/$progname" && break
@@ -215,6 +403,15 @@ sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
 # Same as above, but do not quote variable references.
 double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
 # Re-`\' parameter expansions in output of double_quote_subst that were
 # `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
 # in input to double_quote_subst, that '$' was protected from expansion.
@@ -243,7 +440,7 @@ opt_warning=:
 # name if it has been set yet.
 func_echo ()
 {
-    $ECHO "$progname${mode+: }$mode: $*"
+    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
 }
 
 # func_verbose arg...
@@ -258,18 +455,25 @@ func_verbose ()
     :
 }
 
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
 # func_error arg...
 # Echo program name prefixed message to standard error.
 func_error ()
 {
-    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
+    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
 }
 
 # func_warning arg...
 # Echo program name prefixed warning message to standard error.
 func_warning ()
 {
-    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
+    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
 
     # bash bug again:
     :
@@ -326,9 +530,9 @@ func_mkdir_p ()
         case $my_directory_path in */*) ;; *) break ;; esac
 
         # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"`
+        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
       done
-      my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`
+      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
 
       save_mkdir_p_IFS="$IFS"; IFS=':'
       for my_dir in $my_dir_list; do
@@ -378,7 +582,7 @@ func_mktempdir ()
         func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
     fi
 
-    $ECHO "X$my_tmpdir" | $Xsed
+    $ECHO "$my_tmpdir"
 }
 
 
@@ -392,7 +596,7 @@ func_quote_for_eval ()
 {
     case $1 in
       *[\\\`\"\$]*)
-       func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;;
+       func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
       *)
         func_quote_for_eval_unquoted_result="$1" ;;
     esac
@@ -419,7 +623,7 @@ func_quote_for_expand ()
 {
     case $1 in
       *[\\\`\"]*)
-       my_arg=`$ECHO "X$1" | $Xsed \
+       my_arg=`$ECHO "$1" | $SED \
            -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
       *)
         my_arg="$1" ;;
@@ -488,15 +692,39 @@ func_show_eval_locale ()
     fi
 }
 
-
-
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+  case $1 in
+  [0-9]* | *[!a-zA-Z0-9_]*)
+    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+    ;;
+  * )
+    func_tr_sh_result=$1
+    ;;
+  esac
+}
 
 
 # func_version
 # Echo version message to standard output and exit.
 func_version ()
 {
-    $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {
+    $opt_debug
+
+    $SED -n '/(C)/!b go
+       :more
+       /\./!{
+         N
+         s/\n# / /
+         b more
+       }
+       :go
+       /^# '$PROGRAM' (GNU /,/# warranty; / {
         s/^# //
        s/^# *$//
         s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
@@ -509,22 +737,28 @@ func_version ()
 # Echo short help message to standard output and exit.
 func_usage ()
 {
-    $SED -n '/^# Usage:/,/# -h/ {
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/^#  *.*--help/ {
         s/^# //
        s/^# *$//
        s/\$progname/'$progname'/
        p
     }' < "$progpath"
-    $ECHO
+    echo
     $ECHO "run \`$progname --help | more' for full usage"
     exit $?
 }
 
-# func_help
-# Echo long help message to standard output and exit.
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
 func_help ()
 {
+    $opt_debug
+
     $SED -n '/^# Usage:/,/# Report bugs to/ {
+       :print
         s/^# //
        s/^# *$//
        s*\$progname*'$progname'*
@@ -534,11 +768,18 @@ func_help ()
        s*\$LTCFLAGS*'"$LTCFLAGS"'*
        s*\$LD*'"$LD"'*
        s/\$with_gnu_ld/'"$with_gnu_ld"'/
-       s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
-       s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
+       s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+       s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
        p
-     }' < "$progpath"
-    exit $?
+       d
+     }
+     /^# .* home page:/b print
+     /^# General help using/b print
+     ' < "$progpath"
+    ret=$?
+    if test -z "$1"; then
+      exit $ret
+    fi
 }
 
 # func_missing_arg argname
@@ -546,63 +787,106 @@ func_help ()
 # exit_cmd.
 func_missing_arg ()
 {
-    func_error "missing argument for $1"
+    $opt_debug
+
+    func_error "missing argument for $1."
     exit_cmd=exit
 }
 
-exit_cmd=:
 
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
+    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
 
+    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
+    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
+} # func_split_short_opt may be replaced by extended shell implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
+    my_sed_long_arg='1s/^--[^=]*=//'
+
+    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
+    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
+} # func_split_long_opt may be replaced by extended shell implementation
+
+exit_cmd=:
 
 
 
-# Check that we have a working $ECHO.
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
-  # Yippee, $ECHO works!
-  :
-else
-  # Restart under the correct shell, and then maybe $ECHO will work.
-  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
-fi
 
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<EOF
-$*
-EOF
-  exit $EXIT_SUCCESS
-fi
 
 magic="%%%MAGIC variable%%%"
 magic_exe="%%%MAGIC EXE variable%%%"
 
 # Global variables.
-# $mode is unset
 nonopt=
-execute_dlfiles=
 preserve_args=
 lo2o="s/\\.lo\$/.${objext}/"
 o2lo="s/\\.${objext}\$/.lo/"
 extracted_archives=
 extracted_serial=0
 
-opt_dry_run=false
-opt_duplicate_deps=false
-opt_silent=false
-opt_debug=:
-
 # If this variable is set in any of the actions, the command in it
 # will be execed at the end.  This prevents here-documents from being
 # left over by shells.
 exec_cmd=
 
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+    eval "${1}=\$${1}\${2}"
+} # func_append may be replaced by extended shell implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+    func_quote_for_eval "${2}"
+    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
+} # func_append_quoted may be replaced by extended shell implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+    func_arith_result=`expr "${@}"`
+} # func_arith may be replaced by extended shell implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
+} # func_len may be replaced by extended shell implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+} # func_lo2o may be replaced by extended shell implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+} # func_xform may be replaced by extended shell implementation
+
+
 # func_fatal_configuration arg...
 # Echo program name prefixed message to standard error, followed by
 # a configuration failure hint, and exit.
@@ -636,16 +920,16 @@ func_config ()
 # Display the features supported by this script.
 func_features ()
 {
-    $ECHO "host: $host"
+    echo "host: $host"
     if test "$build_libtool_libs" = yes; then
-      $ECHO "enable shared libraries"
+      echo "enable shared libraries"
     else
-      $ECHO "disable shared libraries"
+      echo "disable shared libraries"
     fi
     if test "$build_old_libs" = yes; then
-      $ECHO "enable static libraries"
+      echo "enable static libraries"
     else
-      $ECHO "disable static libraries"
+      echo "disable static libraries"
     fi
 
     exit $?
@@ -692,117 +976,209 @@ func_enable_tag ()
   esac
 }
 
-# Parse options once, thoroughly.  This comes as soon as possible in
-# the script to make things like `libtool --version' happen quickly.
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
 {
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
 
-  # Shorthand for --mode=foo, only valid as the first argument
-  case $1 in
-  clean|clea|cle|cl)
-    shift; set dummy --mode clean ${1+"$@"}; shift
-    ;;
-  compile|compil|compi|comp|com|co|c)
-    shift; set dummy --mode compile ${1+"$@"}; shift
-    ;;
-  execute|execut|execu|exec|exe|ex|e)
-    shift; set dummy --mode execute ${1+"$@"}; shift
-    ;;
-  finish|finis|fini|fin|fi|f)
-    shift; set dummy --mode finish ${1+"$@"}; shift
-    ;;
-  install|instal|insta|inst|ins|in|i)
-    shift; set dummy --mode install ${1+"$@"}; shift
-    ;;
-  link|lin|li|l)
-    shift; set dummy --mode link ${1+"$@"}; shift
-    ;;
-  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-    shift; set dummy --mode uninstall ${1+"$@"}; shift
-    ;;
-  esac
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+  shift; set dummy --mode clean ${1+"$@"}; shift
+  ;;
+compile|compil|compi|comp|com|co|c)
+  shift; set dummy --mode compile ${1+"$@"}; shift
+  ;;
+execute|execut|execu|exec|exe|ex|e)
+  shift; set dummy --mode execute ${1+"$@"}; shift
+  ;;
+finish|finis|fini|fin|fi|f)
+  shift; set dummy --mode finish ${1+"$@"}; shift
+  ;;
+install|instal|insta|inst|ins|in|i)
+  shift; set dummy --mode install ${1+"$@"}; shift
+  ;;
+link|lin|li|l)
+  shift; set dummy --mode link ${1+"$@"}; shift
+  ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+  shift; set dummy --mode uninstall ${1+"$@"}; shift
+  ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_warning=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
 
-  # Parse non-mode specific arguments:
-  while test "$#" -gt 0; do
+
+# Parse options once, thoroughly.  This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+  # this just eases exit handling
+  while test $# -gt 0; do
     opt="$1"
     shift
-
     case $opt in
-      --config)                func_config                                     ;;
-
-      --debug)         preserve_args="$preserve_args $opt"
+      --debug|-x)      opt_debug='set -x'
                        func_echo "enabling shell trace mode"
-                       opt_debug='set -x'
                        $opt_debug
                        ;;
-
-      -dlopen)         test "$#" -eq 0 && func_missing_arg "$opt" && break
-                       execute_dlfiles="$execute_dlfiles $1"
-                       shift
+      --dry-run|--dryrun|-n)
+                       opt_dry_run=:
                        ;;
-
-      --dry-run | -n)  opt_dry_run=:                                   ;;
-      --features)       func_features                                  ;;
-      --finish)                mode="finish"                                   ;;
-
-      --mode)          test "$#" -eq 0 && func_missing_arg "$opt" && break
-                       case $1 in
-                         # Valid mode arguments:
-                         clean)        ;;
-                         compile)      ;;
-                         execute)      ;;
-                         finish)       ;;
-                         install)      ;;
-                         link)         ;;
-                         relink)       ;;
-                         uninstall)    ;;
-
-                         # Catch anything else as an error
-                         *) func_error "invalid argument for $opt"
-                            exit_cmd=exit
-                            break
-                            ;;
-                       esac
-
-                       mode="$1"
+      --config)
+                       opt_config=:
+func_config
+                       ;;
+      --dlopen|-dlopen)
+                       optarg="$1"
+                       opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
                        shift
                        ;;
-
       --preserve-dup-deps)
-                       opt_duplicate_deps=:                            ;;
-
-      --quiet|--silent)        preserve_args="$preserve_args $opt"
-                       opt_silent=:
+                       opt_preserve_dup_deps=:
                        ;;
-
-      --verbose| -v)   preserve_args="$preserve_args $opt"
+      --features)
+                       opt_features=:
+func_features
+                       ;;
+      --finish)
+                       opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+                       ;;
+      --help)
+                       opt_help=:
+                       ;;
+      --help-all)
+                       opt_help_all=:
+opt_help=': help-all'
+                       ;;
+      --mode)
+                       test $# = 0 && func_missing_arg $opt && break
+                       optarg="$1"
+                       opt_mode="$optarg"
+case $optarg in
+  # Valid mode arguments:
+  clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+  # Catch anything else as an error
+  *) func_error "invalid argument for $opt"
+     exit_cmd=exit
+     break
+     ;;
+esac
+                       shift
+                       ;;
+      --no-silent|--no-quiet)
                        opt_silent=false
+func_append preserve_args " $opt"
                        ;;
-
-      --tag)           test "$#" -eq 0 && func_missing_arg "$opt" && break
-                       preserve_args="$preserve_args $opt $1"
-                       func_enable_tag "$1"    # tagname is set here
+      --no-warning|--no-warn)
+                       opt_warning=false
+func_append preserve_args " $opt"
+                       ;;
+      --no-verbose)
+                       opt_verbose=false
+func_append preserve_args " $opt"
+                       ;;
+      --silent|--quiet)
+                       opt_silent=:
+func_append preserve_args " $opt"
+        opt_verbose=false
+                       ;;
+      --verbose|-v)
+                       opt_verbose=:
+func_append preserve_args " $opt"
+opt_silent=false
+                       ;;
+      --tag)
+                       test $# = 0 && func_missing_arg $opt && break
+                       optarg="$1"
+                       opt_tag="$optarg"
+func_append preserve_args " $opt $optarg"
+func_enable_tag "$optarg"
                        shift
                        ;;
 
+      -\?|-h)          func_usage                              ;;
+      --help)          func_help                               ;;
+      --version)       func_version                            ;;
+
       # Separate optargs to long options:
-      -dlopen=*|--mode=*|--tag=*)
-                       func_opt_split "$opt"
-                       set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
+      --*=*)
+                       func_split_long_opt "$opt"
+                       set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
                        shift
                        ;;
 
-      -\?|-h)          func_usage                                      ;;
-      --help)          opt_help=:                                      ;;
-      --version)       func_version                                    ;;
-
-      -*)              func_fatal_help "unrecognized option \`$opt'"   ;;
-
-      *)               nonopt="$opt"
-                       break
+      # Separate non-argument short options:
+      -\?*|-h*|-n*|-v*)
+                       func_split_short_opt "$opt"
+                       set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+                       shift
                        ;;
+
+      --)              break                                   ;;
+      -*)              func_fatal_help "unrecognized option \`$opt'" ;;
+      *)               set dummy "$opt" ${1+"$@"};     shift; break  ;;
     esac
   done
 
+  # Validate options:
+
+  # save first non-option argument
+  if test "$#" -gt 0; then
+    nonopt="$opt"
+    shift
+  fi
+
+  # preserve --debug
+  test "$opt_debug" = : || func_append preserve_args " --debug"
 
   case $host in
     *cygwin* | *mingw* | *pw32* | *cegcc*)
@@ -810,82 +1186,44 @@ func_enable_tag ()
       opt_duplicate_compiler_generated_deps=:
       ;;
     *)
-      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
+      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
       ;;
   esac
 
-  # Having warned about all mis-specified options, bail out if
-  # anything was wrong.
-  $exit_cmd $EXIT_FAILURE
-}
+  $opt_help || {
+    # Sanity checks first:
+    func_check_version_match
 
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      else
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
+    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+      func_fatal_configuration "not configured to build any kind of library"
     fi
 
-    exit $EXIT_MISMATCH
-  fi
-}
-
-
-## ----------- ##
-##    Main.    ##
-## ----------- ##
-
-$opt_help || {
-  # Sanity checks first:
-  func_check_version_match
+    # Darwin sucks
+    eval std_shrext=\"$shrext_cmds\"
 
-  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-    func_fatal_configuration "not configured to build any kind of library"
-  fi
+    # Only execute mode is allowed to have -dlopen flags.
+    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+      func_error "unrecognized option \`-dlopen'"
+      $ECHO "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
 
-  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
+    # Change the help message to a mode-specific one.
+    generic_help="$help"
+    help="Try \`$progname --help --mode=$opt_mode' for more information."
+  }
 
 
-  # Darwin sucks
-  eval std_shrext=\"$shrext_cmds\"
+  # Bail if the options were screwed
+  $exit_cmd $EXIT_FAILURE
+}
 
 
-  # Only execute mode is allowed to have -dlopen flags.
-  if test -n "$execute_dlfiles" && test "$mode" != execute; then
-    func_error "unrecognized option \`-dlopen'"
-    $ECHO "$help" 1>&2
-    exit $EXIT_FAILURE
-  fi
 
-  # Change the help message to a mode-specific one.
-  generic_help="$help"
-  help="Try \`$progname --help --mode=$mode' for more information."
-}
 
+## ----------- ##
+##    Main.    ##
+## ----------- ##
 
 # func_lalib_p file
 # True iff FILE is a libtool `.la' library or `.lo' object file.
@@ -950,12 +1288,9 @@ func_ltwrapper_executable_p ()
 # temporary ltwrapper_script.
 func_ltwrapper_scriptname ()
 {
-    func_ltwrapper_scriptname_result=""
-    if func_ltwrapper_executable_p "$1"; then
-       func_dirname_and_basename "$1" "" "."
-       func_stripname '' '.exe' "$func_basename_result"
-       func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
-    fi
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
 }
 
 # func_ltwrapper_p file
@@ -1001,6 +1336,37 @@ func_source ()
 }
 
 
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case "$lt_sysroot:$1" in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result="=$func_stripname_result"
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
 # func_infer_tag arg
 # Infer tagged configuration to use if any are available and
 # if one wasn't chosen via the "--tag" command line option.
@@ -1013,13 +1379,15 @@ func_infer_tag ()
     if test -n "$available_tags" && test -z "$tagname"; then
       CC_quoted=
       for arg in $CC; do
-        func_quote_for_eval "$arg"
-       CC_quoted="$CC_quoted $func_quote_for_eval_result"
+       func_append_quoted CC_quoted "$arg"
       done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
       case $@ in
       # Blanks in the command may have been stripped by the calling shell,
       # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
       # Blanks at the start of $base_compile will cause this to fail
       # if we don't check for them as well.
       *)
@@ -1030,11 +1398,13 @@ func_infer_tag ()
            CC_quoted=
            for arg in $CC; do
              # Double-quote args containing other shell metacharacters.
-             func_quote_for_eval "$arg"
-             CC_quoted="$CC_quoted $func_quote_for_eval_result"
+             func_append_quoted CC_quoted "$arg"
            done
+           CC_expanded=`func_echo_all $CC`
+           CC_quoted_expanded=`func_echo_all $CC_quoted`
            case "$@ " in
-             " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
+           " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+           " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
              # The compiler in the base compile command matches
              # the one in the tagged configuration.
              # Assume this is the tagged configuration we want.
@@ -1097,6 +1467,486 @@ EOF
     }
 }
 
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $opt_debug
+  func_convert_core_file_wine_to_w32_result="$1"
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$lt_sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $opt_debug
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=""
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $opt_debug
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $opt_debug
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $opt_debug
+  if test -z "$2" && test -n "$1" ; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  \`$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result="$1"
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $opt_debug
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  \`$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result="$3"
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $opt_debug
+  case $4 in
+  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $opt_debug
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $opt_debug
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $opt_debug
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $opt_debug
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
 # func_mode_compile arg...
 func_mode_compile ()
 {
@@ -1137,12 +1987,12 @@ func_mode_compile ()
          ;;
 
        -pie | -fpie | -fPIE)
-          pie_flag="$pie_flag $arg"
+          func_append pie_flag " $arg"
          continue
          ;;
 
        -shared | -static | -prefer-pic | -prefer-non-pic)
-         later="$later $arg"
+         func_append later " $arg"
          continue
          ;;
 
@@ -1163,15 +2013,14 @@ func_mode_compile ()
          save_ifs="$IFS"; IFS=','
          for arg in $args; do
            IFS="$save_ifs"
-           func_quote_for_eval "$arg"
-           lastarg="$lastarg $func_quote_for_eval_result"
+           func_append_quoted lastarg "$arg"
          done
          IFS="$save_ifs"
          func_stripname ' ' '' "$lastarg"
          lastarg=$func_stripname_result
 
          # Add the arguments to base_compile.
-         base_compile="$base_compile $lastarg"
+         func_append base_compile " $lastarg"
          continue
          ;;
 
@@ -1187,8 +2036,7 @@ func_mode_compile ()
       esac    #  case $arg_mode
 
       # Aesthetically quote the previous argument.
-      func_quote_for_eval "$lastarg"
-      base_compile="$base_compile $func_quote_for_eval_result"
+      func_append_quoted base_compile "$lastarg"
     done # for arg
 
     case $arg_mode in
@@ -1213,7 +2061,7 @@ func_mode_compile ()
     *.[cCFSifmso] | \
     *.ada | *.adb | *.ads | *.asm | \
     *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
-    *.[fF][09]? | *.for | *.java | *.obj | *.sx)
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
       func_xform "$libobj"
       libobj=$func_xform_result
       ;;
@@ -1288,7 +2136,7 @@ func_mode_compile ()
     # Calculate the filename of the output object if compiler does
     # not support -o with -c
     if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
       lockfile="$output_obj.lock"
     else
       output_obj=
@@ -1319,17 +2167,16 @@ compiler."
        $opt_dry_run || $RM $removelist
        exit $EXIT_FAILURE
       fi
-      removelist="$removelist $output_obj"
+      func_append removelist " $output_obj"
       $ECHO "$srcfile" > "$lockfile"
     fi
 
     $opt_dry_run || $RM $removelist
-    removelist="$removelist $lockfile"
+    func_append removelist " $lockfile"
     trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
 
-    if test -n "$fix_srcfile_path"; then
-      eval srcfile=\"$fix_srcfile_path\"
-    fi
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
     func_quote_for_eval "$srcfile"
     qsrcfile=$func_quote_for_eval_result
 
@@ -1349,7 +2196,7 @@ compiler."
 
       if test -z "$output_obj"; then
        # Place PIC objects in $objdir
-       command="$command -o $lobj"
+       func_append command " -o $lobj"
       fi
 
       func_show_eval_locale "$command" \
@@ -1396,11 +2243,11 @@ compiler."
        command="$base_compile $qsrcfile $pic_flag"
       fi
       if test "$compiler_c_o" = yes; then
-       command="$command -o $obj"
+       func_append command " -o $obj"
       fi
 
       # Suppress compiler output if we already did a PIC compilation.
-      command="$command$suppress_output"
+      func_append command "$suppress_output"
       func_show_eval_locale "$command" \
         '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
 
@@ -1445,13 +2292,13 @@ compiler."
 }
 
 $opt_help || {
-test "$mode" = compile && func_mode_compile ${1+"$@"}
+  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
 }
 
 func_mode_help ()
 {
     # We need to display help for each of the modes.
-    case $mode in
+    case $opt_mode in
       "")
         # Generic help is extracted from the usage comments
         # at the start of this file.
@@ -1482,10 +2329,11 @@ This mode accepts the following additional options:
 
   -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
   -no-suppress      do not suppress compiler output for multiple passes
-  -prefer-pic       try to building PIC objects only
-  -prefer-non-pic   try to building non-PIC objects only
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
   -shared           do not build a \`.o' file suitable for static linking
   -static           only build a \`.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
 
 COMPILE-COMMAND is a command to be used in creating a \`standard' object file
 from the given SOURCEFILE.
@@ -1538,7 +2386,7 @@ either the \`install' or \`cp' program.
 
 The following components of INSTALL-COMMAND are treated specially:
 
-  -inst-prefix PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
 
 The rest of the components are interpreted as arguments to that command (only
 BSD-compatible install options are recognized)."
@@ -1558,6 +2406,8 @@ The following components of LINK-COMMAND are treated specially:
 
   -all-static       do not do any dynamic linking at all
   -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
   -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
   -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
   -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
@@ -1586,6 +2436,11 @@ The following components of LINK-COMMAND are treated specially:
   -version-info CURRENT[:REVISION[:AGE]]
                     specify library version info [each variable defaults to 0]
   -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
 
 All other options (arguments beginning with \`-') are ignored.
 
@@ -1619,18 +2474,44 @@ Otherwise, only FILE itself is deleted using RM."
         ;;
 
       *)
-        func_fatal_help "invalid operation mode \`$mode'"
+        func_fatal_help "invalid operation mode \`$opt_mode'"
         ;;
     esac
 
-    $ECHO
+    echo
     $ECHO "Try \`$progname --help' for more information about other modes."
-
-    exit $?
 }
 
-  # Now that we've collected a possible --mode arg, show help if necessary
-  $opt_help && func_mode_help
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test "$opt_help" = :; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+       func_mode_help
+      done
+    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+       echo
+       func_mode_help
+      done
+    } |
+    sed '1d
+      /^When reporting/,/^Report/{
+       H
+       d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
 
 
 # func_mode_execute arg...
@@ -1643,13 +2524,16 @@ func_mode_execute ()
       func_fatal_help "you must specify a COMMAND"
 
     # Handle -dlopen flags immediately.
-    for file in $execute_dlfiles; do
+    for file in $opt_dlopen; do
       test -f "$file" \
        || func_fatal_help "\`$file' is not a file"
 
       dir=
       case $file in
       *.la)
+       func_resolve_sysroot "$file"
+       file=$func_resolve_sysroot_result
+
        # Check to see that this really is a libtool archive.
        func_lalib_unsafe_p "$file" \
          || func_fatal_help "\`$lib' is not a valid libtool archive"
@@ -1671,7 +2555,7 @@ func_mode_execute ()
        dir="$func_dirname_result"
 
        if test -f "$dir/$objdir/$dlname"; then
-         dir="$dir/$objdir"
+         func_append dir "/$objdir"
        else
          if test ! -f "$dir/$dlname"; then
            func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
@@ -1712,7 +2596,7 @@ func_mode_execute ()
     for file
     do
       case $file in
-      -*) ;;
+      -* | *.la | *.lo ) ;;
       *)
        # Do a test to see if this is really a libtool program.
        if func_ltwrapper_script_p "$file"; then
@@ -1728,8 +2612,7 @@ func_mode_execute ()
        ;;
       esac
       # Quote arguments (to preserve shell metacharacters).
-      func_quote_for_eval "$file"
-      args="$args $func_quote_for_eval_result"
+      func_append_quoted args "$file"
     done
 
     if test "X$opt_dry_run" = Xfalse; then
@@ -1754,29 +2637,66 @@ func_mode_execute ()
       # Display what would be done.
       if test -n "$shlibpath_var"; then
        eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-       $ECHO "export $shlibpath_var"
+       echo "export $shlibpath_var"
       fi
       $ECHO "$cmd$args"
       exit $EXIT_SUCCESS
     fi
 }
 
-test "$mode" = execute && func_mode_execute ${1+"$@"}
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
 
 
 # func_mode_finish arg...
 func_mode_finish ()
 {
     $opt_debug
-    libdirs="$nonopt"
+    libs=
+    libdirs=
     admincmds=
 
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+       func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+       if func_lalib_unsafe_p "$opt"; then
+         func_append libs " $opt"
+       else
+         func_warning "\`$opt' is not a valid libtool archive"
+       fi
+
+      else
+       func_fatal_error "invalid argument \`$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+         sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+           > $tmpdir/tmp-la
+         mv -f $tmpdir/tmp-la $lib
+       done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
     if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for dir
-      do
-       libdirs="$libdirs $dir"
-      done
-
       for libdir in $libdirs; do
        if test -n "$finish_cmds"; then
          # Do each command in the finish commands.
@@ -1786,7 +2706,7 @@ func_mode_finish ()
        if test -n "$finish_eval"; then
          # Do the single finish_eval.
          eval cmds=\"$finish_eval\"
-         $opt_dry_run || eval "$cmds" || admincmds="$admincmds
+         $opt_dry_run || eval "$cmds" || func_append admincmds "
        $cmds"
        fi
       done
@@ -1795,53 +2715,55 @@ func_mode_finish ()
     # Exit here if they wanted silent mode.
     $opt_silent && exit $EXIT_SUCCESS
 
-    $ECHO "X----------------------------------------------------------------------" | $Xsed
-    $ECHO "Libraries have been installed in:"
-    for libdir in $libdirs; do
-      $ECHO "   $libdir"
-    done
-    $ECHO
-    $ECHO "If you ever happen to want to link against installed libraries"
-    $ECHO "in a given directory, LIBDIR, you must either use libtool, and"
-    $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'"
-    $ECHO "flag during linking and do at least one of the following:"
-    if test -n "$shlibpath_var"; then
-      $ECHO "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-      $ECHO "     during execution"
-    fi
-    if test -n "$runpath_var"; then
-      $ECHO "   - add LIBDIR to the \`$runpath_var' environment variable"
-      $ECHO "     during linking"
-    fi
-    if test -n "$hardcode_libdir_flag_spec"; then
-      libdir=LIBDIR
-      eval flag=\"$hardcode_libdir_flag_spec\"
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+       $ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+       echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+       echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+       echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+       echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+       libdir=LIBDIR
+       eval flag=\"$hardcode_libdir_flag_spec\"
 
-      $ECHO "   - use the \`$flag' linker flag"
-    fi
-    if test -n "$admincmds"; then
-      $ECHO "   - have your system administrator run these commands:$admincmds"
-    fi
-    if test -f /etc/ld.so.conf; then
-      $ECHO "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-    fi
-    $ECHO
+       $ECHO "   - use the \`$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+       $ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+       echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+      fi
+      echo
 
-    $ECHO "See any operating system documentation about shared libraries for"
-    case $host in
-      solaris2.[6789]|solaris2.1[0-9])
-        $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual"
-       $ECHO "pages."
-       ;;
-      *)
-        $ECHO "more information, such as the ld(1) and ld.so(8) manual pages."
-        ;;
-    esac
-    $ECHO "X----------------------------------------------------------------------" | $Xsed
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+       solaris2.[6789]|solaris2.1[0-9])
+         echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+         echo "pages."
+         ;;
+       *)
+         echo "more information, such as the ld(1) and ld.so(8) manual pages."
+         ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
     exit $EXIT_SUCCESS
 }
 
-test "$mode" = finish && func_mode_finish ${1+"$@"}
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
 
 
 # func_mode_install arg...
@@ -1852,7 +2774,7 @@ func_mode_install ()
     # install_prog (especially on Windows NT).
     if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
        # Allow the use of GNU shtool's install command.
-       $ECHO "X$nonopt" | $GREP shtool >/dev/null; then
+       case $nonopt in *shtool*) :;; *) false;; esac; then
       # Aesthetically quote it.
       func_quote_for_eval "$nonopt"
       install_prog="$func_quote_for_eval_result "
@@ -1866,7 +2788,12 @@ func_mode_install ()
     # The real first argument should be the name of the installation program.
     # Aesthetically quote it.
     func_quote_for_eval "$arg"
-    install_prog="$install_prog$func_quote_for_eval_result"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
 
     # We need to accept at least all the BSD install flags.
     dest=
@@ -1876,10 +2803,12 @@ func_mode_install ()
     install_type=
     isdir=no
     stripme=
+    no_mode=:
     for arg
     do
+      arg2=
       if test -n "$dest"; then
-       files="$files $dest"
+       func_append files " $dest"
        dest=$arg
        continue
       fi
@@ -1887,10 +2816,9 @@ func_mode_install ()
       case $arg in
       -d) isdir=yes ;;
       -f)
-       case " $install_prog " in
-       *[\\\ /]cp\ *) ;;
-       *) prev=$arg ;;
-       esac
+       if $install_cp; then :; else
+         prev=$arg
+       fi
        ;;
       -g | -m | -o)
        prev=$arg
@@ -1904,6 +2832,10 @@ func_mode_install ()
       *)
        # If the previous option needed an argument, then skip it.
        if test -n "$prev"; then
+         if test "x$prev" = x-m && test -n "$install_override_mode"; then
+           arg2=$install_override_mode
+           no_mode=false
+         fi
          prev=
        else
          dest=$arg
@@ -1914,7 +2846,11 @@ func_mode_install ()
 
       # Aesthetically quote the argument.
       func_quote_for_eval "$arg"
-      install_prog="$install_prog $func_quote_for_eval_result"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+       func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
     done
 
     test -z "$install_prog" && \
@@ -1923,6 +2859,13 @@ func_mode_install ()
     test -n "$prev" && \
       func_fatal_help "the \`$prev' option requires an argument"
 
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+       func_quote_for_eval "$install_override_mode"
+       func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
     if test -z "$files"; then
       if test -z "$dest"; then
        func_fatal_help "no file or destination specified"
@@ -1977,10 +2920,13 @@ func_mode_install ()
       case $file in
       *.$libext)
        # Do the static libraries later.
-       staticlibs="$staticlibs $file"
+       func_append staticlibs " $file"
        ;;
 
       *.la)
+       func_resolve_sysroot "$file"
+       file=$func_resolve_sysroot_result
+
        # Check to see that this really is a libtool archive.
        func_lalib_unsafe_p "$file" \
          || func_fatal_help "\`$file' is not a valid libtool archive"
@@ -1994,23 +2940,23 @@ func_mode_install ()
        if test "X$destdir" = "X$libdir"; then
          case "$current_libdirs " in
          *" $libdir "*) ;;
-         *) current_libdirs="$current_libdirs $libdir" ;;
+         *) func_append current_libdirs " $libdir" ;;
          esac
        else
          # Note the libdir as a future libdir.
          case "$future_libdirs " in
          *" $libdir "*) ;;
-         *) future_libdirs="$future_libdirs $libdir" ;;
+         *) func_append future_libdirs " $libdir" ;;
          esac
        fi
 
        func_dirname "$file" "/" ""
        dir="$func_dirname_result"
-       dir="$dir$objdir"
+       func_append dir "$objdir"
 
        if test -n "$relink_command"; then
          # Determine the prefix the user has applied to our future dir.
-         inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"`
+         inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
 
          # Don't allow the user to place us outside of our expected
          # location b/c this prevents finding dependent libraries that
@@ -2023,9 +2969,9 @@ func_mode_install ()
 
          if test -n "$inst_prefix_dir"; then
            # Stick the inst_prefix_dir data into the link command.
-           relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+           relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
          else
-           relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"`
+           relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
          fi
 
          func_warning "relinking \`$file'"
@@ -2043,7 +2989,7 @@ func_mode_install ()
          test -n "$relink_command" && srcname="$realname"T
 
          # Install the shared library and build the symlinks.
-         func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \
+         func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
              'exit $?'
          tstripme="$stripme"
          case $host_os in
@@ -2083,7 +3029,7 @@ func_mode_install ()
        func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
 
        # Maybe install the static library, too.
-       test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+       test -n "$old_library" && func_append staticlibs " $dir/$old_library"
        ;;
 
       *.lo)
@@ -2183,7 +3129,7 @@ func_mode_install ()
            if test -f "$lib"; then
              func_source "$lib"
            fi
-           libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+           libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
            if test -n "$libdir" && test ! -f "$libfile"; then
              func_warning "\`$lib' has not been installed in \`$libdir'"
              finalize=no
@@ -2202,7 +3148,7 @@ func_mode_install ()
                file="$func_basename_result"
                outputname="$tmpdir/$file"
                # Replace the output file specification.
-               relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+               relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
 
                $opt_silent || {
                  func_quote_for_expand "$relink_command"
@@ -2221,7 +3167,7 @@ func_mode_install ()
            }
          else
            # Install the binary that we compiled earlier.
-           file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+           file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
          fi
        fi
 
@@ -2257,11 +3203,13 @@ func_mode_install ()
 
       # Set up the ranlib parameters.
       oldlib="$destdir/$name"
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
 
       func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
 
       if test -n "$stripme" && test -n "$old_striplib"; then
-       func_show_eval "$old_striplib $oldlib" 'exit $?'
+       func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
       fi
 
       # Do each command in the postinstall commands.
@@ -2280,7 +3228,7 @@ func_mode_install ()
     fi
 }
 
-test "$mode" = install && func_mode_install ${1+"$@"}
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
 
 
 # func_generate_dlsyms outputname originator pic_p
@@ -2323,6 +3271,22 @@ func_generate_dlsyms ()
 extern \"C\" {
 #endif
 
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
 /* External symbol declarations for the compiler. */\
 "
 
@@ -2332,10 +3296,11 @@ extern \"C\" {
          $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
 
          # Add our own program objects to the symbol list.
-         progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+         progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
          for progfile in $progfiles; do
-           func_verbose "extracting global C symbols from \`$progfile'"
-           $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
+           func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+           func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+           $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
          done
 
          if test -n "$exclude_expsyms"; then
@@ -2371,7 +3336,7 @@ extern \"C\" {
              eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
              eval '$MV "$nlist"T "$nlist"'
              case $host in
-               *cygwin | *mingw* | *cegcc* )
+               *cygwin* | *mingw* | *cegcc* )
                  eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
                  eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
                  ;;
@@ -2384,10 +3349,52 @@ extern \"C\" {
          func_verbose "extracting global C symbols from \`$dlprefile'"
          func_basename "$dlprefile"
          name="$func_basename_result"
-         $opt_dry_run || {
-           eval '$ECHO ": $name " >> "$nlist"'
-           eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
-         }
+          case $host in
+           *cygwin* | *mingw* | *cegcc* )
+             # if an import library, we need to obtain dlname
+             if func_win32_import_lib_p "$dlprefile"; then
+               func_tr_sh "$dlprefile"
+               eval "curr_lafile=\$libfile_$func_tr_sh_result"
+               dlprefile_dlbasename=""
+               if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+                 # Use subshell, to avoid clobbering current variable values
+                 dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+                 if test -n "$dlprefile_dlname" ; then
+                   func_basename "$dlprefile_dlname"
+                   dlprefile_dlbasename="$func_basename_result"
+                 else
+                   # no lafile. user explicitly requested -dlpreopen <import library>.
+                   $sharedlib_from_linklib_cmd "$dlprefile"
+                   dlprefile_dlbasename=$sharedlib_from_linklib_result
+                 fi
+               fi
+               $opt_dry_run || {
+                 if test -n "$dlprefile_dlbasename" ; then
+                   eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+                 else
+                   func_warning "Could not compute DLL name from $name"
+                   eval '$ECHO ": $name " >> "$nlist"'
+                 fi
+                 func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+                 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+                   $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+               }
+             else # not an import lib
+               $opt_dry_run || {
+                 eval '$ECHO ": $name " >> "$nlist"'
+                 func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+                 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+               }
+             fi
+           ;;
+           *)
+             $opt_dry_run || {
+               eval '$ECHO ": $name " >> "$nlist"'
+               func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+               eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+             }
+           ;;
+          esac
        done
 
        $opt_dry_run || {
@@ -2415,36 +3422,19 @@ extern \"C\" {
          if test -f "$nlist"S; then
            eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
          else
-           $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms"
+           echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
          fi
 
-         $ECHO >> "$output_objdir/$my_dlsyms" "\
+         echo >> "$output_objdir/$my_dlsyms" "\
 
 /* The mapping between symbol names and symbols.  */
 typedef struct {
   const char *name;
   void *address;
 } lt_dlsymlist;
-"
-         case $host in
-         *cygwin* | *mingw* | *cegcc* )
-           $ECHO >> "$output_objdir/$my_dlsyms" "\
-/* DATA imports from DLLs on WIN32 con't be const, because
-   runtime relocations are performed -- see ld's documentation
-   on pseudo-relocs.  */"
-           lt_dlsym_const= ;;
-         *osf5*)
-           echo >> "$output_objdir/$my_dlsyms" "\
-/* This system does not cope well with relocations in const data */"
-           lt_dlsym_const= ;;
-         *)
-           lt_dlsym_const=const ;;
-         esac
-
-         $ECHO >> "$output_objdir/$my_dlsyms" "\
-extern $lt_dlsym_const lt_dlsymlist
+extern LT_DLSYM_CONST lt_dlsymlist
 lt_${my_prefix}_LTX_preloaded_symbols[];
-$lt_dlsym_const lt_dlsymlist
+LT_DLSYM_CONST lt_dlsymlist
 lt_${my_prefix}_LTX_preloaded_symbols[] =
 {\
   { \"$my_originator\", (void *) 0 },"
@@ -2457,7 +3447,7 @@ lt_${my_prefix}_LTX_preloaded_symbols[] =
            eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
            ;;
          esac
-         $ECHO >> "$output_objdir/$my_dlsyms" "\
+         echo >> "$output_objdir/$my_dlsyms" "\
   {0, (void *) 0}
 };
 
@@ -2484,7 +3474,7 @@ static const void *lt_preloaded_setup() {
          # linked before any other PIC object.  But we must not use
          # pic_flag when linking with -static.  The problem exists in
          # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-         *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+         *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
            pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
          *-*-hpux*)
            pic_flag_for_symtable=" $pic_flag"  ;;
@@ -2500,7 +3490,7 @@ static const void *lt_preloaded_setup() {
        for arg in $LTCFLAGS; do
          case $arg in
          -pie | -fpie | -fPIE) ;;
-         *) symtab_cflags="$symtab_cflags $arg" ;;
+         *) func_append symtab_cflags " $arg" ;;
          esac
        done
 
@@ -2515,16 +3505,16 @@ static const void *lt_preloaded_setup() {
        case $host in
        *cygwin* | *mingw* | *cegcc* )
          if test -f "$output_objdir/$my_outputname.def"; then
-           compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-           finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+           compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+           finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
          else
-           compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-           finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+           compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+           finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
          fi
          ;;
        *)
-         compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-         finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+         compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+         finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
          ;;
        esac
        ;;
@@ -2538,8 +3528,8 @@ static const void *lt_preloaded_setup() {
       # really was required.
 
       # Nullify the symbol file.
-      compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
-      finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
     fi
 }
 
@@ -2549,6 +3539,7 @@ static const void *lt_preloaded_setup() {
 # Need a lot of goo to handle *both* DLLs and import libs
 # Has to be a shell function in order to 'eat' the argument
 # that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
 func_win32_libid ()
 {
   $opt_debug
@@ -2559,9 +3550,11 @@ func_win32_libid ()
     win32_libid_type="x86 archive import"
     ;;
   *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
     if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
-       $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
-      win32_nmres=`eval $NM -f posix -A $1 |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      func_to_tool_file "$1" func_convert_file_msys_to_w32
+      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
        $SED -n -e '
            1,100{
                / I /{
@@ -2590,6 +3583,131 @@ func_win32_libid ()
   $ECHO "$win32_libid_type"
 }
 
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $opt_debug
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $opt_debug
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[         ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive which possess that section. Heuristic: eliminate
+    # all those which have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $opt_debug
+  if func_cygming_gnu_implib_p "$1" ; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1" ; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=""
+  fi
+}
 
 
 # func_extract_an_archive dir oldlib
@@ -2598,7 +3716,18 @@ func_extract_an_archive ()
     $opt_debug
     f_ex_an_ar_dir="$1"; shift
     f_ex_an_ar_oldlib="$1"
-    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
+    if test "$lock_old_archive_extraction" = yes; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+       func_echo "Waiting for $lockfile to be removed"
+       sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+                  'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test "$lock_old_archive_extraction" = yes; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
     if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
      :
     else
@@ -2669,7 +3798,7 @@ func_extract_archives ()
            darwin_file=
            darwin_files=
            for darwin_file in $darwin_filelist; do
-             darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+             darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
              $LIPO -create -output "$darwin_file" $darwin_files
            done # $darwin_filelist
            $RM -rf unfat-$$
@@ -2684,25 +3813,30 @@ func_extract_archives ()
         func_extract_an_archive "$my_xdir" "$my_xabs"
        ;;
       esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
     done
 
     func_extract_archives_result="$my_oldobjs"
 }
 
 
-
-# func_emit_wrapper_part1 [arg=no]
+# func_emit_wrapper [arg=no]
 #
-# Emit the first part of a libtool wrapper script on stdout.
-# For more information, see the description associated with
-# func_emit_wrapper(), below.
-func_emit_wrapper_part1 ()
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
 {
-       func_emit_wrapper_part1_arg1=no
-       if test -n "$1" ; then
-         func_emit_wrapper_part1_arg1=$1
-       fi
+       func_emit_wrapper_arg1=${1-no}
 
        $ECHO "\
 #! $SHELL
@@ -2718,7 +3852,6 @@ func_emit_wrapper_part1 ()
 
 # Sed substitution that helps us do robust quoting.  It backslashifies
 # metacharacters that are still active within double-quoted strings.
-Xsed='${SED} -e 1s/^X//'
 sed_quote_subst='$sed_quote_subst'
 
 # Be Bourne compatible
@@ -2749,31 +3882,135 @@ if test \"\$libtool_install_magic\" = \"$magic\"; then
 else
   # When we are sourced in execute mode, \$file and \$ECHO are already set.
   if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    ECHO=\"$qecho\"
-    file=\"\$0\"
-    # Make sure echo works.
-    if test \"X\$1\" = X--no-reexec; then
-      # Discard the --no-reexec flag, and continue.
-      shift
-    elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
-      # Yippee, \$ECHO works!
-      :
-    else
-      # Restart under the correct shell, and then maybe \$ECHO will work.
-      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
-    fi
-  fi\
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
 "
-       $ECHO "\
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
 
   # Find the directory that this script lives in.
-  thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
   test \"x\$thisdir\" = \"x\$file\" && thisdir=.
 
   # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
   while test -n \"\$file\"; do
-    destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
 
     # If there was a directory component, then change thisdir.
     if test \"x\$destdir\" != \"x\$file\"; then
@@ -2783,30 +4020,13 @@ else
       esac
     fi
 
-    file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
   done
-"
-}
-# end: func_emit_wrapper_part1
-
-# func_emit_wrapper_part2 [arg=no]
-#
-# Emit the second part of a libtool wrapper script on stdout.
-# For more information, see the description associated with
-# func_emit_wrapper(), below.
-func_emit_wrapper_part2 ()
-{
-       func_emit_wrapper_part2_arg1=no
-       if test -n "$1" ; then
-         func_emit_wrapper_part2_arg1=$1
-       fi
-
-       $ECHO "\
 
   # Usually 'no', except on cygwin/mingw when embedded into
   # the cwrapper.
-  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
   if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
     # special case for '.'
     if test \"\$thisdir\" = \".\"; then
@@ -2814,7 +4034,7 @@ func_emit_wrapper_part2 ()
     fi
     # remove .libs from thisdir
     case \"\$thisdir\" in
-    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
     $objdir )   thisdir=. ;;
     esac
   fi
@@ -2869,6 +4089,18 @@ func_emit_wrapper_part2 ()
 
   if test -f \"\$progdir/\$program\"; then"
 
+       # fixup the dll searchpath if we need to.
+       #
+       # Fix the DLL searchpath if we need to.  Do this before prepending
+       # to shlibpath, because on Windows, both are PATH and uninstalled
+       # libraries must come first.
+       if test -n "$dllsearchpath"; then
+         $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+       fi
+
        # Export our shlibpath_var if we have one.
        if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
          $ECHO "\
@@ -2877,253 +4109,28 @@ func_emit_wrapper_part2 ()
 
     # Some systems cannot cope with colon-terminated $shlibpath_var
     # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
 
     export $shlibpath_var
 "
        fi
 
-       # fixup the dll searchpath if we need to.
-       if test -n "$dllsearchpath"; then
-         $ECHO "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
-       fi
-
        $ECHO "\
     if test \"\$libtool_execute_magic\" != \"$magic\"; then
       # Run the actual program with our arguments.
-"
-       case $host in
-       # Backslashes separate directories on plain windows
-       *-*-mingw | *-*-os2* | *-cegcc*)
-         $ECHO "\
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-         ;;
-
-       *)
-         $ECHO "\
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-         ;;
-       esac
-       $ECHO "\
-      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
-      exit 1
+      func_exec_program \${1+\"\$@\"}
     fi
   else
     # The program doesn't exist.
     \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
     \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
-    $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
     exit 1
   fi
 fi\
 "
 }
-# end: func_emit_wrapper_part2
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable.  Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory.  This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
-       func_emit_wrapper_arg1=no
-       if test -n "$1" ; then
-         func_emit_wrapper_arg1=$1
-       fi
-
-       # split this up so that func_emit_cwrapperexe_src
-       # can call each part independently.
-       func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
-       func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
-}
-
-
-# func_to_host_path arg
-#
-# Convert paths to host format when used with build tools.
-# Intended for use with "native" mingw (where libtool itself
-# is running under the msys shell), or in the following cross-
-# build environments:
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-# where wine is equipped with the `winepath' executable.
-# In the native mingw case, the (msys) shell automatically
-# converts paths for any non-msys applications it launches,
-# but that facility isn't available from inside the cwrapper.
-# Similar accommodations are necessary for $host mingw and
-# $build cygwin.  Calling this function does no harm for other
-# $host/$build combinations not listed above.
-#
-# ARG is the path (on $build) that should be converted to
-# the proper representation for $host. The result is stored
-# in $func_to_host_path_result.
-func_to_host_path ()
-{
-  func_to_host_path_result="$1"
-  if test -n "$1" ; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        case $build in
-          *mingw* ) # actually, msys
-            # awkward: cmd appends spaces to result
-            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
-            func_to_host_path_tmp1=`( cmd //c echo "$1" |\
-              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
-            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_path_tmp1=`cygpath -w "$1"`
-            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # Unfortunately, winepath does not exit with a non-zero
-            # error code, so we are forced to check the contents of
-            # stdout. On the other hand, if the command is not
-            # found, the shell will set an exit code of 127 and print
-            # *an error message* to stdout. So we must check for both
-            # error code of zero AND non-empty stdout, which explains
-            # the odd construction:
-            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
-            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
-              func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
-                $SED -e "$lt_sed_naive_backslashify"`
-            else
-              # Allow warning below.
-              func_to_host_path_result=""
-            fi
-            ;;
-        esac
-        if test -z "$func_to_host_path_result" ; then
-          func_error "Could not determine host path corresponding to"
-          func_error "  '$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback:
-          func_to_host_path_result="$1"
-        fi
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_path
 
-# func_to_host_pathlist arg
-#
-# Convert pathlists to host format when used with build tools.
-# See func_to_host_path(), above. This function supports the
-# following $build/$host combinations (but does no harm for
-# combinations not listed here):
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-#
-# Path separators are also converted from $build format to
-# $host format. If ARG begins or ends with a path separator
-# character, it is preserved (but converted to $host format)
-# on output.
-#
-# ARG is a pathlist (on $build) that should be converted to
-# the proper representation on $host. The result is stored
-# in $func_to_host_pathlist_result.
-func_to_host_pathlist ()
-{
-  func_to_host_pathlist_result="$1"
-  if test -n "$1" ; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        # Remove leading and trailing path separator characters from
-        # ARG. msys behavior is inconsistent here, cygpath turns them
-        # into '.;' and ';.', and winepath ignores them completely.
-        func_to_host_pathlist_tmp2="$1"
-        # Once set for this call, this variable should not be
-        # reassigned. It is used in tha fallback case.
-        func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
-          $SED -e 's|^:*||' -e 's|:*$||'`
-        case $build in
-          *mingw* ) # Actually, msys.
-            # Awkward: cmd appends spaces to result.
-            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
-            func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
-              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
-            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
-            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # unfortunately, winepath doesn't convert pathlists
-            func_to_host_pathlist_result=""
-            func_to_host_pathlist_oldIFS=$IFS
-            IFS=:
-            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
-              IFS=$func_to_host_pathlist_oldIFS
-              if test -n "$func_to_host_pathlist_f" ; then
-                func_to_host_path "$func_to_host_pathlist_f"
-                if test -n "$func_to_host_path_result" ; then
-                  if test -z "$func_to_host_pathlist_result" ; then
-                    func_to_host_pathlist_result="$func_to_host_path_result"
-                  else
-                    func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
-                  fi
-                fi
-              fi
-              IFS=:
-            done
-            IFS=$func_to_host_pathlist_oldIFS
-            ;;
-        esac
-        if test -z "$func_to_host_pathlist_result" ; then
-          func_error "Could not determine the host path(s) corresponding to"
-          func_error "  '$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback. This may break if $1 contains DOS-style drive
-          # specifications. The fix is not to complicate the expression
-          # below, but for the user to provide a working wine installation
-          # with winepath so that path translation in the cross-to-mingw
-          # case works properly.
-          lt_replace_pathsep_nix_to_dos="s|:|;|g"
-          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
-            $SED -e "$lt_replace_pathsep_nix_to_dos"`
-        fi
-        # Now, add the leading and trailing path separators back
-        case "$1" in
-          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
-            ;;
-        esac
-        case "$1" in
-          *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
-            ;;
-        esac
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_pathlist
 
 # func_emit_cwrapperexe_src
 # emit the source code for a wrapper executable on stdout
@@ -3141,31 +4148,23 @@ func_emit_cwrapperexe_src ()
 
    This wrapper executable should never be moved out of the build directory.
    If it is, it will not operate correctly.
-
-   Currently, it simply execs the wrapper *script* "$SHELL $output",
-   but could eventually absorb all of the scripts functionality and
-   exec $objdir/$outputname directly.
 */
 EOF
            cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 #ifdef _MSC_VER
 # include <direct.h>
 # include <process.h>
 # include <io.h>
-# define setmode _setmode
 #else
 # include <unistd.h>
 # include <stdint.h>
 # ifdef __CYGWIN__
-#  include <io.h>
-#  define HAVE_SETENV
-#  ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-#  endif
+#  include <io.h>
 # endif
 #endif
 #include <malloc.h>
@@ -3177,6 +4176,44 @@ int setenv (const char *, const char *, int);
 #include <fcntl.h>
 #include <sys/stat.h>
 
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+#  define _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
 #if defined(PATH_MAX)
 # define LT_PATHMAX PATH_MAX
 #elif defined(MAXPATHLEN)
@@ -3192,14 +4229,7 @@ int setenv (const char *, const char *, int);
 # define S_IXGRP 0
 #endif
 
-#ifdef _MSC_VER
-# define S_IXUSR _S_IEXEC
-# define stat _stat
-# ifndef _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#endif
-
+/* path handling portability macros */
 #ifndef DIR_SEPARATOR
 # define DIR_SEPARATOR '/'
 # define PATH_SEPARATOR ':'
@@ -3230,10 +4260,6 @@ int setenv (const char *, const char *, int);
 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
 #endif /* PATH_SEPARATOR_2 */
 
-#ifdef __CYGWIN__
-# define FOPEN_WB "wb"
-#endif
-
 #ifndef FOPEN_WB
 # define FOPEN_WB "w"
 #endif
@@ -3246,22 +4272,13 @@ int setenv (const char *, const char *, int);
   if (stale) { free ((void *) stale); stale = 0; } \
 } while (0)
 
-#undef LTWRAPPER_DEBUGPRINTF
-#if defined DEBUGWRAPPER
-# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
-static void
-ltwrapper_debugprintf (const char *fmt, ...)
-{
-    va_list args;
-    va_start (args, fmt);
-    (void) vfprintf (stderr, fmt, args);
-    va_end (args);
-}
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
 #else
-# define LTWRAPPER_DEBUGPRINTF(args)
+static int lt_debug = 0;
 #endif
 
-const char *program_name = NULL;
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
 
 void *xmalloc (size_t num);
 char *xstrdup (const char *string);
@@ -3271,41 +4288,27 @@ char *chase_symlinks (const char *pathspec);
 int make_executable (const char *path);
 int check_executable (const char *path);
 char *strendzap (char *str, const char *pat);
-void lt_fatal (const char *message, ...);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
 void lt_setenv (const char *name, const char *value);
 char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_opt_process_env_set (const char *arg);
-void lt_opt_process_env_prepend (const char *arg);
-void lt_opt_process_env_append (const char *arg);
-int lt_split_name_value (const char *arg, char** name, char** value);
 void lt_update_exe_path (const char *name, const char *value);
 void lt_update_lib_path (const char *name, const char *value);
-
-static const char *script_text_part1 =
-EOF
-
-           func_emit_wrapper_part1 yes |
-               $SED -e 's/\([\\"]\)/\\\1/g' \
-                    -e 's/^/  "/' -e 's/$/\\n"/'
-           echo ";"
-           cat <<EOF
-
-static const char *script_text_part2 =
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
 EOF
-           func_emit_wrapper_part2 yes |
-               $SED -e 's/\([\\"]\)/\\\1/g' \
-                    -e 's/^/  "/' -e 's/$/\\n"/'
-           echo ";"
 
            cat <<EOF
-const char * MAGIC_EXE = "$magic_exe";
+volatile const char * MAGIC_EXE = "$magic_exe";
 const char * LIB_PATH_VARNAME = "$shlibpath_var";
 EOF
 
            if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-              func_to_host_pathlist "$temp_rpath"
+              func_to_host_path "$temp_rpath"
              cat <<EOF
-const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
 EOF
            else
              cat <<"EOF"
@@ -3314,10 +4317,10 @@ EOF
            fi
 
            if test -n "$dllsearchpath"; then
-              func_to_host_pathlist "$dllsearchpath:"
+              func_to_host_path "$dllsearchpath:"
              cat <<EOF
 const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
 EOF
            else
              cat <<"EOF"
@@ -3340,24 +4343,10 @@ EOF
            cat <<"EOF"
 
 #define LTWRAPPER_OPTION_PREFIX         "--lt-"
-#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
 
-static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
 static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-
 static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
-
-static const size_t env_set_opt_len     = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
-static const char *env_set_opt          = LTWRAPPER_OPTION_PREFIX "env-set";
-  /* argument is putenv-style "foo=bar", value of foo is set to bar */
-
-static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
-static const char *env_prepend_opt      = LTWRAPPER_OPTION_PREFIX "env-prepend";
-  /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
-
-static const size_t env_append_opt_len  = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
-static const char *env_append_opt       = LTWRAPPER_OPTION_PREFIX "env-append";
-  /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
 
 int
 main (int argc, char *argv[])
@@ -3374,10 +4363,13 @@ main (int argc, char *argv[])
   int i;
 
   program_name = (char *) xstrdup (base_name (argv[0]));
-  LTWRAPPER_DEBUGPRINTF (("(main) argv[0]      : %s\n", argv[0]));
-  LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
+  newargz = XMALLOC (char *, argc + 1);
 
-  /* very simple arg parsing; don't want to rely on getopt */
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
   for (i = 1; i < argc; i++)
     {
       if (strcmp (argv[i], dumpscript_opt) == 0)
@@ -3391,25 +4383,57 @@ EOF
              esac
 
            cat <<"EOF"
-         printf ("%s", script_text_part1);
-         printf ("%s", script_text_part2);
+         lt_dump_script (stdout);
          return 0;
        }
+      if (strcmp (argv[i], debug_opt) == 0)
+       {
+          lt_debug = 1;
+          continue;
+       }
+      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+                   "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
     }
+  newargz[++newargc] = NULL;
+
+EOF
+           cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+           cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
 
-  newargz = XMALLOC (char *, argc + 1);
   tmp_pathspec = find_executable (argv[0]);
   if (tmp_pathspec == NULL)
-    lt_fatal ("Couldn't find %s", argv[0]);
-  LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
-                         tmp_pathspec));
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+                 tmp_pathspec);
 
   actual_cwrapper_path = chase_symlinks (tmp_pathspec);
-  LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
-                         actual_cwrapper_path));
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+                 actual_cwrapper_path);
   XFREE (tmp_pathspec);
 
-  actual_cwrapper_name = xstrdupbase_name (actual_cwrapper_path));
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
   strendzap (actual_cwrapper_path, actual_cwrapper_name);
 
   /* wrapper name transforms */
@@ -3427,8 +4451,9 @@ EOF
   target_name = tmp_pathspec;
   tmp_pathspec = 0;
 
-  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
-                         target_name));
+  lt_debugprintf (__FILE__, __LINE__,
+                 "(main) libtool target name: %s\n",
+                 target_name);
 EOF
 
            cat <<EOF
@@ -3478,80 +4503,19 @@ EOF
 
   lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
   lt_setenv ("DUALCASE", "1");  /* for MSK sh */
-  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
   lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
 
-  newargc=0;
-  for (i = 1; i < argc; i++)
-    {
-      if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
-        {
-          if (argv[i][env_set_opt_len] == '=')
-            {
-              const char *p = argv[i] + env_set_opt_len + 1;
-              lt_opt_process_env_set (p);
-            }
-          else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
-            {
-              lt_opt_process_env_set (argv[++i]); /* don't copy */
-            }
-          else
-            lt_fatal ("%s missing required argument", env_set_opt);
-          continue;
-        }
-      if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
-        {
-          if (argv[i][env_prepend_opt_len] == '=')
-            {
-              const char *p = argv[i] + env_prepend_opt_len + 1;
-              lt_opt_process_env_prepend (p);
-            }
-          else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
-            {
-              lt_opt_process_env_prepend (argv[++i]); /* don't copy */
-            }
-          else
-            lt_fatal ("%s missing required argument", env_prepend_opt);
-          continue;
-        }
-      if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
-        {
-          if (argv[i][env_append_opt_len] == '=')
-            {
-              const char *p = argv[i] + env_append_opt_len + 1;
-              lt_opt_process_env_append (p);
-            }
-          else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
-            {
-              lt_opt_process_env_append (argv[++i]); /* don't copy */
-            }
-          else
-            lt_fatal ("%s missing required argument", env_append_opt);
-          continue;
-        }
-      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
-        {
-          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
-             namespace, but it is not one of the ones we know about and
-             have already dealt with, above (inluding dump-script), then
-             report an error. Otherwise, targets might begin to believe
-             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
-             namespace. The first time any user complains about this, we'll
-             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
-             or a configure.ac-settable value.
-           */
-          lt_fatal ("Unrecognized option in %s namespace: '%s'",
-                    ltwrapper_option_prefix, argv[i]);
-        }
-      /* otherwise ... */
-      newargz[++newargc] = xstrdup (argv[i]);
-    }
-  newargz[++newargc] = NULL;
-
-  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+                 nonnull (lt_argv_zero));
   for (i = 0; i < newargc; i++)
     {
-      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+                     i, nonnull (newargz[i]));
     }
 
 EOF
@@ -3560,11 +4524,14 @@ EOF
              mingw*)
                cat <<"EOF"
   /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
   rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
   if (rval == -1)
     {
       /* failed to start process */
-      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
+      lt_debugprintf (__FILE__, __LINE__,
+                     "(main) failed to launch target \"%s\": %s\n",
+                     lt_argv_zero, nonnull (strerror (errno)));
       return 127;
     }
   return rval;
@@ -3586,7 +4553,7 @@ xmalloc (size_t num)
 {
   void *p = (void *) malloc (num);
   if (!p)
-    lt_fatal ("Memory exhausted");
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
 
   return p;
 }
@@ -3620,8 +4587,8 @@ check_executable (const char *path)
 {
   struct stat st;
 
-  LTWRAPPER_DEBUGPRINTF (("(check_executable)  : %s\n",
-                         path ? (*path ? path : "EMPTY!") : "NULL!"));
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
   if ((!path) || (!*path))
     return 0;
 
@@ -3638,8 +4605,8 @@ make_executable (const char *path)
   int rval = 0;
   struct stat st;
 
-  LTWRAPPER_DEBUGPRINTF (("(make_executable)   : %s\n",
-                         path ? (*path ? path : "EMPTY!") : "NULL!"));
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
   if ((!path) || (!*path))
     return 0;
 
@@ -3665,8 +4632,8 @@ find_executable (const char *wrapper)
   int tmp_len;
   char *concat_name;
 
-  LTWRAPPER_DEBUGPRINTF (("(find_executable)   : %s\n",
-                         wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
 
   if ((wrapper == NULL) || (*wrapper == '\0'))
     return NULL;
@@ -3719,7 +4686,8 @@ find_executable (const char *wrapper)
                {
                  /* empty path: current directory */
                  if (getcwd (tmp, LT_PATHMAX) == NULL)
-                   lt_fatal ("getcwd failed");
+                   lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
                  tmp_len = strlen (tmp);
                  concat_name =
                    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
@@ -3744,7 +4712,8 @@ find_executable (const char *wrapper)
     }
   /* Relative path | not found in path: prepend cwd */
   if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal ("getcwd failed");
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
   tmp_len = strlen (tmp);
   concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
   memcpy (concat_name, tmp, tmp_len);
@@ -3770,8 +4739,9 @@ chase_symlinks (const char *pathspec)
   int has_symlinks = 0;
   while (strlen (tmp_pathspec) && !has_symlinks)
     {
-      LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
-                             tmp_pathspec));
+      lt_debugprintf (__FILE__, __LINE__,
+                     "checking path component for symlinks: %s\n",
+                     tmp_pathspec);
       if (lstat (tmp_pathspec, &s) == 0)
        {
          if (S_ISLNK (s.st_mode) != 0)
@@ -3793,8 +4763,9 @@ chase_symlinks (const char *pathspec)
        }
       else
        {
-         char *errstr = strerror (errno);
-         lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
+         lt_fatal (__FILE__, __LINE__,
+                   "error accessing file \"%s\": %s",
+                   tmp_pathspec, nonnull (strerror (errno)));
        }
     }
   XFREE (tmp_pathspec);
@@ -3807,7 +4778,8 @@ chase_symlinks (const char *pathspec)
   tmp_pathspec = realpath (pathspec, buf);
   if (tmp_pathspec == 0)
     {
-      lt_fatal ("Could not follow symlinks for %s", pathspec);
+      lt_fatal (__FILE__, __LINE__,
+               "could not follow symlinks for %s", pathspec);
     }
   return xstrdup (tmp_pathspec);
 #endif
@@ -3833,11 +4805,25 @@ strendzap (char *str, const char *pat)
   return str;
 }
 
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
 static void
-lt_error_core (int exit_status, const char *mode,
+lt_error_core (int exit_status, const char *file,
+              int line, const char *mode,
               const char *message, va_list ap)
 {
-  fprintf (stderr, "%s: %s: ", program_name, mode);
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
   vfprintf (stderr, message, ap);
   fprintf (stderr, ".\n");
 
@@ -3846,20 +4832,32 @@ lt_error_core (int exit_status, const char *mode,
 }
 
 void
-lt_fatal (const char *message, ...)
+lt_fatal (const char *file, int line, const char *message, ...)
 {
   va_list ap;
   va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
   va_end (ap);
 }
 
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
 void
 lt_setenv (const char *name, const char *value)
 {
-  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
+  lt_debugprintf (__FILE__, __LINE__,
+                 "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
   {
 #ifdef HAVE_SETENV
     /* always make a copy, for consistency with !HAVE_SETENV */
@@ -3904,95 +4902,12 @@ lt_extend_str (const char *orig_value, const char *add, int to_end)
   return new_value;
 }
 
-int
-lt_split_name_value (const char *arg, char** name, char** value)
-{
-  const char *p;
-  int len;
-  if (!arg || !*arg)
-    return 1;
-
-  p = strchr (arg, (int)'=');
-
-  if (!p)
-    return 1;
-
-  *value = xstrdup (++p);
-
-  len = strlen (arg) - strlen (*value);
-  *name = XMALLOC (char, len);
-  strncpy (*name, arg, len-1);
-  (*name)[len - 1] = '\0';
-
-  return 0;
-}
-
-void
-lt_opt_process_env_set (const char *arg)
-{
-  char *name = NULL;
-  char *value = NULL;
-
-  if (lt_split_name_value (arg, &name, &value) != 0)
-    {
-      XFREE (name);
-      XFREE (value);
-      lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
-    }
-
-  lt_setenv (name, value);
-  XFREE (name);
-  XFREE (value);
-}
-
-void
-lt_opt_process_env_prepend (const char *arg)
-{
-  char *name = NULL;
-  char *value = NULL;
-  char *new_value = NULL;
-
-  if (lt_split_name_value (arg, &name, &value) != 0)
-    {
-      XFREE (name);
-      XFREE (value);
-      lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
-    }
-
-  new_value = lt_extend_str (getenv (name), value, 0);
-  lt_setenv (name, new_value);
-  XFREE (new_value);
-  XFREE (name);
-  XFREE (value);
-}
-
-void
-lt_opt_process_env_append (const char *arg)
-{
-  char *name = NULL;
-  char *value = NULL;
-  char *new_value = NULL;
-
-  if (lt_split_name_value (arg, &name, &value) != 0)
-    {
-      XFREE (name);
-      XFREE (value);
-      lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
-    }
-
-  new_value = lt_extend_str (getenv (name), value, 1);
-  lt_setenv (name, new_value);
-  XFREE (new_value);
-  XFREE (name);
-  XFREE (value);
-}
-
 void
 lt_update_exe_path (const char *name, const char *value)
 {
-  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
+  lt_debugprintf (__FILE__, __LINE__,
+                 "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
 
   if (name && *name && value && *value)
     {
@@ -4011,9 +4926,9 @@ lt_update_exe_path (const char *name, const char *value)
 void
 lt_update_lib_path (const char *name, const char *value)
 {
-  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
+  lt_debugprintf (__FILE__, __LINE__,
+                 "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
 
   if (name && *name && value && *value)
     {
@@ -4023,11 +4938,158 @@ lt_update_lib_path (const char *name, const char *value)
     }
 }
 
+EOF
+           case $host_os in
+             mingw*)
+               cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+       new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+       {
+         int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+         size_t length;
+         unsigned int backslashes;
+         const char *s;
+         char *quoted_string;
+         char *p;
+
+         length = 0;
+         backslashes = 0;
+         if (quote_around)
+           length++;
+         for (s = string; *s != '\0'; s++)
+           {
+             char c = *s;
+             if (c == '"')
+               length += backslashes + 1;
+             length++;
+             if (c == '\\')
+               backslashes++;
+             else
+               backslashes = 0;
+           }
+         if (quote_around)
+           length += backslashes + 1;
+
+         quoted_string = XMALLOC (char, length + 1);
+
+         p = quoted_string;
+         backslashes = 0;
+         if (quote_around)
+           *p++ = '"';
+         for (s = string; *s != '\0'; s++)
+           {
+             char c = *s;
+             if (c == '"')
+               {
+                 unsigned int j;
+                 for (j = backslashes + 1; j > 0; j--)
+                   *p++ = '\\';
+               }
+             *p++ = c;
+             if (c == '\\')
+               backslashes++;
+             else
+               backslashes = 0;
+           }
+         if (quote_around)
+           {
+             unsigned int j;
+             for (j = backslashes; j > 0; j--)
+               *p++ = '\\';
+             *p++ = '"';
+           }
+         *p = '\0';
+
+         new_argv[i] = quoted_string;
+       }
+      else
+       new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+               ;;
+           esac
 
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+           func_emit_wrapper yes |
+             $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
 EOF
 }
 # end: func_emit_cwrapperexe_src
 
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $opt_debug
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
 # func_mode_link arg...
 func_mode_link ()
 {
@@ -4072,6 +5134,7 @@ func_mode_link ()
     new_inherited_linker_flags=
 
     avoid_version=no
+    bindir=
     dlfiles=
     dlprefiles=
     dlself=no
@@ -4164,6 +5227,11 @@ func_mode_link ()
        esac
 
        case $prev in
+       bindir)
+         bindir="$arg"
+         prev=
+         continue
+         ;;
        dlfiles|dlprefiles)
          if test "$preload" = no; then
            # Add the symbol object into the linking commands.
@@ -4195,9 +5263,9 @@ func_mode_link ()
            ;;
          *)
            if test "$prev" = dlfiles; then
-             dlfiles="$dlfiles $arg"
+             func_append dlfiles " $arg"
            else
-             dlprefiles="$dlprefiles $arg"
+             func_append dlprefiles " $arg"
            fi
            prev=
            continue
@@ -4221,7 +5289,7 @@ func_mode_link ()
            *-*-darwin*)
              case "$deplibs " in
                *" $qarg.ltframework "*) ;;
-               *) deplibs="$deplibs $qarg.ltframework" # this is fixed later
+               *) func_append deplibs " $qarg.ltframework" # this is fixed later
                   ;;
              esac
              ;;
@@ -4240,7 +5308,7 @@ func_mode_link ()
            moreargs=
            for fil in `cat "$save_arg"`
            do
-#            moreargs="$moreargs $fil"
+#            func_append moreargs " $fil"
              arg=$fil
              # A libtool-controlled object.
 
@@ -4269,7 +5337,7 @@ func_mode_link ()
 
                  if test "$prev" = dlfiles; then
                    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-                     dlfiles="$dlfiles $pic_object"
+                     func_append dlfiles " $pic_object"
                      prev=
                      continue
                    else
@@ -4281,7 +5349,7 @@ func_mode_link ()
                  # CHECK ME:  I think I busted this.  -Ossama
                  if test "$prev" = dlprefiles; then
                    # Preload the old-style object.
-                   dlprefiles="$dlprefiles $pic_object"
+                   func_append dlprefiles " $pic_object"
                    prev=
                  fi
 
@@ -4351,12 +5419,12 @@ func_mode_link ()
          if test "$prev" = rpath; then
            case "$rpath " in
            *" $arg "*) ;;
-           *) rpath="$rpath $arg" ;;
+           *) func_append rpath " $arg" ;;
            esac
          else
            case "$xrpath " in
            *" $arg "*) ;;
-           *) xrpath="$xrpath $arg" ;;
+           *) func_append xrpath " $arg" ;;
            esac
          fi
          prev=
@@ -4368,28 +5436,28 @@ func_mode_link ()
          continue
          ;;
        weak)
-         weak_libs="$weak_libs $arg"
+         func_append weak_libs " $arg"
          prev=
          continue
          ;;
        xcclinker)
-         linker_flags="$linker_flags $qarg"
-         compiler_flags="$compiler_flags $qarg"
+         func_append linker_flags " $qarg"
+         func_append compiler_flags " $qarg"
          prev=
          func_append compile_command " $qarg"
          func_append finalize_command " $qarg"
          continue
          ;;
        xcompiler)
-         compiler_flags="$compiler_flags $qarg"
+         func_append compiler_flags " $qarg"
          prev=
          func_append compile_command " $qarg"
          func_append finalize_command " $qarg"
          continue
          ;;
        xlinker)
-         linker_flags="$linker_flags $qarg"
-         compiler_flags="$compiler_flags $wl$qarg"
+         func_append linker_flags " $qarg"
+         func_append compiler_flags " $wl$qarg"
          prev=
          func_append compile_command " $wl$qarg"
          func_append finalize_command " $wl$qarg"
@@ -4425,6 +5493,11 @@ func_mode_link ()
        continue
        ;;
 
+      -bindir)
+       prev=bindir
+       continue
+       ;;
+
       -dlopen)
        prev=dlfiles
        continue
@@ -4475,15 +5548,16 @@ func_mode_link ()
        ;;
 
       -L*)
-       func_stripname '-L' '' "$arg"
-       dir=$func_stripname_result
-       if test -z "$dir"; then
+       func_stripname "-L" '' "$arg"
+       if test -z "$func_stripname_result"; then
          if test "$#" -gt 0; then
            func_fatal_error "require no space between \`-L' and \`$1'"
          else
            func_fatal_error "need path for \`-L' option"
          fi
        fi
+       func_resolve_sysroot "$func_stripname_result"
+       dir=$func_resolve_sysroot_result
        # We need an absolute path.
        case $dir in
        [\\/]* | [A-Za-z]:[\\/]*) ;;
@@ -4495,24 +5569,30 @@ func_mode_link ()
          ;;
        esac
        case "$deplibs " in
-       *" -L$dir "*) ;;
+       *" -L$dir "* | *" $arg "*)
+         # Will only happen for absolute or sysroot arguments
+         ;;
        *)
-         deplibs="$deplibs -L$dir"
-         lib_search_path="$lib_search_path $dir"
+         # Preserve sysroot, but never include relative directories
+         case $dir in
+           [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+           *) func_append deplibs " -L$dir" ;;
+         esac
+         func_append lib_search_path " $dir"
          ;;
        esac
        case $host in
        *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-         testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+         testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
          case :$dllsearchpath: in
          *":$dir:"*) ;;
          ::) dllsearchpath=$dir;;
-         *) dllsearchpath="$dllsearchpath:$dir";;
+         *) func_append dllsearchpath ":$dir";;
          esac
          case :$dllsearchpath: in
          *":$testbindir:"*) ;;
          ::) dllsearchpath=$testbindir;;
-         *) dllsearchpath="$dllsearchpath:$testbindir";;
+         *) func_append dllsearchpath ":$testbindir";;
          esac
          ;;
        esac
@@ -4522,7 +5602,7 @@ func_mode_link ()
       -l*)
        if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
          case $host in
-         *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
+         *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
            # These systems don't actually have a C or math library (as such)
            continue
            ;;
@@ -4536,7 +5616,7 @@ func_mode_link ()
            ;;
          *-*-rhapsody* | *-*-darwin1.[012])
            # Rhapsody C and math libraries are in the System framework
-           deplibs="$deplibs System.ltframework"
+           func_append deplibs " System.ltframework"
            continue
            ;;
          *-*-sco3.2v5* | *-*-sco5v6*)
@@ -4556,7 +5636,7 @@ func_mode_link ()
           ;;
         esac
        fi
-       deplibs="$deplibs $arg"
+       func_append deplibs " $arg"
        continue
        ;;
 
@@ -4568,21 +5648,22 @@ func_mode_link ()
       # Tru64 UNIX uses -model [arg] to determine the layout of C++
       # classes, name mangling, and exception handling.
       # Darwin uses the -arch flag to determine output architecture.
-      -model|-arch|-isysroot)
-       compiler_flags="$compiler_flags $arg"
+      -model|-arch|-isysroot|--sysroot)
+       func_append compiler_flags " $arg"
        func_append compile_command " $arg"
        func_append finalize_command " $arg"
        prev=xcompiler
        continue
        ;;
 
-      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-       compiler_flags="$compiler_flags $arg"
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+       func_append compiler_flags " $arg"
        func_append compile_command " $arg"
        func_append finalize_command " $arg"
        case "$new_inherited_linker_flags " in
            *" $arg "*) ;;
-           * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
+           * ) func_append new_inherited_linker_flags " $arg" ;;
        esac
        continue
        ;;
@@ -4649,13 +5730,17 @@ func_mode_link ()
        # We need an absolute path.
        case $dir in
        [\\/]* | [A-Za-z]:[\\/]*) ;;
+       =*)
+         func_stripname '=' '' "$dir"
+         dir=$lt_sysroot$func_stripname_result
+         ;;
        *)
          func_fatal_error "only absolute run-paths are allowed"
          ;;
        esac
        case "$xrpath " in
        *" $dir "*) ;;
-       *) xrpath="$xrpath $dir" ;;
+       *) func_append xrpath " $dir" ;;
        esac
        continue
        ;;
@@ -4708,8 +5793,8 @@ func_mode_link ()
        for flag in $args; do
          IFS="$save_ifs"
           func_quote_for_eval "$flag"
-         arg="$arg $wl$func_quote_for_eval_result"
-         compiler_flags="$compiler_flags $func_quote_for_eval_result"
+         func_append arg " $func_quote_for_eval_result"
+         func_append compiler_flags " $func_quote_for_eval_result"
        done
        IFS="$save_ifs"
        func_stripname ' ' '' "$arg"
@@ -4724,9 +5809,9 @@ func_mode_link ()
        for flag in $args; do
          IFS="$save_ifs"
           func_quote_for_eval "$flag"
-         arg="$arg $wl$func_quote_for_eval_result"
-         compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
-         linker_flags="$linker_flags $func_quote_for_eval_result"
+         func_append arg " $wl$func_quote_for_eval_result"
+         func_append compiler_flags " $wl$func_quote_for_eval_result"
+         func_append linker_flags " $func_quote_for_eval_result"
        done
        IFS="$save_ifs"
        func_stripname ' ' '' "$arg"
@@ -4754,23 +5839,27 @@ func_mode_link ()
        arg="$func_quote_for_eval_result"
        ;;
 
-      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
-      # -r[0-9][0-9]* specifies the processor on the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
-      # +DA*, +DD* enable 64-bit mode on the HP compiler
-      # -q* pass through compiler args for the IBM compiler
-      # -m*, -t[45]*, -txscale* pass through architecture-specific
-      # compiler args for GCC
-      # -F/path gives path to uninstalled frameworks, gcc on darwin
-      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
-      # @file GCC response files
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
       -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
         func_quote_for_eval "$arg"
        arg="$func_quote_for_eval_result"
         func_append compile_command " $arg"
         func_append finalize_command " $arg"
-        compiler_flags="$compiler_flags $arg"
+        func_append compiler_flags " $arg"
         continue
         ;;
 
@@ -4782,7 +5871,7 @@ func_mode_link ()
 
       *.$objext)
        # A standard object.
-       objs="$objs $arg"
+       func_append objs " $arg"
        ;;
 
       *.lo)
@@ -4813,7 +5902,7 @@ func_mode_link ()
 
            if test "$prev" = dlfiles; then
              if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-               dlfiles="$dlfiles $pic_object"
+               func_append dlfiles " $pic_object"
                prev=
                continue
              else
@@ -4825,7 +5914,7 @@ func_mode_link ()
            # CHECK ME:  I think I busted this.  -Ossama
            if test "$prev" = dlprefiles; then
              # Preload the old-style object.
-             dlprefiles="$dlprefiles $pic_object"
+             func_append dlprefiles " $pic_object"
              prev=
            fi
 
@@ -4870,24 +5959,25 @@ func_mode_link ()
 
       *.$libext)
        # An archive.
-       deplibs="$deplibs $arg"
-       old_deplibs="$old_deplibs $arg"
+       func_append deplibs " $arg"
+       func_append old_deplibs " $arg"
        continue
        ;;
 
       *.la)
        # A libtool-controlled library.
 
+       func_resolve_sysroot "$arg"
        if test "$prev" = dlfiles; then
          # This library was specified with -dlopen.
-         dlfiles="$dlfiles $arg"
+         func_append dlfiles " $func_resolve_sysroot_result"
          prev=
        elif test "$prev" = dlprefiles; then
          # The library was specified with -dlpreopen.
-         dlprefiles="$dlprefiles $arg"
+         func_append dlprefiles " $func_resolve_sysroot_result"
          prev=
        else
-         deplibs="$deplibs $arg"
+         func_append deplibs " $func_resolve_sysroot_result"
        fi
        continue
        ;;
@@ -4925,7 +6015,7 @@ func_mode_link ()
 
     if test -n "$shlibpath_var"; then
       # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
     else
       shlib_search_path=
     fi
@@ -4934,6 +6024,8 @@ func_mode_link ()
 
     func_dirname "$output" "/" ""
     output_objdir="$func_dirname_result$objdir"
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
     # Create the object directory.
     func_mkdir_p "$output_objdir"
 
@@ -4954,12 +6046,12 @@ func_mode_link ()
     # Find all interdependent deplibs by searching for libraries
     # that are linked more than once (e.g. -la -lb -la)
     for deplib in $deplibs; do
-      if $opt_duplicate_deps ; then
+      if $opt_preserve_dup_deps ; then
        case "$libs " in
-       *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+       *" $deplib "*) func_append specialdeplibs " $deplib" ;;
        esac
       fi
-      libs="$libs $deplib"
+      func_append libs " $deplib"
     done
 
     if test "$linkmode" = lib; then
@@ -4972,9 +6064,9 @@ func_mode_link ()
       if $opt_duplicate_compiler_generated_deps; then
        for pre_post_dep in $predeps $postdeps; do
          case "$pre_post_deps " in
-         *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+         *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
          esac
-         pre_post_deps="$pre_post_deps $pre_post_dep"
+         func_append pre_post_deps " $pre_post_dep"
        done
       fi
       pre_post_deps=
@@ -5041,17 +6133,19 @@ func_mode_link ()
        for lib in $dlprefiles; do
          # Ignore non-libtool-libs
          dependency_libs=
+         func_resolve_sysroot "$lib"
          case $lib in
-         *.la) func_source "$lib" ;;
+         *.la) func_source "$func_resolve_sysroot_result" ;;
          esac
 
          # Collect preopened libtool deplibs, except any this library
          # has declared as weak libs
          for deplib in $dependency_libs; do
-            deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
+           func_basename "$deplib"
+            deplib_base=$func_basename_result
            case " $weak_libs " in
            *" $deplib_base "*) ;;
-           *) deplibs="$deplibs $deplib" ;;
+           *) func_append deplibs " $deplib" ;;
            esac
          done
        done
@@ -5067,16 +6161,17 @@ func_mode_link ()
        lib=
        found=no
        case $deplib in
-       -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+       -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
          if test "$linkmode,$pass" = "prog,link"; then
            compile_deplibs="$deplib $compile_deplibs"
            finalize_deplibs="$deplib $finalize_deplibs"
          else
-           compiler_flags="$compiler_flags $deplib"
+           func_append compiler_flags " $deplib"
            if test "$linkmode" = lib ; then
                case "$new_inherited_linker_flags " in
                    *" $deplib "*) ;;
-                   * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+                   * ) func_append new_inherited_linker_flags " $deplib" ;;
                esac
            fi
          fi
@@ -5161,7 +6256,7 @@ func_mode_link ()
            if test "$linkmode" = lib ; then
                case "$new_inherited_linker_flags " in
                    *" $deplib "*) ;;
-                   * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+                   * ) func_append new_inherited_linker_flags " $deplib" ;;
                esac
            fi
          fi
@@ -5174,7 +6269,8 @@ func_mode_link ()
            test "$pass" = conv && continue
            newdependency_libs="$deplib $newdependency_libs"
            func_stripname '-L' '' "$deplib"
-           newlib_search_path="$newlib_search_path $func_stripname_result"
+           func_resolve_sysroot "$func_stripname_result"
+           func_append newlib_search_path " $func_resolve_sysroot_result"
            ;;
          prog)
            if test "$pass" = conv; then
@@ -5188,7 +6284,8 @@ func_mode_link ()
              finalize_deplibs="$deplib $finalize_deplibs"
            fi
            func_stripname '-L' '' "$deplib"
-           newlib_search_path="$newlib_search_path $func_stripname_result"
+           func_resolve_sysroot "$func_stripname_result"
+           func_append newlib_search_path " $func_resolve_sysroot_result"
            ;;
          *)
            func_warning "\`-L' is ignored for archives/objects"
@@ -5199,17 +6296,21 @@ func_mode_link ()
        -R*)
          if test "$pass" = link; then
            func_stripname '-R' '' "$deplib"
-           dir=$func_stripname_result
+           func_resolve_sysroot "$func_stripname_result"
+           dir=$func_resolve_sysroot_result
            # Make sure the xrpath contains only unique directories.
            case "$xrpath " in
            *" $dir "*) ;;
-           *) xrpath="$xrpath $dir" ;;
+           *) func_append xrpath " $dir" ;;
            esac
          fi
          deplibs="$deplib $deplibs"
          continue
          ;;
-       *.la) lib="$deplib" ;;
+       *.la)
+         func_resolve_sysroot "$deplib"
+         lib=$func_resolve_sysroot_result
+         ;;
        *.$libext)
          if test "$pass" = conv; then
            deplibs="$deplib $deplibs"
@@ -5227,7 +6328,7 @@ func_mode_link ()
                match_pattern*)
                  set dummy $deplibs_check_method; shift
                  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-                 if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \
+                 if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
                    | $EGREP "$match_pattern_regex" > /dev/null; then
                    valid_a_lib=yes
                  fi
@@ -5237,15 +6338,15 @@ func_mode_link ()
                ;;
              esac
              if test "$valid_a_lib" != yes; then
-               $ECHO
+               echo
                $ECHO "*** Warning: Trying to link with static lib archive $deplib."
-               $ECHO "*** I have the capability to make that library automatically link in when"
-               $ECHO "*** you link to this library.  But I can only do this if you have a"
-               $ECHO "*** shared version of the library, which you do not appear to have"
-               $ECHO "*** because the file extensions .$libext of this argument makes me believe"
-               $ECHO "*** that it is just a static archive that I should not use here."
+               echo "*** I have the capability to make that library automatically link in when"
+               echo "*** you link to this library.  But I can only do this if you have a"
+               echo "*** shared version of the library, which you do not appear to have"
+               echo "*** because the file extensions .$libext of this argument makes me believe"
+               echo "*** that it is just a static archive that I should not use here."
              else
-               $ECHO
+               echo
                $ECHO "*** Warning: Linking the shared library $output against the"
                $ECHO "*** static library $deplib is not portable!"
                deplibs="$deplib $deplibs"
@@ -5272,11 +6373,11 @@ func_mode_link ()
            if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
              # If there is no dlopen support or we're linking statically,
              # we need to preload.
-             newdlprefiles="$newdlprefiles $deplib"
+             func_append newdlprefiles " $deplib"
              compile_deplibs="$deplib $compile_deplibs"
              finalize_deplibs="$deplib $finalize_deplibs"
            else
-             newdlfiles="$newdlfiles $deplib"
+             func_append newdlfiles " $deplib"
            fi
          fi
          continue
@@ -5318,20 +6419,20 @@ func_mode_link ()
 
        # Convert "-framework foo" to "foo.ltframework"
        if test -n "$inherited_linker_flags"; then
-         tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'`
+         tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
          for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
            case " $new_inherited_linker_flags " in
              *" $tmp_inherited_linker_flag "*) ;;
-             *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
+             *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
            esac
          done
        fi
-       dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+       dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
        if test "$linkmode,$pass" = "lib,link" ||
           test "$linkmode,$pass" = "prog,scan" ||
           { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-         test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
-         test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+         test -n "$dlopen" && func_append dlfiles " $dlopen"
+         test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
        fi
 
        if test "$pass" = conv; then
@@ -5342,20 +6443,20 @@ func_mode_link ()
              func_fatal_error "cannot find name of link library for \`$lib'"
            fi
            # It is a libtool convenience library, so add in its objects.
-           convenience="$convenience $ladir/$objdir/$old_library"
-           old_convenience="$old_convenience $ladir/$objdir/$old_library"
+           func_append convenience " $ladir/$objdir/$old_library"
+           func_append old_convenience " $ladir/$objdir/$old_library"
          elif test "$linkmode" != prog && test "$linkmode" != lib; then
            func_fatal_error "\`$lib' is not a convenience library"
          fi
          tmp_libs=
          for deplib in $dependency_libs; do
            deplibs="$deplib $deplibs"
-           if $opt_duplicate_deps ; then
+           if $opt_preserve_dup_deps ; then
              case "$tmp_libs " in
-             *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+             *" $deplib "*) func_append specialdeplibs " $deplib" ;;
              esac
            fi
-           tmp_libs="$tmp_libs $deplib"
+           func_append tmp_libs " $deplib"
          done
          continue
        fi # $pass = conv
@@ -5363,9 +6464,15 @@ func_mode_link ()
 
        # Get the name of the library we link against.
        linklib=
-       for l in $old_library $library_names; do
-         linklib="$l"
-       done
+       if test -n "$old_library" &&
+          { test "$prefer_static_libs" = yes ||
+            test "$prefer_static_libs,$installed" = "built,no"; }; then
+         linklib=$old_library
+       else
+         for l in $old_library $library_names; do
+           linklib="$l"
+         done
+       fi
        if test -z "$linklib"; then
          func_fatal_error "cannot find name of link library for \`$lib'"
        fi
@@ -5382,9 +6489,9 @@ func_mode_link ()
            # statically, we need to preload.  We also need to preload any
            # dependent libraries so libltdl's deplib preloader doesn't
            # bomb out in the load deplibs phase.
-           dlprefiles="$dlprefiles $lib $dependency_libs"
+           func_append dlprefiles " $lib $dependency_libs"
          else
-           newdlfiles="$newdlfiles $lib"
+           func_append newdlfiles " $lib"
          fi
          continue
        fi # $pass = dlopen
@@ -5406,14 +6513,14 @@ func_mode_link ()
 
        # Find the relevant object directory and library name.
        if test "X$installed" = Xyes; then
-         if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+         if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
            func_warning "library \`$lib' was moved."
            dir="$ladir"
            absdir="$abs_ladir"
            libdir="$abs_ladir"
          else
-           dir="$libdir"
-           absdir="$libdir"
+           dir="$lt_sysroot$libdir"
+           absdir="$lt_sysroot$libdir"
          fi
          test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
        else
@@ -5421,12 +6528,12 @@ func_mode_link ()
            dir="$ladir"
            absdir="$abs_ladir"
            # Remove this search path later
-           notinst_path="$notinst_path $abs_ladir"
+           func_append notinst_path " $abs_ladir"
          else
            dir="$ladir/$objdir"
            absdir="$abs_ladir/$objdir"
            # Remove this search path later
-           notinst_path="$notinst_path $abs_ladir"
+           func_append notinst_path " $abs_ladir"
          fi
        fi # $installed = yes
        func_stripname 'lib' '.la' "$laname"
@@ -5437,20 +6544,46 @@ func_mode_link ()
          if test -z "$libdir" && test "$linkmode" = prog; then
            func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
          fi
-         # Prefer using a static library (so that no silly _DYNAMIC symbols
-         # are required to link).
-         if test -n "$old_library"; then
-           newdlprefiles="$newdlprefiles $dir/$old_library"
-           # Keep a list of preopened convenience libraries to check
-           # that they are being used correctly in the link pass.
-           test -z "$libdir" && \
-               dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
-         # Otherwise, use the dlname, so that lt_dlopen finds it.
-         elif test -n "$dlname"; then
-           newdlprefiles="$newdlprefiles $dir/$dlname"
-         else
-           newdlprefiles="$newdlprefiles $dir/$linklib"
-         fi
+         case "$host" in
+           # special handling for platforms with PE-DLLs.
+           *cygwin* | *mingw* | *cegcc* )
+             # Linker will automatically link against shared library if both
+             # static and shared are present.  Therefore, ensure we extract
+             # symbols from the import library if a shared library is present
+             # (otherwise, the dlopen module name will be incorrect).  We do
+             # this by putting the import library name into $newdlprefiles.
+             # We recover the dlopen module name by 'saving' the la file
+             # name in a special purpose variable, and (later) extracting the
+             # dlname from the la file.
+             if test -n "$dlname"; then
+               func_tr_sh "$dir/$linklib"
+               eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+               func_append newdlprefiles " $dir/$linklib"
+             else
+               func_append newdlprefiles " $dir/$old_library"
+               # Keep a list of preopened convenience libraries to check
+               # that they are being used correctly in the link pass.
+               test -z "$libdir" && \
+                 func_append dlpreconveniencelibs " $dir/$old_library"
+             fi
+           ;;
+           * )
+             # Prefer using a static library (so that no silly _DYNAMIC symbols
+             # are required to link).
+             if test -n "$old_library"; then
+               func_append newdlprefiles " $dir/$old_library"
+               # Keep a list of preopened convenience libraries to check
+               # that they are being used correctly in the link pass.
+               test -z "$libdir" && \
+                 func_append dlpreconveniencelibs " $dir/$old_library"
+             # Otherwise, use the dlname, so that lt_dlopen finds it.
+             elif test -n "$dlname"; then
+               func_append newdlprefiles " $dir/$dlname"
+             else
+               func_append newdlprefiles " $dir/$linklib"
+             fi
+           ;;
+         esac
        fi # $pass = dlpreopen
 
        if test -z "$libdir"; then
@@ -5468,7 +6601,7 @@ func_mode_link ()
 
 
        if test "$linkmode" = prog && test "$pass" != link; then
-         newlib_search_path="$newlib_search_path $ladir"
+         func_append newlib_search_path " $ladir"
          deplibs="$lib $deplibs"
 
          linkalldeplibs=no
@@ -5481,7 +6614,8 @@ func_mode_link ()
          for deplib in $dependency_libs; do
            case $deplib in
            -L*) func_stripname '-L' '' "$deplib"
-                newlib_search_path="$newlib_search_path $func_stripname_result"
+                func_resolve_sysroot "$func_stripname_result"
+                func_append newlib_search_path " $func_resolve_sysroot_result"
                 ;;
            esac
            # Need to link against all dependency_libs?
@@ -5492,12 +6626,12 @@ func_mode_link ()
              # or/and link against static libraries
              newdependency_libs="$deplib $newdependency_libs"
            fi
-           if $opt_duplicate_deps ; then
+           if $opt_preserve_dup_deps ; then
              case "$tmp_libs " in
-             *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+             *" $deplib "*) func_append specialdeplibs " $deplib" ;;
              esac
            fi
-           tmp_libs="$tmp_libs $deplib"
+           func_append tmp_libs " $deplib"
          done # for deplib
          continue
        fi # $linkmode = prog...
@@ -5512,7 +6646,7 @@ func_mode_link ()
              # Make sure the rpath contains only unique directories.
              case "$temp_rpath:" in
              *"$absdir:"*) ;;
-             *) temp_rpath="$temp_rpath$absdir:" ;;
+             *) func_append temp_rpath "$absdir:" ;;
              esac
            fi
 
@@ -5524,7 +6658,7 @@ func_mode_link ()
            *)
              case "$compile_rpath " in
              *" $absdir "*) ;;
-             *) compile_rpath="$compile_rpath $absdir"
+             *) func_append compile_rpath " $absdir" ;;
              esac
              ;;
            esac
@@ -5533,7 +6667,7 @@ func_mode_link ()
            *)
              case "$finalize_rpath " in
              *" $libdir "*) ;;
-             *) finalize_rpath="$finalize_rpath $libdir"
+             *) func_append finalize_rpath " $libdir" ;;
              esac
              ;;
            esac
@@ -5558,12 +6692,12 @@ func_mode_link ()
          case $host in
          *cygwin* | *mingw* | *cegcc*)
              # No point in relinking DLLs because paths are not encoded
-             notinst_deplibs="$notinst_deplibs $lib"
+             func_append notinst_deplibs " $lib"
              need_relink=no
            ;;
          *)
            if test "$installed" = no; then
-             notinst_deplibs="$notinst_deplibs $lib"
+             func_append notinst_deplibs " $lib"
              need_relink=yes
            fi
            ;;
@@ -5580,7 +6714,7 @@ func_mode_link ()
            fi
          done
          if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
-           $ECHO
+           echo
            if test "$linkmode" = prog; then
              $ECHO "*** Warning: Linking the executable $output against the loadable module"
            else
@@ -5598,7 +6732,7 @@ func_mode_link ()
            *)
              case "$compile_rpath " in
              *" $absdir "*) ;;
-             *) compile_rpath="$compile_rpath $absdir"
+             *) func_append compile_rpath " $absdir" ;;
              esac
              ;;
            esac
@@ -5607,7 +6741,7 @@ func_mode_link ()
            *)
              case "$finalize_rpath " in
              *" $libdir "*) ;;
-             *) finalize_rpath="$finalize_rpath $libdir"
+             *) func_append finalize_rpath " $libdir" ;;
              esac
              ;;
            esac
@@ -5661,7 +6795,7 @@ func_mode_link ()
            linklib=$newlib
          fi # test -n "$old_archive_from_expsyms_cmds"
 
-         if test "$linkmode" = prog || test "$mode" != relink; then
+         if test "$linkmode" = prog || test "$opt_mode" != relink; then
            add_shlibpath=
            add_dir=
            add=
@@ -5683,9 +6817,9 @@ func_mode_link ()
                      if test "X$dlopenmodule" != "X$lib"; then
                        $ECHO "*** Warning: lib $linklib is a module, not a shared library"
                        if test -z "$old_library" ; then
-                         $ECHO
-                         $ECHO "*** And there doesn't seem to be a static archive available"
-                         $ECHO "*** The link will probably fail, sorry"
+                         echo
+                         echo "*** And there doesn't seem to be a static archive available"
+                         echo "*** The link will probably fail, sorry"
                        else
                          add="$dir/$old_library"
                        fi
@@ -5712,12 +6846,12 @@ func_mode_link ()
                 test "$hardcode_direct_absolute" = no; then
                add="$dir/$linklib"
              elif test "$hardcode_minus_L" = yes; then
-               add_dir="-L$dir"
+               add_dir="-L$absdir"
                # Try looking first in the location we're being installed to.
                if test -n "$inst_prefix_dir"; then
                  case $libdir in
                    [\\/]*)
-                     add_dir="$add_dir -L$inst_prefix_dir$libdir"
+                     func_append add_dir " -L$inst_prefix_dir$libdir"
                      ;;
                  esac
                fi
@@ -5739,7 +6873,7 @@ func_mode_link ()
            if test -n "$add_shlibpath"; then
              case :$compile_shlibpath: in
              *":$add_shlibpath:"*) ;;
-             *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+             *) func_append compile_shlibpath "$add_shlibpath:" ;;
              esac
            fi
            if test "$linkmode" = prog; then
@@ -5753,27 +6887,31 @@ func_mode_link ()
                 test "$hardcode_shlibpath_var" = yes; then
                case :$finalize_shlibpath: in
                *":$libdir:"*) ;;
-               *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+               *) func_append finalize_shlibpath "$libdir:" ;;
                esac
              fi
            fi
          fi
 
-         if test "$linkmode" = prog || test "$mode" = relink; then
+         if test "$linkmode" = prog || test "$opt_mode" = relink; then
            add_shlibpath=
            add_dir=
            add=
            # Finalize command for both is simple: just hardcode it.
            if test "$hardcode_direct" = yes &&
               test "$hardcode_direct_absolute" = no; then
-             add="$libdir/$linklib"
+             if test -f "$inst_prefix_dir$libdir/$linklib"; then
+               add="$inst_prefix_dir$libdir/$linklib"
+             else
+               add="$libdir/$linklib"
+             fi
            elif test "$hardcode_minus_L" = yes; then
              add_dir="-L$libdir"
              add="-l$name"
            elif test "$hardcode_shlibpath_var" = yes; then
              case :$finalize_shlibpath: in
              *":$libdir:"*) ;;
-             *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+             *) func_append finalize_shlibpath "$libdir:" ;;
              esac
              add="-l$name"
            elif test "$hardcode_automatic" = yes; then
@@ -5790,7 +6928,7 @@ func_mode_link ()
              if test -n "$inst_prefix_dir"; then
                case $libdir in
                  [\\/]*)
-                   add_dir="$add_dir -L$inst_prefix_dir$libdir"
+                   func_append add_dir " -L$inst_prefix_dir$libdir"
                    ;;
                esac
              fi
@@ -5825,21 +6963,21 @@ func_mode_link ()
 
            # Just print a warning and add the library to dependency_libs so
            # that the program can be linked against the static library.
-           $ECHO
+           echo
            $ECHO "*** Warning: This system can not link to static lib archive $lib."
-           $ECHO "*** I have the capability to make that library automatically link in when"
-           $ECHO "*** you link to this library.  But I can only do this if you have a"
-           $ECHO "*** shared version of the library, which you do not appear to have."
+           echo "*** I have the capability to make that library automatically link in when"
+           echo "*** you link to this library.  But I can only do this if you have a"
+           echo "*** shared version of the library, which you do not appear to have."
            if test "$module" = yes; then
-             $ECHO "*** But as you try to build a module library, libtool will still create "
-             $ECHO "*** a static module, that should work as long as the dlopening application"
-             $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime."
+             echo "*** But as you try to build a module library, libtool will still create "
+             echo "*** a static module, that should work as long as the dlopening application"
+             echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
              if test -z "$global_symbol_pipe"; then
-               $ECHO
-               $ECHO "*** However, this would only work if libtool was able to extract symbol"
-               $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
-               $ECHO "*** not find such a program.  So, this module is probably useless."
-               $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+               echo
+               echo "*** However, this would only work if libtool was able to extract symbol"
+               echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+               echo "*** not find such a program.  So, this module is probably useless."
+               echo "*** \`nm' from GNU binutils and a full rebuild may help."
              fi
              if test "$build_old_libs" = no; then
                build_libtool_libs=module
@@ -5867,37 +7005,46 @@ func_mode_link ()
                   temp_xrpath=$func_stripname_result
                   case " $xrpath " in
                   *" $temp_xrpath "*) ;;
-                  *) xrpath="$xrpath $temp_xrpath";;
+                  *) func_append xrpath " $temp_xrpath";;
                   esac;;
-             *) temp_deplibs="$temp_deplibs $libdir";;
+             *) func_append temp_deplibs " $libdir";;
              esac
            done
            dependency_libs="$temp_deplibs"
          fi
 
-         newlib_search_path="$newlib_search_path $absdir"
+         func_append newlib_search_path " $absdir"
          # Link against this library
          test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
          # ... and its dependency_libs
          tmp_libs=
          for deplib in $dependency_libs; do
            newdependency_libs="$deplib $newdependency_libs"
-           if $opt_duplicate_deps ; then
+           case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+           if $opt_preserve_dup_deps ; then
              case "$tmp_libs " in
-             *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+             *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
              esac
            fi
-           tmp_libs="$tmp_libs $deplib"
+           func_append tmp_libs " $func_resolve_sysroot_result"
          done
 
          if test "$link_all_deplibs" != no; then
            # Add the search paths of all dependency libraries
            for deplib in $dependency_libs; do
+             path=
              case $deplib in
              -L*) path="$deplib" ;;
              *.la)
+               func_resolve_sysroot "$deplib"
+               deplib=$func_resolve_sysroot_result
                func_dirname "$deplib" "" "."
-               dir="$func_dirname_result"
+               dir=$func_dirname_result
                # We need an absolute path.
                case $dir in
                [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
@@ -5924,8 +7071,8 @@ func_mode_link ()
                       if test -z "$darwin_install_name"; then
                           darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
                       fi
-                     compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-                     linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
+                     func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+                     func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
                      path=
                    fi
                  fi
@@ -5958,7 +7105,7 @@ func_mode_link ()
          compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
          finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
        else
-         compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+         compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
        fi
       fi
       dependency_libs="$newdependency_libs"
@@ -5975,7 +7122,7 @@ func_mode_link ()
          for dir in $newlib_search_path; do
            case "$lib_search_path " in
            *" $dir "*) ;;
-           *) lib_search_path="$lib_search_path $dir" ;;
+           *) func_append lib_search_path " $dir" ;;
            esac
          done
          newlib_search_path=
@@ -6033,10 +7180,10 @@ func_mode_link ()
            -L*)
              case " $tmp_libs " in
              *" $deplib "*) ;;
-             *) tmp_libs="$tmp_libs $deplib" ;;
+             *) func_append tmp_libs " $deplib" ;;
              esac
              ;;
-           *) tmp_libs="$tmp_libs $deplib" ;;
+           *) func_append tmp_libs " $deplib" ;;
            esac
          done
          eval $var=\"$tmp_libs\"
@@ -6052,7 +7199,7 @@ func_mode_link ()
          ;;
        esac
        if test -n "$i" ; then
-         tmp_libs="$tmp_libs $i"
+         func_append tmp_libs " $i"
        fi
       done
       dependency_libs=$tmp_libs
@@ -6093,7 +7240,7 @@ func_mode_link ()
       # Now set the variables for building old libraries.
       build_libtool_libs=no
       oldlibs="$output"
-      objs="$objs$old_deplibs"
+      func_append objs "$old_deplibs"
       ;;
 
     lib)
@@ -6126,10 +7273,10 @@ func_mode_link ()
        if test "$deplibs_check_method" != pass_all; then
          func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
        else
-         $ECHO
+         echo
          $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
          $ECHO "*** objects $objs is not portable!"
-         libobjs="$libobjs $objs"
+         func_append libobjs " $objs"
        fi
       fi
 
@@ -6188,13 +7335,14 @@ func_mode_link ()
          # which has an extra 1 added just for fun
          #
          case $version_type in
+         # correct linux to gnu/linux during the next big refactor
          darwin|linux|osf|windows|none)
            func_arith $number_major + $number_minor
            current=$func_arith_result
            age="$number_minor"
            revision="$number_revision"
            ;;
-         freebsd-aout|freebsd-elf|sunos)
+         freebsd-aout|freebsd-elf|qnx|sunos)
            current="$number_major"
            revision="$number_minor"
            age="0"
@@ -6248,6 +7396,7 @@ func_mode_link ()
        # Calculate the version variables.
        major=
        versuffix=
+       versuffix2=
        verstring=
        case $version_type in
        none) ;;
@@ -6304,10 +7453,11 @@ func_mode_link ()
          versuffix="$major.$revision"
          ;;
 
-       linux)
+       linux) # correct to gnu/linux during the next big refactor
          func_arith $current - $age
          major=.$func_arith_result
          versuffix="$major.$age.$revision"
+         versuffix2="$major.$age"
          ;;
 
        osf)
@@ -6327,7 +7477,7 @@ func_mode_link ()
          done
 
          # Make executables depend on our current version.
-         verstring="$verstring:${current}.0"
+         func_append verstring ":${current}.0"
          ;;
 
        qnx)
@@ -6368,8 +7518,10 @@ func_mode_link ()
          esac
          if test "$need_version" = no; then
            versuffix=
+           versuffix2=
          else
            versuffix=".0.0"
+           versuffix2=".0.0"
          fi
        fi
 
@@ -6377,6 +7529,7 @@ func_mode_link ()
        if test "$avoid_version" = yes && test "$need_version" = no; then
          major=
          versuffix=
+         versuffix2=
          verstring=""
        fi
 
@@ -6395,10 +7548,10 @@ func_mode_link ()
       fi
 
       func_generate_dlsyms "$libname" "$libname" "yes"
-      libobjs="$libobjs $symfileobj"
+      func_append libobjs " $symfileobj"
       test "X$libobjs" = "X " && libobjs=
 
-      if test "$mode" != relink; then
+      if test "$opt_mode" != relink; then
        # Remove our outputs, but don't remove object files since they
        # may have been created when compiling PIC objects.
        removelist=
@@ -6414,7 +7567,7 @@ func_mode_link ()
                   continue
                 fi
               fi
-              removelist="$removelist $p"
+              func_append removelist " $p"
               ;;
            *) ;;
          esac
@@ -6425,27 +7578,28 @@ func_mode_link ()
 
       # Now set the variables for building old libraries.
       if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-       oldlibs="$oldlibs $output_objdir/$libname.$libext"
+       func_append oldlibs " $output_objdir/$libname.$libext"
 
        # Transform .lo files to .o files.
-       oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+       oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
       fi
 
       # Eliminate all temporary directories.
       #for path in $notinst_path; do
-      #        lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
-      #        deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
-      #        dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"`
+      #        lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #        deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #        dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
       #done
 
       if test -n "$xrpath"; then
        # If the user specified any rpath flags, then add them.
        temp_xrpath=
        for libdir in $xrpath; do
-         temp_xrpath="$temp_xrpath -R$libdir"
+         func_replace_sysroot "$libdir"
+         func_append temp_xrpath " -R$func_replace_sysroot_result"
          case "$finalize_rpath " in
          *" $libdir "*) ;;
-         *) finalize_rpath="$finalize_rpath $libdir" ;;
+         *) func_append finalize_rpath " $libdir" ;;
          esac
        done
        if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
@@ -6459,7 +7613,7 @@ func_mode_link ()
       for lib in $old_dlfiles; do
        case " $dlprefiles $dlfiles " in
        *" $lib "*) ;;
-       *) dlfiles="$dlfiles $lib" ;;
+       *) func_append dlfiles " $lib" ;;
        esac
       done
 
@@ -6469,24 +7623,24 @@ func_mode_link ()
       for lib in $old_dlprefiles; do
        case "$dlprefiles " in
        *" $lib "*) ;;
-       *) dlprefiles="$dlprefiles $lib" ;;
+       *) func_append dlprefiles " $lib" ;;
        esac
       done
 
       if test "$build_libtool_libs" = yes; then
        if test -n "$rpath"; then
          case $host in
-         *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
+         *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
            # these systems don't actually have a c library (as such)!
            ;;
          *-*-rhapsody* | *-*-darwin1.[012])
            # Rhapsody C library is in the System framework
-           deplibs="$deplibs System.ltframework"
+           func_append deplibs " System.ltframework"
            ;;
          *-*-netbsd*)
            # Don't link with libc until the a.out ld.so is fixed.
            ;;
-         *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+         *-*-openbsd* | *-*-mirbsd* | *-*-freebsd* | *-*-dragonfly*)
            # Do not include libc due to us having libc/libc_r.
            ;;
          *-*-sco3.2v5* | *-*-sco5v6*)
@@ -6498,7 +7652,7 @@ func_mode_link ()
          *)
            # Add libc to deplibs on all other systems if necessary.
            if test "$build_libtool_need_lc" = "yes"; then
-             deplibs="$deplibs -lc"
+             func_append deplibs " -lc"
            fi
            ;;
          esac
@@ -6509,12 +7663,14 @@ func_mode_link ()
        libname_save=$libname
        release_save=$release
        versuffix_save=$versuffix
+       versuffix2_save=$versuffix2
        major_save=$major
        # I'm not sure if I'm treating the release correctly.  I think
        # release should show up in the -l (ie -lgmp5) so we don't want to
        # add it in twice.  Is that correct?
        release=""
        versuffix=""
+       versuffix2=""
        major=""
        newdeplibs=
        droppeddeps=no
@@ -6547,7 +7703,7 @@ EOF
                if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
                  case " $predeps $postdeps " in
                  *" $i "*)
-                   newdeplibs="$newdeplibs $i"
+                   func_append newdeplibs " $i"
                    i=""
                    ;;
                  esac
@@ -6558,21 +7714,21 @@ EOF
                  set dummy $deplib_matches; shift
                  deplib_match=$1
                  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-                   newdeplibs="$newdeplibs $i"
+                   func_append newdeplibs " $i"
                  else
                    droppeddeps=yes
-                   $ECHO
+                   echo
                    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-                   $ECHO "*** I have the capability to make that library automatically link in when"
-                   $ECHO "*** you link to this library.  But I can only do this if you have a"
-                   $ECHO "*** shared version of the library, which I believe you do not have"
-                   $ECHO "*** because a test_compile did reveal that the linker did not use it for"
-                   $ECHO "*** its dynamic dependency list that programs get resolved with at runtime."
+                   echo "*** I have the capability to make that library automatically link in when"
+                   echo "*** you link to this library.  But I can only do this if you have a"
+                   echo "*** shared version of the library, which I believe you do not have"
+                   echo "*** because a test_compile did reveal that the linker did not use it for"
+                   echo "*** its dynamic dependency list that programs get resolved with at runtime."
                  fi
                fi
                ;;
              *)
-               newdeplibs="$newdeplibs $i"
+               func_append newdeplibs " $i"
                ;;
              esac
            done
@@ -6590,7 +7746,7 @@ EOF
                  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
                    case " $predeps $postdeps " in
                    *" $i "*)
-                     newdeplibs="$newdeplibs $i"
+                     func_append newdeplibs " $i"
                      i=""
                      ;;
                    esac
@@ -6601,29 +7757,29 @@ EOF
                    set dummy $deplib_matches; shift
                    deplib_match=$1
                    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-                     newdeplibs="$newdeplibs $i"
+                     func_append newdeplibs " $i"
                    else
                      droppeddeps=yes
-                     $ECHO
+                     echo
                      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-                     $ECHO "*** I have the capability to make that library automatically link in when"
-                     $ECHO "*** you link to this library.  But I can only do this if you have a"
-                     $ECHO "*** shared version of the library, which you do not appear to have"
-                     $ECHO "*** because a test_compile did reveal that the linker did not use this one"
-                     $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime."
+                     echo "*** I have the capability to make that library automatically link in when"
+                     echo "*** you link to this library.  But I can only do this if you have a"
+                     echo "*** shared version of the library, which you do not appear to have"
+                     echo "*** because a test_compile did reveal that the linker did not use this one"
+                     echo "*** as a dynamic dependency that programs can get resolved with at runtime."
                    fi
                  fi
                else
                  droppeddeps=yes
-                 $ECHO
+                 echo
                  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
-                 $ECHO "*** make it link in!  You will probably need to install it or some"
-                 $ECHO "*** library that it depends on before this library will be fully"
-                 $ECHO "*** functional.  Installing it before continuing would be even better."
+                 echo "*** make it link in!  You will probably need to install it or some"
+                 echo "*** library that it depends on before this library will be fully"
+                 echo "*** functional.  Installing it before continuing would be even better."
                fi
                ;;
              *)
-               newdeplibs="$newdeplibs $i"
+               func_append newdeplibs " $i"
                ;;
              esac
            done
@@ -6640,15 +7796,27 @@ EOF
              if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
                case " $predeps $postdeps " in
                *" $a_deplib "*)
-                 newdeplibs="$newdeplibs $a_deplib"
+                 func_append newdeplibs " $a_deplib"
                  a_deplib=""
                  ;;
                esac
              fi
              if test -n "$a_deplib" ; then
                libname=`eval "\\$ECHO \"$libname_spec\""`
+               if test -n "$file_magic_glob"; then
+                 libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+               else
+                 libnameglob=$libname
+               fi
+               test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
                for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-                 potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+                 if test "$want_nocaseglob" = yes; then
+                   shopt -s nocaseglob
+                   potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+                   $nocaseglob
+                 else
+                   potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+                 fi
                  for potent_lib in $potential_libs; do
                      # Follow soft links.
                      if ls -lLd "$potent_lib" 2>/dev/null |
@@ -6665,13 +7833,13 @@ EOF
                        potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
                        case $potliblink in
                        [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-                       *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+                       *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
                        esac
                      done
                      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
                         $SED -e 10q |
                         $EGREP "$file_magic_regex" > /dev/null; then
-                       newdeplibs="$newdeplibs $a_deplib"
+                       func_append newdeplibs " $a_deplib"
                        a_deplib=""
                        break 2
                      fi
@@ -6680,12 +7848,12 @@ EOF
              fi
              if test -n "$a_deplib" ; then
                droppeddeps=yes
-               $ECHO
+               echo
                $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-               $ECHO "*** I have the capability to make that library automatically link in when"
-               $ECHO "*** you link to this library.  But I can only do this if you have a"
-               $ECHO "*** shared version of the library, which you do not appear to have"
-               $ECHO "*** because I did check the linker path looking for a file starting"
+               echo "*** I have the capability to make that library automatically link in when"
+               echo "*** you link to this library.  But I can only do this if you have a"
+               echo "*** shared version of the library, which you do not appear to have"
+               echo "*** because I did check the linker path looking for a file starting"
                if test -z "$potlib" ; then
                  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
                else
@@ -6696,7 +7864,7 @@ EOF
              ;;
            *)
              # Add a -L argument.
-             newdeplibs="$newdeplibs $a_deplib"
+             func_append newdeplibs " $a_deplib"
              ;;
            esac
          done # Gone through all deplibs.
@@ -6712,7 +7880,7 @@ EOF
              if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
                case " $predeps $postdeps " in
                *" $a_deplib "*)
-                 newdeplibs="$newdeplibs $a_deplib"
+                 func_append newdeplibs " $a_deplib"
                  a_deplib=""
                  ;;
                esac
@@ -6723,9 +7891,9 @@ EOF
                  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
                  for potent_lib in $potential_libs; do
                    potlib="$potent_lib" # see symlink-check above in file_magic test
-                   if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
+                   if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
                       $EGREP "$match_pattern_regex" > /dev/null; then
-                     newdeplibs="$newdeplibs $a_deplib"
+                     func_append newdeplibs " $a_deplib"
                      a_deplib=""
                      break 2
                    fi
@@ -6734,12 +7902,12 @@ EOF
              fi
              if test -n "$a_deplib" ; then
                droppeddeps=yes
-               $ECHO
+               echo
                $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-               $ECHO "*** I have the capability to make that library automatically link in when"
-               $ECHO "*** you link to this library.  But I can only do this if you have a"
-               $ECHO "*** shared version of the library, which you do not appear to have"
-               $ECHO "*** because I did check the linker path looking for a file starting"
+               echo "*** I have the capability to make that library automatically link in when"
+               echo "*** you link to this library.  But I can only do this if you have a"
+               echo "*** shared version of the library, which you do not appear to have"
+               echo "*** because I did check the linker path looking for a file starting"
                if test -z "$potlib" ; then
                  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
                else
@@ -6750,35 +7918,36 @@ EOF
              ;;
            *)
              # Add a -L argument.
-             newdeplibs="$newdeplibs $a_deplib"
+             func_append newdeplibs " $a_deplib"
              ;;
            esac
          done # Gone through all deplibs.
          ;;
        none | unknown | *)
          newdeplibs=""
-         tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
-             -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`
+         tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
          if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
            for i in $predeps $postdeps ; do
              # can't use Xsed below, because $i might contain '/'
-             tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
+             tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
            done
          fi
-         if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[      ]//g' |
-            $GREP . >/dev/null; then
-           $ECHO
+         case $tmp_deplibs in
+         *[!\  \ ]*)
+           echo
            if test "X$deplibs_check_method" = "Xnone"; then
-             $ECHO "*** Warning: inter-library dependencies are not supported in this platform."
+             echo "*** Warning: inter-library dependencies are not supported in this platform."
            else
-             $ECHO "*** Warning: inter-library dependencies are not known to be supported."
+             echo "*** Warning: inter-library dependencies are not known to be supported."
            fi
-           $ECHO "*** All declared inter-library dependencies are being dropped."
+           echo "*** All declared inter-library dependencies are being dropped."
            droppeddeps=yes
-         fi
+           ;;
+         esac
          ;;
        esac
        versuffix=$versuffix_save
+       versuffix2=$versuffix2_save
        major=$major_save
        release=$release_save
        libname=$libname_save
@@ -6787,23 +7956,23 @@ EOF
        case $host in
        *-*-rhapsody* | *-*-darwin1.[012])
          # On Rhapsody replace the C library with the System framework
-         newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+         newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
          ;;
        esac
 
        if test "$droppeddeps" = yes; then
          if test "$module" = yes; then
-           $ECHO
-           $ECHO "*** Warning: libtool could not satisfy all declared inter-library"
+           echo
+           echo "*** Warning: libtool could not satisfy all declared inter-library"
            $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
-           $ECHO "*** a static module, that should work as long as the dlopening"
-           $ECHO "*** application is linked with the -dlopen flag."
+           echo "*** a static module, that should work as long as the dlopening"
+           echo "*** application is linked with the -dlopen flag."
            if test -z "$global_symbol_pipe"; then
-             $ECHO
-             $ECHO "*** However, this would only work if libtool was able to extract symbol"
-             $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
-             $ECHO "*** not find such a program.  So, this module is probably useless."
-             $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+             echo
+             echo "*** However, this would only work if libtool was able to extract symbol"
+             echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+             echo "*** not find such a program.  So, this module is probably useless."
+             echo "*** \`nm' from GNU binutils and a full rebuild may help."
            fi
            if test "$build_old_libs" = no; then
              oldlibs="$output_objdir/$libname.$libext"
@@ -6813,16 +7982,16 @@ EOF
              build_libtool_libs=no
            fi
          else
-           $ECHO "*** The inter-library dependencies that have been dropped here will be"
-           $ECHO "*** automatically added whenever a program is linked with this library"
-           $ECHO "*** or is declared to -dlopen it."
+           echo "*** The inter-library dependencies that have been dropped here will be"
+           echo "*** automatically added whenever a program is linked with this library"
+           echo "*** or is declared to -dlopen it."
 
            if test "$allow_undefined" = no; then
-             $ECHO
-             $ECHO "*** Since this library must not contain undefined symbols,"
-             $ECHO "*** because either the platform does not support them or"
-             $ECHO "*** it was explicitly requested with -no-undefined,"
-             $ECHO "*** libtool will only create a static version of it."
+             echo
+             echo "*** Since this library must not contain undefined symbols,"
+             echo "*** because either the platform does not support them or"
+             echo "*** it was explicitly requested with -no-undefined,"
+             echo "*** libtool will only create a static version of it."
              if test "$build_old_libs" = no; then
                oldlibs="$output_objdir/$libname.$libext"
                build_libtool_libs=module
@@ -6839,9 +8008,9 @@ EOF
       # Time to change all our "foo.ltframework" stuff back to "-framework foo"
       case $host in
        *-*-darwin*)
-         newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-         new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-         deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+         newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+         new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+         deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
          ;;
       esac
 
@@ -6854,7 +8023,7 @@ EOF
        *)
          case " $deplibs " in
          *" -L$path/$objdir "*)
-           new_libs="$new_libs -L$path/$objdir" ;;
+           func_append new_libs " -L$path/$objdir" ;;
          esac
          ;;
        esac
@@ -6864,10 +8033,10 @@ EOF
        -L*)
          case " $new_libs " in
          *" $deplib "*) ;;
-         *) new_libs="$new_libs $deplib" ;;
+         *) func_append new_libs " $deplib" ;;
          esac
          ;;
-       *) new_libs="$new_libs $deplib" ;;
+       *) func_append new_libs " $deplib" ;;
        esac
       done
       deplibs="$new_libs"
@@ -6879,15 +8048,22 @@ EOF
 
       # Test again, we may have decided not to build it any more
       if test "$build_libtool_libs" = yes; then
+       # Remove ${wl} instances when linking with ld.
+       # FIXME: should test the right _cmds variable.
+       case $archive_cmds in
+         *\$LD\ *) wl= ;;
+        esac
        if test "$hardcode_into_libs" = yes; then
          # Hardcode the library paths
          hardcode_libdirs=
          dep_rpath=
          rpath="$finalize_rpath"
-         test "$mode" != relink && rpath="$compile_rpath$rpath"
+         test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
          for libdir in $rpath; do
            if test -n "$hardcode_libdir_flag_spec"; then
              if test -n "$hardcode_libdir_separator"; then
+               func_replace_sysroot "$libdir"
+               libdir=$func_replace_sysroot_result
                if test -z "$hardcode_libdirs"; then
                  hardcode_libdirs="$libdir"
                else
@@ -6896,18 +8072,18 @@ EOF
                  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
                    ;;
                  *)
-                   hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+                   func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
                    ;;
                  esac
                fi
              else
                eval flag=\"$hardcode_libdir_flag_spec\"
-               dep_rpath="$dep_rpath $flag"
+               func_append dep_rpath " $flag"
              fi
            elif test -n "$runpath_var"; then
              case "$perm_rpath " in
              *" $libdir "*) ;;
-             *) perm_rpath="$perm_rpath $libdir" ;;
+             *) func_append perm_rpath " $libdir" ;;
              esac
            fi
          done
@@ -6915,17 +8091,13 @@ EOF
          if test -n "$hardcode_libdir_separator" &&
             test -n "$hardcode_libdirs"; then
            libdir="$hardcode_libdirs"
-           if test -n "$hardcode_libdir_flag_spec_ld"; then
-             eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
-           else
-             eval dep_rpath=\"$hardcode_libdir_flag_spec\"
-           fi
+           eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
          fi
          if test -n "$runpath_var" && test -n "$perm_rpath"; then
            # We should set the runpath_var.
            rpath=
            for dir in $perm_rpath; do
-             rpath="$rpath$dir:"
+             func_append rpath "$dir:"
            done
            eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
          fi
@@ -6933,7 +8105,7 @@ EOF
        fi
 
        shlibpath="$finalize_shlibpath"
-       test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+       test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
        if test -n "$shlibpath"; then
          eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
        fi
@@ -6959,18 +8131,18 @@ EOF
        linknames=
        for link
        do
-         linknames="$linknames $link"
+         func_append linknames " $link"
        done
 
        # Use standard objects if they are pic
-       test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+       test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
        test "X$libobjs" = "X " && libobjs=
 
        delfiles=
        if test -n "$export_symbols" && test -n "$include_expsyms"; then
          $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
          export_symbols="$output_objdir/$libname.uexp"
-         delfiles="$delfiles $export_symbols"
+         func_append delfiles " $export_symbols"
        fi
 
        orig_export_symbols=
@@ -7001,13 +8173,45 @@ EOF
            $opt_dry_run || $RM $export_symbols
            cmds=$export_symbols_cmds
            save_ifs="$IFS"; IFS='~'
-           for cmd in $cmds; do
+           for cmd1 in $cmds; do
              IFS="$save_ifs"
-             eval cmd=\"$cmd\"
-             func_len " $cmd"
-             len=$func_len_result
-             if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+             # Take the normal branch if the nm_file_list_spec branch
+             # doesn't work or if tool conversion is not needed.
+             case $nm_file_list_spec~$to_tool_file_cmd in
+               *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+                 try_normal_branch=yes
+                 eval cmd=\"$cmd1\"
+                 func_len " $cmd"
+                 len=$func_len_result
+                 ;;
+               *)
+                 try_normal_branch=no
+                 ;;
+             esac
+             if test "$try_normal_branch" = yes \
+                && { test "$len" -lt "$max_cmd_len" \
+                     || test "$max_cmd_len" -le -1; }
+             then
+               func_show_eval "$cmd" 'exit $?'
+               skipped_export=false
+             elif test -n "$nm_file_list_spec"; then
+               func_basename "$output"
+               output_la=$func_basename_result
+               save_libobjs=$libobjs
+               save_output=$output
+               output=${output_objdir}/${output_la}.nm
+               func_to_tool_file "$output"
+               libobjs=$nm_file_list_spec$func_to_tool_file_result
+               func_append delfiles " $output"
+               func_verbose "creating $NM input file list: $output"
+               for obj in $save_libobjs; do
+                 func_to_tool_file "$obj"
+                 $ECHO "$func_to_tool_file_result"
+               done > "$output"
+               eval cmd=\"$cmd1\"
                func_show_eval "$cmd" 'exit $?'
+               output=$save_output
+               libobjs=$save_libobjs
                skipped_export=false
              else
                # The command line is too long to execute in one step.
@@ -7029,7 +8233,7 @@ EOF
        if test -n "$export_symbols" && test -n "$include_expsyms"; then
          tmp_export_symbols="$export_symbols"
          test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-         $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+         $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
        fi
 
        if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
@@ -7041,7 +8245,7 @@ EOF
          # global variables. join(1) would be nice here, but unfortunately
          # isn't a blessed tool.
          $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-         delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+         func_append delfiles " $export_symbols $output_objdir/$libname.filter"
          export_symbols=$output_objdir/$libname.def
          $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
        fi
@@ -7051,7 +8255,7 @@ EOF
          case " $convenience " in
          *" $test_deplib "*) ;;
          *)
-           tmp_deplibs="$tmp_deplibs $test_deplib"
+           func_append tmp_deplibs " $test_deplib"
            ;;
          esac
        done
@@ -7071,21 +8275,21 @@ EOF
            test "X$libobjs" = "X " && libobjs=
          else
            gentop="$output_objdir/${outputname}x"
-           generated="$generated $gentop"
+           func_append generated " $gentop"
 
            func_extract_archives $gentop $convenience
-           libobjs="$libobjs $func_extract_archives_result"
+           func_append libobjs " $func_extract_archives_result"
            test "X$libobjs" = "X " && libobjs=
          fi
        fi
 
        if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
          eval flag=\"$thread_safe_flag_spec\"
-         linker_flags="$linker_flags $flag"
+         func_append linker_flags " $flag"
        fi
 
        # Make a backup of the uninstalled library when relinking
-       if test "$mode" = relink; then
+       if test "$opt_mode" = relink; then
          $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
        fi
 
@@ -7130,7 +8334,8 @@ EOF
            save_libobjs=$libobjs
          fi
          save_output=$output
-         output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
+         func_basename "$output"
+         output_la=$func_basename_result
 
          # Clear the reloadable object creation command queue and
          # initialize k to one.
@@ -7143,13 +8348,16 @@ EOF
          if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
            output=${output_objdir}/${output_la}.lnkscript
            func_verbose "creating GNU ld script: $output"
-           $ECHO 'INPUT (' > $output
+           echo 'INPUT (' > $output
            for obj in $save_libobjs
            do
-             $ECHO "$obj" >> $output
+             func_to_tool_file "$obj"
+             $ECHO "$func_to_tool_file_result" >> $output
            done
-           $ECHO ')' >> $output
-           delfiles="$delfiles $output"
+           echo ')' >> $output
+           func_append delfiles " $output"
+           func_to_tool_file "$output"
+           output=$func_to_tool_file_result
          elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
            output=${output_objdir}/${output_la}.lnk
            func_verbose "creating linker input file list: $output"
@@ -7163,10 +8371,12 @@ EOF
            fi
            for obj
            do
-             $ECHO "$obj" >> $output
+             func_to_tool_file "$obj"
+             $ECHO "$func_to_tool_file_result" >> $output
            done
-           delfiles="$delfiles $output"
-           output=$firstobj\"$file_list_spec$output\"
+           func_append delfiles " $output"
+           func_to_tool_file "$output"
+           output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
          else
            if test -n "$save_libobjs"; then
              func_verbose "creating reloadable object files..."
@@ -7190,17 +8400,19 @@ EOF
                  # command to the queue.
                  if test "$k" -eq 1 ; then
                    # The first file doesn't have a previous command to add.
-                   eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+                   reload_objs=$objlist
+                   eval concat_cmds=\"$reload_cmds\"
                  else
                    # All subsequent reloadable object files will link in
                    # the last one created.
-                   eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\"
+                   reload_objs="$objlist $last_robj"
+                   eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
                  fi
                  last_robj=$output_objdir/$output_la-${k}.$objext
                  func_arith $k + 1
                  k=$func_arith_result
                  output=$output_objdir/$output_la-${k}.$objext
-                 objlist=$obj
+                 objlist=" $obj"
                  func_len " $last_robj"
                  func_arith $len0 + $func_len_result
                  len=$func_arith_result
@@ -7210,11 +8422,12 @@ EOF
              # reloadable object file.  All subsequent reloadable object
              # files will link in the last one created.
              test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-             eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+             reload_objs="$objlist $last_robj"
+             eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
              if test -n "$last_robj"; then
                eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
              fi
-             delfiles="$delfiles $output"
+             func_append delfiles " $output"
 
            else
              output=
@@ -7248,7 +8461,7 @@ EOF
                lt_exit=$?
 
                # Restore the uninstalled library and exit
-               if test "$mode" = relink; then
+               if test "$opt_mode" = relink; then
                  ( cd "$output_objdir" && \
                    $RM "${realname}T" && \
                    $MV "${realname}U" "$realname" )
@@ -7269,7 +8482,7 @@ EOF
            if test -n "$export_symbols" && test -n "$include_expsyms"; then
              tmp_export_symbols="$export_symbols"
              test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-             $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+             $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
            fi
 
            if test -n "$orig_export_symbols"; then
@@ -7281,7 +8494,7 @@ EOF
              # global variables. join(1) would be nice here, but unfortunately
              # isn't a blessed tool.
              $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-             delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+             func_append delfiles " $export_symbols $output_objdir/$libname.filter"
              export_symbols=$output_objdir/$libname.def
              $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
            fi
@@ -7322,10 +8535,10 @@ EOF
        # Add any objects from preloaded convenience libraries
        if test -n "$dlprefiles"; then
          gentop="$output_objdir/${outputname}x"
-         generated="$generated $gentop"
+         func_append generated " $gentop"
 
          func_extract_archives $gentop $dlprefiles
-         libobjs="$libobjs $func_extract_archives_result"
+         func_append libobjs " $func_extract_archives_result"
          test "X$libobjs" = "X " && libobjs=
        fi
 
@@ -7341,7 +8554,7 @@ EOF
            lt_exit=$?
 
            # Restore the uninstalled library and exit
-           if test "$mode" = relink; then
+           if test "$opt_mode" = relink; then
              ( cd "$output_objdir" && \
                $RM "${realname}T" && \
                $MV "${realname}U" "$realname" )
@@ -7353,7 +8566,7 @@ EOF
        IFS="$save_ifs"
 
        # Restore the uninstalled library and exit
-       if test "$mode" = relink; then
+       if test "$opt_mode" = relink; then
          $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
 
          if test -n "$convenience"; then
@@ -7434,18 +8647,21 @@ EOF
       if test -n "$convenience"; then
        if test -n "$whole_archive_flag_spec"; then
          eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-         reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
+         reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
        else
          gentop="$output_objdir/${obj}x"
-         generated="$generated $gentop"
+         func_append generated " $gentop"
 
          func_extract_archives $gentop $convenience
          reload_conv_objs="$reload_objs $func_extract_archives_result"
        fi
       fi
 
+      # If we're not building shared, we need to use non_pic_objs
+      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
       # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
 
       output="$obj"
       func_execute_cmds "$reload_cmds" 'exit $?'
@@ -7505,8 +8721,8 @@ EOF
       case $host in
       *-*-rhapsody* | *-*-darwin1.[012])
        # On Rhapsody replace the C library is the System framework
-       compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
-       finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+       compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+       finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
        ;;
       esac
 
@@ -7517,14 +8733,14 @@ EOF
        if test "$tagname" = CXX ; then
          case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
            10.[0123])
-             compile_command="$compile_command ${wl}-bind_at_load"
-             finalize_command="$finalize_command ${wl}-bind_at_load"
+             func_append compile_command " ${wl}-bind_at_load"
+             func_append finalize_command " ${wl}-bind_at_load"
            ;;
          esac
        fi
        # Time to change all our "foo.ltframework" stuff back to "-framework foo"
-       compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-       finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+       compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+       finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
        ;;
       esac
 
@@ -7538,7 +8754,7 @@ EOF
        *)
          case " $compile_deplibs " in
          *" -L$path/$objdir "*)
-           new_libs="$new_libs -L$path/$objdir" ;;
+           func_append new_libs " -L$path/$objdir" ;;
          esac
          ;;
        esac
@@ -7548,17 +8764,17 @@ EOF
        -L*)
          case " $new_libs " in
          *" $deplib "*) ;;
-         *) new_libs="$new_libs $deplib" ;;
+         *) func_append new_libs " $deplib" ;;
          esac
          ;;
-       *) new_libs="$new_libs $deplib" ;;
+       *) func_append new_libs " $deplib" ;;
        esac
       done
       compile_deplibs="$new_libs"
 
 
-      compile_command="$compile_command $compile_deplibs"
-      finalize_command="$finalize_command $finalize_deplibs"
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
 
       if test -n "$rpath$xrpath"; then
        # If the user specified any rpath flags, then add them.
@@ -7566,7 +8782,7 @@ EOF
          # This is the magic to use -rpath.
          case "$finalize_rpath " in
          *" $libdir "*) ;;
-         *) finalize_rpath="$finalize_rpath $libdir" ;;
+         *) func_append finalize_rpath " $libdir" ;;
          esac
        done
       fi
@@ -7585,18 +8801,18 @@ EOF
              *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
                ;;
              *)
-               hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+               func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
                ;;
              esac
            fi
          else
            eval flag=\"$hardcode_libdir_flag_spec\"
-           rpath="$rpath $flag"
+           func_append rpath " $flag"
          fi
        elif test -n "$runpath_var"; then
          case "$perm_rpath " in
          *" $libdir "*) ;;
-         *) perm_rpath="$perm_rpath $libdir" ;;
+         *) func_append perm_rpath " $libdir" ;;
          esac
        fi
        case $host in
@@ -7605,12 +8821,12 @@ EOF
          case :$dllsearchpath: in
          *":$libdir:"*) ;;
          ::) dllsearchpath=$libdir;;
-         *) dllsearchpath="$dllsearchpath:$libdir";;
+         *) func_append dllsearchpath ":$libdir";;
          esac
          case :$dllsearchpath: in
          *":$testbindir:"*) ;;
          ::) dllsearchpath=$testbindir;;
-         *) dllsearchpath="$dllsearchpath:$testbindir";;
+         *) func_append dllsearchpath ":$testbindir";;
          esac
          ;;
        esac
@@ -7636,18 +8852,18 @@ EOF
              *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
                ;;
              *)
-               hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+               func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
                ;;
              esac
            fi
          else
            eval flag=\"$hardcode_libdir_flag_spec\"
-           rpath="$rpath $flag"
+           func_append rpath " $flag"
          fi
        elif test -n "$runpath_var"; then
          case "$finalize_perm_rpath " in
          *" $libdir "*) ;;
-         *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+         *) func_append finalize_perm_rpath " $libdir" ;;
          esac
        fi
       done
@@ -7661,8 +8877,8 @@ EOF
 
       if test -n "$libobjs" && test "$build_old_libs" = yes; then
        # Transform all the library objects into standard objects.
-       compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-       finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+       compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+       finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
       fi
 
       func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
@@ -7674,15 +8890,15 @@ EOF
 
       wrappers_required=yes
       case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
       *cygwin* | *mingw* )
         if test "$build_libtool_libs" != yes; then
           wrappers_required=no
         fi
         ;;
-      *cegcc)
-        # Disable wrappers for cegcc, we are cross compiling anyway.
-        wrappers_required=no
-        ;;
       *)
         if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
           wrappers_required=no
@@ -7691,13 +8907,19 @@ EOF
       esac
       if test "$wrappers_required" = no; then
        # Replace the output file specification.
-       compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+       compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
        link_command="$compile_command$compile_rpath"
 
        # We have no uninstalled library dependencies, so finalize right now.
        exit_status=0
        func_show_eval "$link_command" 'exit_status=$?'
 
+       if test -n "$postlink_cmds"; then
+         func_to_tool_file "$output"
+         postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+         func_execute_cmds "$postlink_cmds" 'exit $?'
+       fi
+
        # Delete the generated files.
        if test -f "$output_objdir/${outputname}S.${objext}"; then
          func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
@@ -7720,7 +8942,7 @@ EOF
          # We should set the runpath_var.
          rpath=
          for dir in $perm_rpath; do
-           rpath="$rpath$dir:"
+           func_append rpath "$dir:"
          done
          compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
        fi
@@ -7728,7 +8950,7 @@ EOF
          # We should set the runpath_var.
          rpath=
          for dir in $finalize_perm_rpath; do
-           rpath="$rpath$dir:"
+           func_append rpath "$dir:"
          done
          finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
        fi
@@ -7738,11 +8960,18 @@ EOF
        # We don't need to create a wrapper script.
        link_command="$compile_var$compile_command$compile_rpath"
        # Replace the output file specification.
-       link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+       link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
        # Delete the old output file.
        $opt_dry_run || $RM $output
        # Link the executable and exit
        func_show_eval "$link_command" 'exit $?'
+
+       if test -n "$postlink_cmds"; then
+         func_to_tool_file "$output"
+         postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+         func_execute_cmds "$postlink_cmds" 'exit $?'
+       fi
+
        exit $EXIT_SUCCESS
       fi
 
@@ -7757,7 +8986,7 @@ EOF
        if test "$fast_install" != no; then
          link_command="$finalize_var$compile_command$finalize_rpath"
          if test "$fast_install" = yes; then
-           relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+           relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
          else
            # fast_install is set to needless
            relink_command=
@@ -7769,13 +8998,19 @@ EOF
       fi
 
       # Replace the output file specification.
-      link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
 
       # Delete the old output files.
       $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
 
       func_show_eval "$link_command" 'exit $?'
 
+      if test -n "$postlink_cmds"; then
+       func_to_tool_file "$output_objdir/$outputname"
+       postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+       func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
       # Now create the wrapper script.
       func_verbose "creating $output"
 
@@ -7793,18 +9028,7 @@ EOF
          fi
        done
        relink_command="(cd `pwd`; $relink_command)"
-       relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-      fi
-
-      # Quote $ECHO for shipping.
-      if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
-       case $progpath in
-       [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
-       *) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
-       esac
-       qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
-      else
-       qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"`
+       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
       fi
 
       # Only actually do things if not in dry run mode.
@@ -7884,7 +9108,7 @@ EOF
        else
          oldobjs="$old_deplibs $non_pic_objects"
          if test "$preload" = yes && test -f "$symfileobj"; then
-           oldobjs="$oldobjs $symfileobj"
+           func_append oldobjs " $symfileobj"
          fi
        fi
        addlibs="$old_convenience"
@@ -7892,10 +9116,10 @@ EOF
 
       if test -n "$addlibs"; then
        gentop="$output_objdir/${outputname}x"
-       generated="$generated $gentop"
+       func_append generated " $gentop"
 
        func_extract_archives $gentop $addlibs
-       oldobjs="$oldobjs $func_extract_archives_result"
+       func_append oldobjs " $func_extract_archives_result"
       fi
 
       # Do each command in the archive commands.
@@ -7906,10 +9130,10 @@ EOF
        # Add any objects from preloaded convenience libraries
        if test -n "$dlprefiles"; then
          gentop="$output_objdir/${outputname}x"
-         generated="$generated $gentop"
+         func_append generated " $gentop"
 
          func_extract_archives $gentop $dlprefiles
-         oldobjs="$oldobjs $func_extract_archives_result"
+         func_append oldobjs " $func_extract_archives_result"
        fi
 
        # POSIX demands no paths to be encoded in archives.  We have
@@ -7925,9 +9149,9 @@ EOF
            done | sort | sort -uc >/dev/null 2>&1); then
          :
        else
-         $ECHO "copying selected object files to avoid basename conflicts..."
+         echo "copying selected object files to avoid basename conflicts..."
          gentop="$output_objdir/${outputname}x"
-         generated="$generated $gentop"
+         func_append generated " $gentop"
          func_mkdir_p "$gentop"
          save_oldobjs=$oldobjs
          oldobjs=
@@ -7951,18 +9175,30 @@ EOF
                esac
              done
              func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-             oldobjs="$oldobjs $gentop/$newobj"
+             func_append oldobjs " $gentop/$newobj"
              ;;
-           *) oldobjs="$oldobjs $obj" ;;
+           *) func_append oldobjs " $obj" ;;
            esac
          done
        fi
+       func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+       tool_oldlib=$func_to_tool_file_result
        eval cmds=\"$old_archive_cmds\"
 
        func_len " $cmds"
        len=$func_len_result
        if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
          cmds=$old_archive_cmds
+       elif test -n "$archiver_list_spec"; then
+         func_verbose "using command file archive linking..."
+         for obj in $oldobjs
+         do
+           func_to_tool_file "$obj"
+           $ECHO "$func_to_tool_file_result"
+         done > $output_objdir/$libname.libcmd
+         func_to_tool_file "$output_objdir/$libname.libcmd"
+         oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+         cmds=$old_archive_cmds
        else
          # the command line is too long to link in one step, link in parts
          func_verbose "using piecewise archive linking..."
@@ -8036,7 +9272,7 @@ EOF
       done
       # Quote the link command for shipping.
       relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
       if test "$hardcode_automatic" = yes ; then
        relink_command=
       fi
@@ -8056,12 +9292,23 @@ EOF
              *.la)
                func_basename "$deplib"
                name="$func_basename_result"
-               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+               func_resolve_sysroot "$deplib"
+               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
                test -z "$libdir" && \
                  func_fatal_error "\`$deplib' is not a valid libtool archive"
-               newdependency_libs="$newdependency_libs $libdir/$name"
+               func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+               ;;
+             -L*)
+               func_stripname -L '' "$deplib"
+               func_replace_sysroot "$func_stripname_result"
+               func_append newdependency_libs " -L$func_replace_sysroot_result"
                ;;
-             *) newdependency_libs="$newdependency_libs $deplib" ;;
+             -R*)
+               func_stripname -R '' "$deplib"
+               func_replace_sysroot "$func_stripname_result"
+               func_append newdependency_libs " -R$func_replace_sysroot_result"
+               ;;
+             *) func_append newdependency_libs " $deplib" ;;
              esac
            done
            dependency_libs="$newdependency_libs"
@@ -8075,9 +9322,9 @@ EOF
                eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
                test -z "$libdir" && \
                  func_fatal_error "\`$lib' is not a valid libtool archive"
-               newdlfiles="$newdlfiles $libdir/$name"
+               func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
                ;;
-             *) newdlfiles="$newdlfiles $lib" ;;
+             *) func_append newdlfiles " $lib" ;;
              esac
            done
            dlfiles="$newdlfiles"
@@ -8094,7 +9341,7 @@ EOF
                eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
                test -z "$libdir" && \
                  func_fatal_error "\`$lib' is not a valid libtool archive"
-               newdlprefiles="$newdlprefiles $libdir/$name"
+               func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
                ;;
              esac
            done
@@ -8106,7 +9353,7 @@ EOF
                [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
                *) abs=`pwd`"/$lib" ;;
              esac
-             newdlfiles="$newdlfiles $abs"
+             func_append newdlfiles " $abs"
            done
            dlfiles="$newdlfiles"
            newdlprefiles=
@@ -8115,15 +9362,33 @@ EOF
                [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
                *) abs=`pwd`"/$lib" ;;
              esac
-             newdlprefiles="$newdlprefiles $abs"
+             func_append newdlprefiles " $abs"
            done
            dlprefiles="$newdlprefiles"
          fi
          $RM $output
          # place dlname in correct position for cygwin
+         # In fact, it would be nice if we could use this code for all target
+         # systems that can't hard-code library paths into their executables
+         # and that have no shared library path variable independent of PATH,
+         # but it turns out we can't easily determine that from inspecting
+         # libtool variables, so we have to hard-code the OSs to which it
+         # applies here; at the moment, that means platforms that use the PE
+         # object format with DLL files.  See the long comment at the top of
+         # tests/bindir.at for full details.
          tdlname=$dlname
          case $host,$output,$installed,$module,$dlname in
-           *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+           *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+             # If a -bindir argument was supplied, place the dll there.
+             if test "x$bindir" != x ;
+             then
+               func_relative_path "$install_libdir" "$bindir"
+               tdlname=$func_relative_path_result$dlname
+             else
+               # Otherwise fall back on heuristic.
+               tdlname=../bin/$dlname
+             fi
+             ;;
          esac
          $ECHO > $output "\
 # $outputname - a libtool library file
@@ -8182,7 +9447,7 @@ relink_command=\"$relink_command\""
     exit $EXIT_SUCCESS
 }
 
-{ test "$mode" = link || test "$mode" = relink; } &&
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
     func_mode_link ${1+"$@"}
 
 
@@ -8202,9 +9467,9 @@ func_mode_uninstall ()
     for arg
     do
       case $arg in
-      -f) RM="$RM $arg"; rmforce=yes ;;
-      -*) RM="$RM $arg" ;;
-      *) files="$files $arg" ;;
+      -f) func_append RM " $arg"; rmforce=yes ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
       esac
     done
 
@@ -8213,24 +9478,23 @@ func_mode_uninstall ()
 
     rmdirs=
 
-    origobjdir="$objdir"
     for file in $files; do
       func_dirname "$file" "" "."
       dir="$func_dirname_result"
       if test "X$dir" = X.; then
-       objdir="$origobjdir"
+       odir="$objdir"
       else
-       objdir="$dir/$origobjdir"
+       odir="$dir/$objdir"
       fi
       func_basename "$file"
       name="$func_basename_result"
-      test "$mode" = uninstall && objdir="$dir"
+      test "$opt_mode" = uninstall && odir="$dir"
 
-      # Remember objdir for removal later, being careful to avoid duplicates
-      if test "$mode" = clean; then
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test "$opt_mode" = clean; then
        case " $rmdirs " in
-         *" $objdir "*) ;;
-         *) rmdirs="$rmdirs $objdir" ;;
+         *" $odir "*) ;;
+         *) func_append rmdirs " $odir" ;;
        esac
       fi
 
@@ -8256,18 +9520,17 @@ func_mode_uninstall ()
 
          # Delete the libtool libraries and symlinks.
          for n in $library_names; do
-           rmfiles="$rmfiles $objdir/$n"
+           func_append rmfiles " $odir/$n"
          done
-         test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+         test -n "$old_library" && func_append rmfiles " $odir/$old_library"
 
-         case "$mode" in
+         case "$opt_mode" in
          clean)
-           case "  $library_names " in
-           # "  " in the beginning catches empty $dlname
+           case " $library_names " in
            *" $dlname "*) ;;
-           *) rmfiles="$rmfiles $objdir/$dlname" ;;
+           *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
            esac
-           test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+           test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
            ;;
          uninstall)
            if test -n "$library_names"; then
@@ -8295,19 +9558,19 @@ func_mode_uninstall ()
          # Add PIC object to the list of files to remove.
          if test -n "$pic_object" &&
             test "$pic_object" != none; then
-           rmfiles="$rmfiles $dir/$pic_object"
+           func_append rmfiles " $dir/$pic_object"
          fi
 
          # Add non-PIC object to the list of files to remove.
          if test -n "$non_pic_object" &&
             test "$non_pic_object" != none; then
-           rmfiles="$rmfiles $dir/$non_pic_object"
+           func_append rmfiles " $dir/$non_pic_object"
          fi
        fi
        ;;
 
       *)
-       if test "$mode" = clean ; then
+       if test "$opt_mode" = clean ; then
          noexename=$name
          case $file in
          *.exe)
@@ -8317,7 +9580,7 @@ func_mode_uninstall ()
            noexename=$func_stripname_result
            # $file with .exe has already been added to rmfiles,
            # add $file without .exe
-           rmfiles="$rmfiles $file"
+           func_append rmfiles " $file"
            ;;
          esac
          # Do a test to see if this is a libtool program.
@@ -8326,7 +9589,7 @@ func_mode_uninstall ()
              func_ltwrapper_scriptname "$file"
              relink_command=
              func_source $func_ltwrapper_scriptname_result
-             rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
+             func_append rmfiles " $func_ltwrapper_scriptname_result"
            else
              relink_command=
              func_source $dir/$noexename
@@ -8334,12 +9597,12 @@ func_mode_uninstall ()
 
            # note $name still contains .exe if it was in $file originally
            # as does the version of $file that was added into $rmfiles
-           rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+           func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
            if test "$fast_install" = yes && test -n "$relink_command"; then
-             rmfiles="$rmfiles $objdir/lt-$name"
+             func_append rmfiles " $odir/lt-$name"
            fi
            if test "X$noexename" != "X$name" ; then
-             rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+             func_append rmfiles " $odir/lt-${noexename}.c"
            fi
          fi
        fi
@@ -8347,7 +9610,6 @@ func_mode_uninstall ()
       esac
       func_show_eval "$RM $rmfiles" 'exit_status=1'
     done
-    objdir="$origobjdir"
 
     # Try to remove the ${objdir}s in the directories where we deleted files
     for dir in $rmdirs; do
@@ -8359,16 +9621,16 @@ func_mode_uninstall ()
     exit $exit_status
 }
 
-{ test "$mode" = uninstall || test "$mode" = clean; } &&
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
     func_mode_uninstall ${1+"$@"}
 
-test -z "$mode" && {
+test -z "$opt_mode" && {
   help="$generic_help"
   func_fatal_help "you must specify a MODE"
 }
 
 test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$mode'"
+  func_fatal_help "invalid operation mode \`$opt_mode'"
 
 if test -n "$exec_cmd"; then
   eval exec "$exec_cmd"
diff --git a/m4/.empty b/m4/.empty
new file mode 100644 (file)
index 0000000..8381f5a
--- /dev/null
+++ b/m4/.empty
@@ -0,0 +1 @@
+Directory needed by autoconf, but hg doesn't track empty dirs.
index 39ba996..44e0ecf 100644 (file)
@@ -1,7 +1,8 @@
 # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
 #
 #   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
 #   Written by Gordon Matzigkeit, 1996
 #
 # This file is free software; the Free Software Foundation gives
@@ -10,7 +11,8 @@
 
 m4_define([_LT_COPYING], [dnl
 #   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
 #   Written by Gordon Matzigkeit, 1996
 #
 #   This file is part of GNU Libtool.
@@ -37,7 +39,7 @@ m4_define([_LT_COPYING], [dnl
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 ])
 
-# serial 56 LT_INIT
+# serial 57 LT_INIT
 
 
 # LT_PREREQ(VERSION)
@@ -66,6 +68,7 @@ esac
 # ------------------
 AC_DEFUN([LT_INIT],
 [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
 AC_BEFORE([$0], [LT_LANG])dnl
 AC_BEFORE([$0], [LT_OUTPUT])dnl
 AC_BEFORE([$0], [LTDL_INIT])dnl
@@ -82,6 +85,8 @@ AC_REQUIRE([LTVERSION_VERSION])dnl
 AC_REQUIRE([LTOBSOLETE_VERSION])dnl
 m4_require([_LT_PROG_LTMAIN])dnl
 
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
 dnl Parse OPTIONS
 _LT_SET_OPTIONS([$0], [$1])
 
@@ -118,7 +123,7 @@ m4_defun([_LT_CC_BASENAME],
     *) break;;
   esac
 done
-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
 ])
 
 
@@ -138,6 +143,11 @@ m4_defun([_LT_FILEUTILS_DEFAULTS],
 m4_defun([_LT_SETUP],
 [AC_REQUIRE([AC_CANONICAL_HOST])dnl
 AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
 _LT_DECL([], [host_alias], [0], [The host system])dnl
 _LT_DECL([], [host], [0])dnl
 _LT_DECL([], [host_os], [0])dnl
@@ -160,10 +170,13 @@ _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
 dnl
 m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
 m4_require([_LT_CMD_RELOAD])dnl
 m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
 m4_require([_LT_CMD_OLD_ARCHIVE])dnl
 m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
 
 _LT_CONFIG_LIBTOOL_INIT([
 # See if we are running on zsh, and set the options which allow our
@@ -179,7 +192,6 @@ fi
 _LT_CHECK_OBJDIR
 
 m4_require([_LT_TAG_COMPILER])dnl
-_LT_PROG_ECHO_BACKSLASH
 
 case $host_os in
 aix3*)
@@ -193,23 +205,6 @@ aix3*)
   ;;
 esac
 
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
 # Global variables:
 ofile=libtool
 can_build_shared=yes
@@ -250,6 +245,28 @@ _LT_CONFIG_COMMANDS
 ])# _LT_SETUP
 
 
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
 # _LT_PROG_LTMAIN
 # ---------------
 # Note that this code is called both from `configure', and `config.status'
@@ -408,7 +425,7 @@ m4_define([_lt_decl_all_varnames],
 # declaration there will have the same value as in `configure'.  VARNAME
 # must have a single quote delimited value for this to work.
 m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`'])
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
 
 
 # _LT_CONFIG_STATUS_DECLARATIONS
@@ -418,7 +435,7 @@ m4_define([_LT_CONFIG_STATUS_DECLARE],
 # embedded single quotes properly.  In configure, this macro expands
 # each variable declared with _LT_DECL (and _LT_TAGDECL) into:
 #
-#    <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`'
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
 m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
 [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
     [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
@@ -517,12 +534,20 @@ LTCC='$LTCC'
 LTCFLAGS='$LTCFLAGS'
 compiler='$compiler_DEFAULT'
 
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
 # Quote evaled strings.
 for var in lt_decl_all_varnames([[ \
 ]], lt_decl_quote_varnames); do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -533,9 +558,9 @@ done
 # Double-quote double-evaled strings.
 for var in lt_decl_all_varnames([[ \
 ]], lt_decl_dquote_varnames); do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -543,16 +568,38 @@ for var in lt_decl_all_varnames([[ \
     esac
 done
 
-# Fix-up fallback echo if it was mangled by the above quoting rules.
-case \$lt_ECHO in
-*'\\\[$]0 --fallback-echo"')dnl "
-  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
-  ;;
-esac
-
 _LT_OUTPUT_LIBTOOL_INIT
 ])
 
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
 
 # LT_OUTPUT
 # ---------
@@ -562,20 +609,11 @@ _LT_OUTPUT_LIBTOOL_INIT
 AC_DEFUN([LT_OUTPUT],
 [: ${CONFIG_LT=./config.lt}
 AC_MSG_NOTICE([creating $CONFIG_LT])
-cat >"$CONFIG_LT" <<_LTEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate a libtool stub with the current configuration.
-
-lt_cl_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_LTEOF
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
 
 cat >>"$CONFIG_LT" <<\_LTEOF
-AS_SHELL_SANITIZE
-_AS_PREPARE
-
-exec AS_MESSAGE_FD>&1
+lt_cl_silent=false
 exec AS_MESSAGE_LOG_FD>>config.log
 {
   echo
@@ -601,7 +639,7 @@ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
 m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
 configured by $[0], generated by m4_PACKAGE_STRING.
 
-Copyright (C) 2008 Free Software Foundation, Inc.
+Copyright (C) 2011 Free Software Foundation, Inc.
 This config.lt script is free software; the Free Software Foundation
 gives unlimited permision to copy, distribute and modify it."
 
@@ -646,15 +684,13 @@ chmod +x "$CONFIG_LT"
 # appending to config.log, which fails on DOS, as config.log is still kept
 # open by configure.  Here we exec the FD to /dev/null, effectively closing
 # config.log, so it can be properly (re)opened and appended to by config.lt.
-if test "$no_create" != yes; then
-  lt_cl_success=:
-  test "$silent" = yes &&
-    lt_config_lt_args="$lt_config_lt_args --quiet"
-  exec AS_MESSAGE_LOG_FD>/dev/null
-  $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-  exec AS_MESSAGE_LOG_FD>>config.log
-  $lt_cl_success || AS_EXIT(1)
-fi
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
 ])# LT_OUTPUT
 
 
@@ -717,15 +753,12 @@ _LT_EOF
   # if finds mixed CR/LF and LF-only lines.  Since sed operates in
   # text mode, it properly converts lines to CR/LF.  This bash problem
   # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  _LT_PROG_XSI_SHELLFNS
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
 
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
+  _LT_PROG_REPLACE_SHELLFNS
 
-  mv -f "$cfgfile" "$ofile" ||
+   mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
 ],
@@ -770,6 +803,7 @@ AC_DEFUN([LT_LANG],
 m4_case([$1],
   [C],                 [_LT_LANG(C)],
   [C++],               [_LT_LANG(CXX)],
+  [Go],                        [_LT_LANG(GO)],
   [Java],              [_LT_LANG(GCJ)],
   [Fortran 77],                [_LT_LANG(F77)],
   [Fortran],           [_LT_LANG(FC)],
@@ -791,6 +825,31 @@ m4_defun([_LT_LANG],
 ])# _LT_LANG
 
 
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
 # _LT_LANG_DEFAULT_CONFIG
 # -----------------------
 m4_defun([_LT_LANG_DEFAULT_CONFIG],
@@ -821,6 +880,10 @@ AC_PROVIDE_IFELSE([AC_PROG_GCJ],
        m4_ifdef([LT_PROG_GCJ],
        [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
 
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
 AC_PROVIDE_IFELSE([LT_PROG_RC],
   [LT_LANG(RC)],
   [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
@@ -831,11 +894,13 @@ AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
 AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
 AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
 AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
 dnl aclocal-1.4 backwards compatibility:
 dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
 dnl AC_DEFUN([AC_LIBTOOL_F77], [])
 dnl AC_DEFUN([AC_LIBTOOL_FC], [])
 dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
 
 
 # _LT_TAG_COMPILER
@@ -921,7 +986,13 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
        $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
          -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
         _lt_result=$?
-       if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+       # If there is a non-empty error log, and "single_module"
+       # appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+         cat conftest.err >&AS_MESSAGE_LOG_FD
+       # Otherwise, if the output was created with a 0 exit code from
+       # the compiler, it worked.
+       elif test -f libconftest.dylib && test $_lt_result -eq 0; then
          lt_cv_apple_cc_single_mod=yes
        else
          cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -929,6 +1000,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
        rm -rf libconftest.dylib*
        rm -f conftest.*
       fi])
+
     AC_CACHE_CHECK([for -exported_symbols_list linker flag],
       [lt_cv_ld_exported_symbols_list],
       [lt_cv_ld_exported_symbols_list=no
@@ -940,6 +1012,34 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
        [lt_cv_ld_exported_symbols_list=no])
        LDFLAGS="$save_LDFLAGS"
     ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+       cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+       lt_cv_ld_force_load=yes
+      else
+       cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
     case $host_os in
     rhapsody* | darwin1.[[012]])
       _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
@@ -967,7 +1067,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
     else
       _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
     fi
-    if test "$DSYMUTIL" != ":"; then
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
@@ -977,8 +1077,8 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
 ])
 
 
-# _LT_DARWIN_LINKER_FEATURES
-# --------------------------
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
 # Checks for linker and compiler features on darwin
 m4_defun([_LT_DARWIN_LINKER_FEATURES],
 [
@@ -987,7 +1087,13 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
   _LT_TAGVAR(hardcode_direct, $1)=no
   _LT_TAGVAR(hardcode_automatic, $1)=yes
   _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
   _LT_TAGVAR(link_all_deplibs, $1)=yes
   _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
   case $cc_basename in
@@ -995,7 +1101,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
      *) _lt_dar_can_shared=$GCC ;;
   esac
   if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=echo
+    output_verbose_link_cmd=func_echo_all
     _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
     _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
     _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
@@ -1011,203 +1117,142 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
   fi
 ])
 
-# _LT_SYS_MODULE_PATH_AIX
-# -----------------------
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
 # Links a minimal program and checks the executable
 # for the system default hardcoded library path. In most cases,
 # this is /usr/lib:/lib, but when the MPI compilers are used
 # the location of the communication and MPI libs are included too.
 # If we don't find anything, use the default library path according
 # to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
 m4_defun([_LT_SYS_MODULE_PATH_AIX],
 [m4_require([_LT_DECL_SED])dnl
-AC_LINK_IFELSE(AC_LANG_PROGRAM,[
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-       /^0/ {
-           s/^0  *\(.*\)$/\1/
-           p
-       }
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi],[])
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+         /^0/ {
+             s/^0  *\([^ ]*\) *$/\1/
+             p
+         }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
 ])# _LT_SYS_MODULE_PATH_AIX
 
 
 # _LT_SHELL_INIT(ARG)
 # -------------------
 m4_define([_LT_SHELL_INIT],
-[ifdef([AC_DIVERSION_NOTICE],
-            [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
-        [AC_DIVERT_PUSH(NOTICE)])
-$1
-AC_DIVERT_POP
-])# _LT_SHELL_INIT
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
 
 
 # _LT_PROG_ECHO_BACKSLASH
 # -----------------------
-# Add some code to the start of the generated configure script which
-# will find an echo command which doesn't interpret backslashes.
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
 m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[_LT_SHELL_INIT([
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$lt_ECHO in
-X*--fallback-echo)
-  # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
-  ;;
-esac
-
-ECHO=${lt_ECHO-echo}
-if test "X[$]1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X[$]1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $ECHO works!
-  :
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
 else
-  # Restart under the correct shell.
-  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
-fi
-
-if test "X[$]1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<_LT_EOF
-[$]*
-_LT_EOF
-  exit 0
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
 fi
 
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$lt_ECHO"; then
-  if test "X${echo_test_string+set}" != Xset; then
-    # find a string as large as possible, as long as the shell can cope with it
-    for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
-      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
-        { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
-      then
-        break
-      fi
-    done
-  fi
-
-  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-     test "X$echo_testing_string" = "X$echo_test_string"; then
-    :
-  else
-    # The Solaris, AIX, and Digital Unix default echo programs unquote
-    # backslashes.  This makes it impossible to quote backslashes using
-    #   echo "$something" | sed 's/\\/\\\\/g'
-    #
-    # So, first we look for a working echo in the user's PATH.
-
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for dir in $PATH /usr/ucb; do
-      IFS="$lt_save_ifs"
-      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        ECHO="$dir/echo"
-        break
-      fi
-    done
-    IFS="$lt_save_ifs"
-
-    if test "X$ECHO" = Xecho; then
-      # We didn't find a better echo, so look for alternatives.
-      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        # This shell has a builtin print -r that does the trick.
-        ECHO='print -r'
-      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
-          test "X$CONFIG_SHELL" != X/bin/ksh; then
-        # If we have ksh, try running configure again with it.
-        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-        export ORIGINAL_CONFIG_SHELL
-        CONFIG_SHELL=/bin/ksh
-        export CONFIG_SHELL
-        exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
-      else
-        # Try using printf.
-        ECHO='printf %s\n'
-        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-          echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-          test "X$echo_testing_string" = "X$echo_test_string"; then
-         # Cool, printf works
-         :
-        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-            test "X$echo_testing_string" = 'X\t' &&
-            echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-            test "X$echo_testing_string" = "X$echo_test_string"; then
-         CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-         export CONFIG_SHELL
-         SHELL="$CONFIG_SHELL"
-         export SHELL
-         ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
-        elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-            test "X$echo_testing_string" = 'X\t' &&
-            echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-            test "X$echo_testing_string" = "X$echo_test_string"; then
-         ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
-        else
-         # maybe with a smaller string...
-         prev=:
-
-         for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
-           if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
-           then
-             break
-           fi
-           prev="$cmd"
-         done
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*" 
+}
 
-         if test "$prev" != 'sed 50q "[$]0"'; then
-           echo_test_string=`eval $prev`
-           export echo_test_string
-           exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
-         else
-           # Oops.  We lost completely, so just stick with echo.
-           ECHO=echo
-         fi
-        fi
-      fi
-    fi
-  fi
-fi
+case "$ECHO" in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
 
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-lt_ECHO=$ECHO
-if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
-   lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
-fi
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
 
-AC_SUBST(lt_ECHO)
-])
 _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1],
-    [An echo program that does not interpret backslashes])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
 ])# _LT_PROG_ECHO_BACKSLASH
 
 
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[  --with-sysroot[=DIR] Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
 # _LT_ENABLE_LOCK
 # ---------------
 m4_defun([_LT_ENABLE_LOCK],
@@ -1236,7 +1281,7 @@ ia64-*-hpux*)
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     if test "$lt_cv_prog_gnu_ld" = yes; then
       case `/usr/bin/file conftest.$ac_objext` in
@@ -1329,14 +1374,27 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
     CFLAGS="$SAVE_CFLAGS"
   fi
   ;;
-sparc*-*solaris*)
+*-*solaris*)
   # Find out which ABI we are using.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
     *64-bit*)
       case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
       *)
        if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
          LD="${LD-ld} -64"
@@ -1354,14 +1412,47 @@ need_locks="$enable_libtool_lock"
 ])# _LT_ENABLE_LOCK
 
 
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test "$ac_status" -eq 0; then
+       # Ensure the archiver fails upon bogus file names.
+       rm -f conftest.$ac_objext libconftest.a
+       AC_TRY_EVAL([lt_ar_try])
+       if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
 # _LT_CMD_OLD_ARCHIVE
 # -------------------
 m4_defun([_LT_CMD_OLD_ARCHIVE],
-[AC_CHECK_TOOL(AR, ar, false)
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1])
+[_LT_PROG_AR
 
 AC_CHECK_TOOL(STRIP, strip, :)
 test -z "$STRIP" && STRIP=:
@@ -1380,18 +1471,27 @@ old_postuninstall_cmds=
 if test -n "$RANLIB"; then
   case $host_os in
   openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
     ;;
   esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
 fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
 _LT_DECL([], [old_postinstall_cmds], [2])
 _LT_DECL([], [old_postuninstall_cmds], [2])
 _LT_TAGDECL([], [old_archive_cmds], [2],
     [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
 ])# _LT_CMD_OLD_ARCHIVE
 
 
@@ -1416,15 +1516,15 @@ AC_CACHE_CHECK([$1], [$2],
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
      $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
      if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
        $2=yes
@@ -1464,7 +1564,7 @@ AC_CACHE_CHECK([$1], [$2],
      if test -s conftest.err; then
        # Append any errors to the config.log.
        cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
        $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
        if diff conftest.exp conftest.er2 >/dev/null; then
          $2=yes
@@ -1527,6 +1627,11 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
   amigaos*)
     # On AmigaOS with pdksh, this test takes hours, literally.
     # So we just punt and use a minimum line length of 8192.
@@ -1552,6 +1657,11 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     lt_cv_sys_max_cmd_len=196608
     ;;
 
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
   osf*)
     # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
     # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
@@ -1591,8 +1701,8 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
-                = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+                = "X$teststring$teststring"; } >/dev/null 2>&1 &&
              test $i != 17 # 1/2 MB should be enough
       do
         i=`expr $i + 1`
@@ -1643,7 +1753,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-[#line __oline__ "configure"
+[#line $LINENO "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -1684,7 +1794,13 @@ else
 #  endif
 #endif
 
-void fnord() { int i=42;}
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
 int main ()
 {
   void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
@@ -1693,7 +1809,11 @@ int main ()
   if (self)
     {
       if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      else
+        {
+         if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+       }
       /* dlclose (self); */
     }
   else
@@ -1869,16 +1989,16 @@ AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
      $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
      if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
        _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
@@ -2037,6 +2157,7 @@ m4_require([_LT_DECL_EGREP])dnl
 m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_OBJDUMP])dnl
 m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
 AC_MSG_CHECKING([dynamic linker characteristics])
 m4_if([$1],
        [], [
@@ -2045,16 +2166,23 @@ if test "$GCC" = yes; then
     darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
     *) lt_awk_arg="/^libraries:/" ;;
   esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
     # if the path contains ";" then we assume it to be the separator
     # otherwise default to the standard path separator (i.e. ":") - it is
     # assumed that no part of a normal pathname contains ";" but that should
     # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
   # Ok, now we have the path, separated by spaces, we can step through it
   # and add multilib dir if necessary.
   lt_tmp_lt_search_path_spec=
@@ -2067,7 +2195,7 @@ if test "$GCC" = yes; then
        lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
-  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
 BEGIN {RS=" "; FS="/|\n";} {
   lt_foo="";
   lt_count=0;
@@ -2087,7 +2215,13 @@ BEGIN {RS=" "; FS="/|\n";} {
   if (lt_foo != "") { lt_freq[[lt_foo]]++; }
   if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
 }'`
-  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
   sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
 fi])
@@ -2113,7 +2247,7 @@ need_version=unknown
 
 case $host_os in
 aix3*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
@@ -2122,7 +2256,7 @@ aix3*)
   ;;
 
 aix[[4-9]]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
@@ -2175,7 +2309,7 @@ amigaos*)
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
@@ -2187,7 +2321,7 @@ beos*)
   ;;
 
 bsdi[[45]]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
@@ -2206,8 +2340,9 @@ cygwin* | mingw* | pw32* | cegcc*)
   need_version=no
   need_lib_prefix=no
 
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
     postinstall_cmds='base_file=`basename \${file}`~
@@ -2228,36 +2363,83 @@ cygwin* | mingw* | pw32* | cegcc*)
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
       soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
       soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
       library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
       ;;
     esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
     ;;
 
   *)
+    # Assume MSVC wrapper
     library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
     ;;
   esac
-  dynamic_linker='Win32 ld.exe'
   # FIXME: first we should search . and the directory the executable is in
   shlibpath_var=PATH
   ;;
@@ -2278,7 +2460,7 @@ m4_if([$1], [],[
   ;;
 
 dgux*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
@@ -2286,10 +2468,6 @@ dgux*)
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
 freebsd* | dragonfly*)
   # DragonFly does not have aout.  When/if they implement a new
   # versioning mechanism, adjust this.
@@ -2297,7 +2475,7 @@ freebsd* | dragonfly*)
     objformat=`/usr/bin/objformat`
   else
     case $host_os in
-    freebsd[[123]]*) objformat=aout ;;
+    freebsd[[23]].*) objformat=aout ;;
     *) objformat=elf ;;
     esac
   fi
@@ -2315,7 +2493,7 @@ freebsd* | dragonfly*)
   esac
   shlibpath_var=LD_LIBRARY_PATH
   case $host_os in
-  freebsd2*)
+  freebsd2.*)
     shlibpath_overrides_runpath=yes
     ;;
   freebsd3.[[01]]* | freebsdelf3.[[01]]*)
@@ -2335,12 +2513,26 @@ freebsd* | dragonfly*)
   ;;
 
 gnu*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
 
@@ -2386,12 +2578,14 @@ hpux9* | hpux10* | hpux11*)
     soname_spec='${libname}${release}${shared_ext}$major'
     ;;
   esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
   postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
   ;;
 
 interix[[3-9]]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
@@ -2407,7 +2601,7 @@ irix5* | irix6* | nonstopux*)
     nonstopux*) version_type=nonstopux ;;
     *)
        if test "$lt_cv_prog_gnu_ld" = yes; then
-               version_type=linux
+               version_type=linux # correct to gnu/linux during the next big refactor
        else
                version_type=irix
        fi ;;
@@ -2444,9 +2638,9 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
-# This must be Linux ELF.
-linux* | k*bsd*-gnu)
-  version_type=linux
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -2454,16 +2648,21 @@ linux* | k*bsd*-gnu)
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
+
   # Some binutils ld are patched to set DT_RUNPATH
-  save_LDFLAGS=$LDFLAGS
-  save_libdir=$libdir
-  eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
-       LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
-  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-    [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
-       [shlibpath_overrides_runpath=yes])])
-  LDFLAGS=$save_LDFLAGS
-  libdir=$save_libdir
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+        LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+        [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
 
   # This implies no fast_install, which is unacceptable.
   # Some rework will be needed to allow for fast_install
@@ -2472,7 +2671,7 @@ linux* | k*bsd*-gnu)
 
   # Append ld.so.conf contents to the search path
   if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[  ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[  ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
   fi
 
@@ -2504,7 +2703,7 @@ netbsd*)
   ;;
 
 newsos6)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
@@ -2573,7 +2772,7 @@ rdos*)
   ;;
 
 solaris*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -2598,7 +2797,7 @@ sunos4*)
   ;;
 
 sysv4 | sysv4.3*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
@@ -2622,7 +2821,7 @@ sysv4 | sysv4.3*)
 
 sysv4*MP*)
   if test -d /usr/nec ;then
-    version_type=linux
+    version_type=linux # correct to gnu/linux during the next big refactor
     library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
     soname_spec='$libname${shared_ext}.$major'
     shlibpath_var=LD_LIBRARY_PATH
@@ -2653,7 +2852,7 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
 
 tpf*)
   # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -2663,7 +2862,7 @@ tpf*)
   ;;
 
 uts4*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
@@ -2705,6 +2904,8 @@ _LT_DECL([], [library_names_spec], [1],
     The last name is the one that the linker finds with -lNAME]])
 _LT_DECL([], [soname_spec], [1],
     [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
 _LT_DECL([], [postinstall_cmds], [2],
     [Command to use after installation of a shared archive])
 _LT_DECL([], [postuninstall_cmds], [2],
@@ -2817,6 +3018,7 @@ AC_REQUIRE([AC_CANONICAL_HOST])dnl
 AC_REQUIRE([AC_CANONICAL_BUILD])dnl
 m4_require([_LT_DECL_SED])dnl
 m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
 
 AC_ARG_WITH([gnu-ld],
     [AS_HELP_STRING([--with-gnu-ld],
@@ -2938,6 +3140,11 @@ case $reload_flag in
 esac
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
   darwin*)
     if test "$GCC" = yes; then
       reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
@@ -2946,8 +3153,8 @@ case $host_os in
     fi
     ;;
 esac
-_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_DECL([], [reload_cmds], [2])dnl
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
 ])# _LT_CMD_RELOAD
 
 
@@ -2999,16 +3206,18 @@ mingw* | pw32*)
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
-  if ( file / ) >/dev/null 2>&1; then
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
     lt_cv_file_magic_cmd='$OBJDUMP -f'
   fi
   ;;
 
-cegcc)
+cegcc*)
   # use the weaker test based on 'objdump'. See mingw*.
   lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
   lt_cv_file_magic_cmd='$OBJDUMP -f'
@@ -3038,6 +3247,10 @@ gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
 hpux10.20* | hpux11*)
   lt_cv_file_magic_cmd=/usr/bin/file
   case $host_cpu in
@@ -3046,11 +3259,11 @@ hpux10.20* | hpux11*)
     lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
     ;;
   hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
     lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
     ;;
   *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
     lt_cv_file_magic_test_file=/usr/lib/libc.sl
     ;;
   esac
@@ -3071,8 +3284,8 @@ irix5* | irix6* | nonstopux*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-# This must be Linux ELF.
-linux* | k*bsd*-gnu)
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
@@ -3150,6 +3363,21 @@ tpf*)
   ;;
 esac
 ])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
 file_magic_cmd=$lt_cv_file_magic_cmd
 deplibs_check_method=$lt_cv_deplibs_check_method
 test -z "$deplibs_check_method" && deplibs_check_method=unknown
@@ -3157,7 +3385,11 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown
 _LT_DECL([], [deplibs_check_method], [1],
     [Method to check whether dependent libraries are shared objects])
 _LT_DECL([], [file_magic_cmd], [1],
-    [Command to use when deplibs_check_method == "file_magic"])
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
 ])# _LT_CHECK_MAGIC_METHOD
 
 
@@ -3214,7 +3446,19 @@ if test "$lt_cv_path_NM" != "no"; then
   NM="$lt_cv_path_NM"
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
-  AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :)
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
   AC_SUBST([DUMPBIN])
   if test "$DUMPBIN" != ":"; then
     NM="$DUMPBIN"
@@ -3227,13 +3471,13 @@ _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
 AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
   [lt_cv_nm_interface="BSD nm"
   echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
   (eval "$ac_compile" 2>conftest.err)
   cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
   (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
   cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD)
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
   cat conftest.out >&AS_MESSAGE_LOG_FD
   if $GREP 'External.*some_variable' conftest.out > /dev/null; then
     lt_cv_nm_interface="MS dumpbin"
@@ -3248,15 +3492,76 @@ dnl aclocal-1.4 backwards compatibility:
 dnl AC_DEFUN([AM_PROG_NM], [])
 dnl AC_DEFUN([AC_PROG_NM], [])
 
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
 
-# LT_LIB_M
-# --------
-# check for math library
-AC_DEFUN([LT_LIB_M],
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
 [AC_REQUIRE([AC_CANONICAL_HOST])dnl
 LIBM=
 case $host in
-*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
   # These system don't have libm, or don't need it
   ;;
 *-ncr-sysv4.3*)
@@ -3284,7 +3589,12 @@ m4_defun([_LT_COMPILER_NO_RTTI],
 _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
 
 if test "$GCC" = yes; then
-  _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
 
   _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
     lt_cv_prog_compiler_rtti_exceptions,
@@ -3301,6 +3611,7 @@ _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
 m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
 [AC_REQUIRE([AC_CANONICAL_HOST])dnl
 AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
 AC_REQUIRE([LT_PATH_NM])dnl
 AC_REQUIRE([LT_PATH_LD])dnl
 m4_require([_LT_DECL_SED])dnl
@@ -3368,8 +3679,8 @@ esac
 lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
 
 # Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
 
 # Handle CRLF in mingw tool chain
 opt_cr=
@@ -3393,6 +3704,7 @@ for ac_symprfx in "" "_"; do
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK ['"\
 "     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
@@ -3405,6 +3717,7 @@ for ac_symprfx in "" "_"; do
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[    ]]\($symcode$symcode*\)[[       ]][[    ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
   fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
 
   # Check to see that the pipe works correctly.
   pipe_works=no
@@ -3426,7 +3739,7 @@ _LT_EOF
   if AC_TRY_EVAL(ac_compile); then
     # Now try to grab the symbols.
     nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
       # Try sorting and uniquifying the output.
       if sort "$nlist" | uniq > "$nlist"T; then
        mv -f "$nlist"T "$nlist"
@@ -3438,6 +3751,18 @@ _LT_EOF
       if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
        if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
          cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t@_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -3449,7 +3774,7 @@ _LT_EOF
          cat <<_LT_EOF >> conftest.$ac_ext
 
 /* The mapping between symbol names and symbols.  */
-const struct {
+LT@&t@_DLSYM_CONST struct {
   const char *name;
   void       *address;
 }
@@ -3475,15 +3800,15 @@ static const void *lt_preloaded_setup() {
 _LT_EOF
          # Now try linking the two files.
          mv conftest.$ac_objext conftstm.$ac_objext
-         lt_save_LIBS="$LIBS"
-         lt_save_CFLAGS="$CFLAGS"
+         lt_globsym_save_LIBS=$LIBS
+         lt_globsym_save_CFLAGS=$CFLAGS
          LIBS="conftstm.$ac_objext"
          CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
          if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
            pipe_works=yes
          fi
-         LIBS="$lt_save_LIBS"
-         CFLAGS="$lt_save_CFLAGS"
+         LIBS=$lt_globsym_save_LIBS
+         CFLAGS=$lt_globsym_save_CFLAGS
        else
          echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
        fi
@@ -3516,6 +3841,13 @@ else
   AC_MSG_RESULT(ok)
 fi
 
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
 _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
     [Take the output of nm and produce a listing of raw symbols and C names])
 _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
@@ -3526,6 +3858,8 @@ _LT_DECL([global_symbol_to_c_name_address],
 _LT_DECL([global_symbol_to_c_name_address_lib_prefix],
     [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
     [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
 ]) # _LT_CMD_GLOBAL_SYMBOLS
 
 
@@ -3537,7 +3871,6 @@ _LT_TAGVAR(lt_prog_compiler_wl, $1)=
 _LT_TAGVAR(lt_prog_compiler_pic, $1)=
 _LT_TAGVAR(lt_prog_compiler_static, $1)=
 
-AC_MSG_CHECKING([for $compiler option to produce PIC])
 m4_if([$1], [CXX], [
   # C++ specific cases for pic, static, wl, etc.
   if test "$GXX" = yes; then
@@ -3588,6 +3921,11 @@ m4_if([$1], [CXX], [
       # DJGPP does not support shared libraries at all
       _LT_TAGVAR(lt_prog_compiler_pic, $1)=
       ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
     interix[[3-9]]*)
       # Interix 3.x gcc -fpic/-fPIC options generate broken code.
       # Instead, we relocate shared libraries at runtime.
@@ -3637,6 +3975,12 @@ m4_if([$1], [CXX], [
          ;;
        esac
        ;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+       # This hack is so that the source file can tell whether it is being
+       # built for inclusion in a dll (and should export symbols for example).
+       m4_if([$1], [GCJ], [],
+         [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+       ;;
       dgux*)
        case $cc_basename in
          ec++*)
@@ -3693,7 +4037,7 @@ m4_if([$1], [CXX], [
            ;;
        esac
        ;;
-      linux* | k*bsd*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
        case $cc_basename in
          KCC*)
            # KAI C++ Compiler
@@ -3726,8 +4070,8 @@ m4_if([$1], [CXX], [
            _LT_TAGVAR(lt_prog_compiler_pic, $1)=
            _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
            ;;
-         xlc* | xlC*)
-           # IBM XL 8.0 on PPC
+         xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+           # IBM XL 8.0, 9.0 on PPC and BlueGene
            _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
            _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
@@ -3789,7 +4133,7 @@ m4_if([$1], [CXX], [
        ;;
       solaris*)
        case $cc_basename in
-         CC*)
+         CC* | sunCC*)
            # Sun C++ 4.2, 5.x and Centerline C++
            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
            _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
@@ -3893,6 +4237,12 @@ m4_if([$1], [CXX], [
       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
       ;;
 
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
     hpux*)
       # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
       # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
@@ -3935,6 +4285,15 @@ m4_if([$1], [CXX], [
       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       ;;
     esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
   else
     # PORTME Check for flag to pass linker flags through the system compiler.
     case $host_os in
@@ -3977,7 +4336,7 @@ m4_if([$1], [CXX], [
       _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -3998,7 +4357,13 @@ m4_if([$1], [CXX], [
        _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
        _LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
        ;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
+      nagfor*)
+       # NAG Fortran compiler
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+       ;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
        # which looks to be a dead project)
        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
@@ -4010,25 +4375,40 @@ m4_if([$1], [CXX], [
         # All Alpha code is PIC.
         _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
         ;;
-      xl*)
-       # IBM XL C 8.0/Fortran 10.1 on PPC
+      xl* | bgxl* | bgf* | mpixl*)
+       # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
        ;;
       *)
        case `$CC -V 2>&1 | sed 5q` in
+       *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+         # Sun Fortran 8.3 passes all unrecognized flags to the linker
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+         ;;
+       *Sun\ F* | *Sun*Fortran*)
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+         ;;
        *Sun\ C*)
          # Sun C 5.9
          _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
          _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
          _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
          ;;
-       *Sun\ F*)
-         # Sun Fortran 8.3 passes all unrecognized flags to the linker
-         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+        *Intel*\ [[CF]]*Compiler*)
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+         ;;
+       *Portland\ Group*)
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
          _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-         _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
          ;;
        esac
        ;;
@@ -4060,7 +4440,7 @@ m4_if([$1], [CXX], [
       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       case $cc_basename in
-      f77* | f90* | f95*)
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
       *)
        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
@@ -4117,9 +4497,11 @@ case $host_os in
     _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
     ;;
 esac
-AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
-       [How to pass a linker flag through the compiler])
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
 
 #
 # Check to make sure the PIC flag actually works.
@@ -4138,6 +4520,8 @@ fi
 _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
        [Additional compiler flags for building library objects])
 
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+       [How to pass a linker flag through the compiler])
 #
 # Check to make sure the static flag actually works.
 #
@@ -4158,6 +4542,7 @@ _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
 m4_defun([_LT_LINKER_SHLIBS],
 [AC_REQUIRE([LT_PATH_LD])dnl
 AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
 m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_EGREP])dnl
 m4_require([_LT_DECL_SED])dnl
@@ -4166,27 +4551,37 @@ m4_require([_LT_TAG_COMPILER])dnl
 AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
 m4_if([$1], [CXX], [
   _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
   case $host_os in
   aix[[4-9]]*)
     # If we're using GNU nm, then we don't want the "-C" option.
     # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
     if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
     else
       _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
     fi
     ;;
   pw32*)
     _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-  ;;
+    ;;
   cygwin* | mingw* | cegcc*)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
   *)
     _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
+    ;;
   esac
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
 ], [
   runpath_var=
   _LT_TAGVAR(allow_undefined_flag, $1)=
@@ -4201,7 +4596,6 @@ m4_if([$1], [CXX], [
   _LT_TAGVAR(hardcode_direct, $1)=no
   _LT_TAGVAR(hardcode_direct_absolute, $1)=no
   _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
   _LT_TAGVAR(hardcode_libdir_separator, $1)=
   _LT_TAGVAR(hardcode_minus_L, $1)=no
   _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
@@ -4249,7 +4643,33 @@ dnl Note also adjust exclude_expsyms for C++ above.
   esac
 
   _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
   if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+       # The AIX port of GNU ld has always aspired to compatibility
+       # with the native linker.  However, as the warning in the GNU ld
+       # block says, versions before 2.19.5* couldn't really create working
+       # shared libraries, regardless of the interface used.
+       case `$LD -v 2>&1` in
+         *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+         *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+         *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+         *)
+           lt_use_gnu_ld_interface=yes
+           ;;
+       esac
+       ;;
+      *)
+       lt_use_gnu_ld_interface=yes
+       ;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
     # If archive_cmds runs LD, not CC, wlarc should be empty
     wlarc='${wl}'
 
@@ -4267,6 +4687,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     fi
     supports_anon_versioning=no
     case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
       *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
@@ -4282,11 +4703,12 @@ dnl Note also adjust exclude_expsyms for C++ above.
        _LT_TAGVAR(ld_shlibs, $1)=no
        cat <<_LT_EOF 1>&2
 
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** Warning: the GNU linker, at least up to release 2.19, is reported
 *** to be unable to reliably create shared libraries on AIX.
 *** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
 
 _LT_EOF
       fi
@@ -4322,10 +4744,12 @@ _LT_EOF
       # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
       # as there is no search path for DLLs.
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
       _LT_TAGVAR(always_export_symbols, $1)=no
       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
@@ -4343,6 +4767,11 @@ _LT_EOF
       fi
       ;;
 
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
     interix[[3-9]]*)
       _LT_TAGVAR(hardcode_direct, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
@@ -4358,7 +4787,7 @@ _LT_EOF
       _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
-    gnu* | linux* | tpf* | k*bsd*-gnu)
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
       if test "$host_os" = linux-dietlibc; then
        case $cc_basename in
@@ -4368,15 +4797,16 @@ _LT_EOF
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
         && test "$tmp_diet" = no
       then
-       tmp_addflag=
+       tmp_addflag=' $pic_flag'
        tmp_sharedflag='-shared'
        case $cc_basename,$host_cpu in
         pgcc*)                         # Portland Group C compiler
-         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
          tmp_addflag=' $pic_flag'
          ;;
-       pgf77* | pgf90* | pgf95*)       # Portland Group f77 and f90 compilers
-         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+       pgf77* | pgf90* | pgf95* | pgfortran*)
+                                       # Portland Group f77 and f90 compilers
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
          tmp_addflag=' $pic_flag -Mnomain' ;;
        ecc*,ia64* | icc*,ia64*)        # Intel C compiler on ia64
          tmp_addflag=' -i_dynamic' ;;
@@ -4387,13 +4817,17 @@ _LT_EOF
        lf95*)                          # Lahey Fortran 8.1
          _LT_TAGVAR(whole_archive_flag_spec, $1)=
          tmp_sharedflag='--shared' ;;
-       xl[[cC]]*)                      # IBM XL C 8.0 on PPC (deal with xlf below)
+       xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
          tmp_sharedflag='-qmkshrobj'
          tmp_addflag= ;;
+       nvcc*)  # Cuda Compiler Driver 2.2
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         _LT_TAGVAR(compiler_needs_object, $1)=yes
+         ;;
        esac
        case `$CC -V 2>&1 | sed 5q` in
        *Sun\ C*)                       # Sun C 5.9
-         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
          _LT_TAGVAR(compiler_needs_object, $1)=yes
          tmp_sharedflag='-G' ;;
        *Sun\ F*)                       # Sun Fortran 8.3
@@ -4409,17 +4843,16 @@ _LT_EOF
         fi
 
        case $cc_basename in
-       xlf*)
+       xlf* | bgf* | bgxlf* | mpixlf*)
          # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
          _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-         _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
-         _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+         _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
          if test "x$supports_anon_versioning" = xyes; then
            _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
              echo "local: *; };" >> $output_objdir/$libname.ver~
-             $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+             $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
          fi
          ;;
        esac
@@ -4433,8 +4866,8 @@ _LT_EOF
        _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
        wlarc=
       else
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
       fi
       ;;
 
@@ -4452,8 +4885,8 @@ _LT_EOF
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
       else
        _LT_TAGVAR(ld_shlibs, $1)=no
       fi
@@ -4499,8 +4932,8 @@ _LT_EOF
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
       else
        _LT_TAGVAR(ld_shlibs, $1)=no
       fi
@@ -4540,8 +4973,10 @@ _LT_EOF
       else
        # If we're using GNU nm, then we don't want the "-C" option.
        # -C means demangle to AIX nm, but means don't demangle with GNU nm
+       # Also, AIX nm treats weak defined symbols like other global
+       # defined symbols, whereas GNU nm marks them as "W".
        if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-         _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+         _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
        else
          _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
        fi
@@ -4628,9 +5063,9 @@ _LT_EOF
        _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
-        _LT_SYS_MODULE_PATH_AIX
+        _LT_SYS_MODULE_PATH_AIX([$1])
         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
       else
        if test "$host_cpu" = ia64; then
          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
@@ -4639,14 +5074,19 @@ _LT_EOF
        else
         # Determine the default libpath from the value encoded in an
         # empty executable.
-        _LT_SYS_MODULE_PATH_AIX
+        _LT_SYS_MODULE_PATH_AIX([$1])
         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
          # Warning - without using the other run time loading flags,
          # -berok will link without error, but may produce a broken library.
          _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
          _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-         # Exported symbols can be pulled into shared objects from archives
-         _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+         if test "$with_gnu_ld" = yes; then
+           # We only use this code for GNU lds that support --whole-archive.
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+         else
+           # Exported symbols can be pulled into shared objects from archives
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+         fi
          _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
          # This is similar to how AIX traditionally builds its shared libraries.
          _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
@@ -4678,20 +5118,64 @@ _LT_EOF
       # Microsoft Visual C++.
       # hardcode_libdir_flag_spec is actually meaningless, as there is
       # no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-      # FIXME: Should let the user specify the lib program.
-      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      case $cc_basename in
+      cl*)
+       # Native MSVC
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+       _LT_TAGVAR(always_export_symbols, $1)=yes
+       _LT_TAGVAR(file_list_spec, $1)='@'
+       # Tell ltmain to make .lib files, not .a files.
+       libext=lib
+       # Tell ltmain to make .dll files, not .so files.
+       shrext_cmds=".dll"
+       # FIXME: Setting linknames here is a bad hack.
+       _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+       _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+           sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+         else
+           sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+         fi~
+         $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+         linknames='
+       # The linker will not automatically build a static lib if we build a DLL.
+       # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+       _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+       _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+       # Don't use ranlib
+       _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+       _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+         lt_tool_outputfile="@TOOL_OUTPUT@"~
+         case $lt_outputfile in
+           *.exe|*.EXE) ;;
+           *)
+             lt_outputfile="$lt_outputfile.exe"
+             lt_tool_outputfile="$lt_tool_outputfile.exe"
+             ;;
+         esac~
+         if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+           $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+           $RM "$lt_outputfile.manifest";
+         fi'
+       ;;
+      *)
+       # Assume MSVC wrapper
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+       # Tell ltmain to make .lib files, not .a files.
+       libext=lib
+       # Tell ltmain to make .dll files, not .so files.
+       shrext_cmds=".dll"
+       # FIXME: Setting linknames here is a bad hack.
+       _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+       # The linker will automatically build a .lib file if we build a DLL.
+       _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+       # FIXME: Should let the user specify the lib program.
+       _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+       ;;
+      esac
       ;;
 
     darwin* | rhapsody*)
@@ -4704,10 +5188,6 @@ _LT_EOF
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       ;;
 
-    freebsd1*)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
     # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
     # support.  Future versions do this automatically, but an explicit c++rt0.o
     # does not break anything, and helps significantly (at the cost of a little
@@ -4720,7 +5200,7 @@ _LT_EOF
       ;;
 
     # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
+    freebsd2.*)
       _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       _LT_TAGVAR(hardcode_direct, $1)=yes
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
@@ -4729,7 +5209,7 @@ _LT_EOF
 
     # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
     freebsd* | dragonfly*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
       _LT_TAGVAR(hardcode_direct, $1)=yes
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
@@ -4737,7 +5217,7 @@ _LT_EOF
 
     hpux9*)
       if test "$GCC" = yes; then
-       _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
       else
        _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
       fi
@@ -4752,14 +5232,13 @@ _LT_EOF
       ;;
 
     hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
       else
        _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
       if test "$with_gnu_ld" = no; then
        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-       _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
        _LT_TAGVAR(hardcode_direct, $1)=yes
        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
@@ -4771,16 +5250,16 @@ _LT_EOF
       ;;
 
     hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
        case $host_cpu in
        hppa*64*)
          _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        ia64*)
-         _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        *)
-         _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        esac
       else
@@ -4792,7 +5271,14 @@ _LT_EOF
          _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        *)
-         _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+       m4_if($1, [], [
+         # Older versions of the 11.00 compiler do not understand -b yet
+         # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+         _LT_LINKER_OPTION([if $CC understands -b],
+           _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+           [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+           [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+         [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
          ;;
        esac
       fi
@@ -4820,19 +5306,34 @@ _LT_EOF
 
     irix5* | irix6* | nonstopux*)
       if test "$GCC" = yes; then
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
        # Try to use the -exported_symbol ld option, if it does not
        # work, assume that -exports_file does not work either and
        # implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        AC_LINK_IFELSE(int foo(void) {},
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-        )
-        LDFLAGS="$save_LDFLAGS"
+       # This should be the same for all languages, so no per-tag cache variable.
+       AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+         [lt_cv_irix_exported_symbol],
+         [save_LDFLAGS="$LDFLAGS"
+          LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+          AC_LINK_IFELSE(
+            [AC_LANG_SOURCE(
+               [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+                             [C++], [[int foo (void) { return 0; }]],
+                             [Fortran 77], [[
+      subroutine foo
+      end]],
+                             [Fortran], [[
+      subroutine foo
+      end]])])],
+             [lt_cv_irix_exported_symbol=yes],
+             [lt_cv_irix_exported_symbol=no])
+           LDFLAGS="$save_LDFLAGS"])
+       if test "$lt_cv_irix_exported_symbol" = yes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+       fi
       else
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
@@ -4894,17 +5395,17 @@ _LT_EOF
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
       _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
       ;;
 
     osf3*)
       if test "$GCC" = yes; then
        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
       else
        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
@@ -4914,13 +5415,13 @@ _LT_EOF
     osf4* | osf5*)     # as osf3* with the addition of -msym flag
       if test "$GCC" = yes; then
        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
       else
        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-       $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+       $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
 
        # Both c and cxx compiler support -rpath directly
        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -4933,9 +5434,9 @@ _LT_EOF
       _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
       if test "$GCC" = yes; then
        wlarc='${wl}'
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-         $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+         $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
       else
        case `$CC -V 2>&1` in
        *"Compilers 5.0"*)
@@ -5111,36 +5612,38 @@ x|xyes)
       # Test whether the compiler implicitly links with -lc since on some
       # systems, -lgcc has to come before -lc. If gcc already passes -lc
       # to ld, don't add -lc before -lgcc.
-      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
-      $RM conftest*
-      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
-       pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
-        _LT_TAGVAR(allow_undefined_flag, $1)=
-        if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
-        then
-         _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        else
-         _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-        fi
-        _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $RM conftest*
-      AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+       [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+       [$RM conftest*
+       echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+       if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+         soname=conftest
+         lib=conftest
+         libobjs=conftest.$ac_objext
+         deplibs=
+         wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+         pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+         compiler_flags=-v
+         linker_flags=-v
+         verstring=
+         output_objdir=.
+         libname=conftest
+         lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+         _LT_TAGVAR(allow_undefined_flag, $1)=
+         if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+         then
+           lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+         else
+           lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+         fi
+         _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+       else
+         cat conftest.err 1>&5
+       fi
+       $RM conftest*
+       ])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
       ;;
     esac
   fi
@@ -5177,9 +5680,6 @@ _LT_TAGDECL([], [no_undefined_flag], [1],
 _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
     [Flag to hardcode $libdir into a binary during linking.
     This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
-    [[If ld is used when linking, flag to hardcode $libdir into a binary
-    during linking.  This must work even if $libdir does not exist]])
 _LT_TAGDECL([], [hardcode_libdir_separator], [1],
     [Whether we need a single "-rpath" flag with a separated argument])
 _LT_TAGDECL([], [hardcode_direct], [0],
@@ -5205,8 +5705,6 @@ _LT_TAGDECL([], [inherit_rpath], [0],
     to runtime path list])
 _LT_TAGDECL([], [link_all_deplibs], [0],
     [Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [fix_srcfile_path], [1],
-    [Fix the shell variable $srcfile for the compiler])
 _LT_TAGDECL([], [always_export_symbols], [0],
     [Set to "yes" if exported symbols are required])
 _LT_TAGDECL([], [export_symbols_cmds], [2],
@@ -5217,6 +5715,8 @@ _LT_TAGDECL([], [include_expsyms], [1],
     [Symbols that must always be exported])
 _LT_TAGDECL([], [prelink_cmds], [2],
     [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
 _LT_TAGDECL([], [file_list_spec], [1],
     [Specify filename containing input files])
 dnl FIXME: Not yet implemented
@@ -5310,37 +5810,22 @@ CC="$lt_save_CC"
 ])# _LT_LANG_C_CONFIG
 
 
-# _LT_PROG_CXX
-# ------------
-# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++
-# compiler, we have our own version here.
-m4_defun([_LT_PROG_CXX],
-[
-pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])
-AC_PROG_CXX
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-else
-  _lt_caught_CXX_error=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_CXX
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_CXX], [])
-
-
 # _LT_LANG_CXX_CONFIG([TAG])
 # --------------------------
 # Ensure that the configuration variables for a C++ compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
 # the compiler configuration to `libtool'.
 m4_defun([_LT_LANG_CXX_CONFIG],
-[AC_REQUIRE([_LT_PROG_CXX])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
 
 AC_LANG_PUSH(C++)
 _LT_TAGVAR(archive_cmds_need_lc, $1)=no
@@ -5352,7 +5837,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
 _LT_TAGVAR(hardcode_direct, $1)=no
 _LT_TAGVAR(hardcode_direct_absolute, $1)=no
 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
 _LT_TAGVAR(hardcode_libdir_separator, $1)=
 _LT_TAGVAR(hardcode_minus_L, $1)=no
 _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
@@ -5362,6 +5846,8 @@ _LT_TAGVAR(module_cmds, $1)=
 _LT_TAGVAR(module_expsym_cmds, $1)=
 _LT_TAGVAR(link_all_deplibs, $1)=unknown
 _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
 _LT_TAGVAR(no_undefined_flag, $1)=
 _LT_TAGVAR(whole_archive_flag_spec, $1)=
 _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
@@ -5393,6 +5879,7 @@ if test "$_lt_caught_CXX_error" != yes; then
 
   # Allow CC to be a program name with arguments.
   lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
   lt_save_LD=$LD
   lt_save_GCC=$GCC
   GCC=$GXX
@@ -5410,6 +5897,7 @@ if test "$_lt_caught_CXX_error" != yes; then
   fi
   test -z "${LDCXX+set}" || LD=$LDCXX
   CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
   compiler=$CC
   _LT_TAGVAR(compiler, $1)=$CC
   _LT_CC_BASENAME([$compiler])
@@ -5431,8 +5919,8 @@ if test "$_lt_caught_CXX_error" != yes; then
       # Check if GNU C++ uses GNU ld as the underlying linker, since the
       # archiving commands below assume that GNU ld is being used.
       if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
 
         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
         _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
@@ -5464,7 +5952,7 @@ if test "$_lt_caught_CXX_error" != yes; then
       # Commands to make compiler produce verbose output that lists
       # what "hidden" libraries, object files and flags are used when
       # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 
     else
       GXX=no
@@ -5573,10 +6061,10 @@ if test "$_lt_caught_CXX_error" != yes; then
           _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
           # Determine the default libpath from the value encoded in an empty
           # executable.
-          _LT_SYS_MODULE_PATH_AIX
+          _LT_SYS_MODULE_PATH_AIX([$1])
           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
 
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
         else
           if test "$host_cpu" = ia64; then
            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
@@ -5585,14 +6073,19 @@ if test "$_lt_caught_CXX_error" != yes; then
           else
            # Determine the default libpath from the value encoded in an
            # empty executable.
-           _LT_SYS_MODULE_PATH_AIX
+           _LT_SYS_MODULE_PATH_AIX([$1])
            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
            # Warning - without using the other run time loading flags,
            # -berok will link without error, but may produce a broken library.
            _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
            _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-           # Exported symbols can be pulled into shared objects from archives
-           _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+           if test "$with_gnu_ld" = yes; then
+             # We only use this code for GNU lds that support --whole-archive.
+             _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           else
+             # Exported symbols can be pulled into shared objects from archives
+             _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+           fi
            _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
            # This is similar to how AIX traditionally builds its shared
            # libraries.
@@ -5622,28 +6115,75 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
       cygwin* | mingw* | pw32* | cegcc*)
-        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-        # as there is no search path for DLLs.
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-        _LT_TAGVAR(always_export_symbols, $1)=no
-        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-          # If the export-symbols file already is a .def file (1st line
-          # is EXPORTS), use it as is; otherwise, prepend...
-          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-           cp $export_symbols $output_objdir/$soname.def;
-          else
-           echo EXPORTS > $output_objdir/$soname.def;
-           cat $export_symbols >> $output_objdir/$soname.def;
-          fi~
-          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-        else
-          _LT_TAGVAR(ld_shlibs, $1)=no
-        fi
-        ;;
+       case $GXX,$cc_basename in
+       ,cl* | no,cl*)
+         # Native MSVC
+         # hardcode_libdir_flag_spec is actually meaningless, as there is
+         # no search path for DLLs.
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+         _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+         _LT_TAGVAR(always_export_symbols, $1)=yes
+         _LT_TAGVAR(file_list_spec, $1)='@'
+         # Tell ltmain to make .lib files, not .a files.
+         libext=lib
+         # Tell ltmain to make .dll files, not .so files.
+         shrext_cmds=".dll"
+         # FIXME: Setting linknames here is a bad hack.
+         _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+         _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+             $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+           else
+             $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+           fi~
+           $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+           linknames='
+         # The linker will not automatically build a static lib if we build a DLL.
+         # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+         _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+         # Don't use ranlib
+         _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+         _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+           lt_tool_outputfile="@TOOL_OUTPUT@"~
+           case $lt_outputfile in
+             *.exe|*.EXE) ;;
+             *)
+               lt_outputfile="$lt_outputfile.exe"
+               lt_tool_outputfile="$lt_tool_outputfile.exe"
+               ;;
+           esac~
+           func_to_tool_file "$lt_outputfile"~
+           if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+             $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+             $RM "$lt_outputfile.manifest";
+           fi'
+         ;;
+       *)
+         # g++
+         # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+         # as there is no search path for DLLs.
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+         _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+         _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+         _LT_TAGVAR(always_export_symbols, $1)=no
+         _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+         if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+           # If the export-symbols file already is a .def file (1st line
+           # is EXPORTS), use it as is; otherwise, prepend...
+           _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+             cp $export_symbols $output_objdir/$soname.def;
+           else
+             echo EXPORTS > $output_objdir/$soname.def;
+             cat $export_symbols >> $output_objdir/$soname.def;
+           fi~
+           $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+         else
+           _LT_TAGVAR(ld_shlibs, $1)=no
+         fi
+         ;;
+       esac
+       ;;
       darwin* | rhapsody*)
         _LT_DARWIN_LINKER_FEATURES($1)
        ;;
@@ -5666,7 +6206,7 @@ if test "$_lt_caught_CXX_error" != yes; then
         esac
         ;;
 
-      freebsd[[12]]*)
+      freebsd2.*)
         # C++ shared libraries reported to be fairly broken before
        # switch to ELF
         _LT_TAGVAR(ld_shlibs, $1)=no
@@ -5685,6 +6225,11 @@ if test "$_lt_caught_CXX_error" != yes; then
       gnu*)
         ;;
 
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
       hpux9*)
         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
@@ -5709,11 +6254,11 @@ if test "$_lt_caught_CXX_error" != yes; then
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
             ;;
           *)
             if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
             else
               # FIXME: insert proper C++ library support
               _LT_TAGVAR(ld_shlibs, $1)=no
@@ -5774,7 +6319,7 @@ if test "$_lt_caught_CXX_error" != yes; then
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
            ;;
           *)
            if test "$GXX" = yes; then
@@ -5784,10 +6329,10 @@ if test "$_lt_caught_CXX_error" != yes; then
                    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                    ;;
                  ia64*)
-                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                    ;;
                  *)
-                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                    ;;
                esac
              fi
@@ -5817,7 +6362,7 @@ if test "$_lt_caught_CXX_error" != yes; then
         case $cc_basename in
           CC*)
            # SGI C++
-           _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
 
            # Archives containing C++ object files must be created using
            # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
@@ -5828,9 +6373,9 @@ if test "$_lt_caught_CXX_error" != yes; then
           *)
            if test "$GXX" = yes; then
              if test "$with_gnu_ld" = no; then
-               _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
              else
-               _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
              fi
            fi
            _LT_TAGVAR(link_all_deplibs, $1)=yes
@@ -5841,7 +6386,7 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
 
-      linux* | k*bsd*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
         case $cc_basename in
           KCC*)
            # Kuck and Associates, Inc. (KAI) C++ Compiler
@@ -5859,7 +6404,7 @@ if test "$_lt_caught_CXX_error" != yes; then
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+           output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 
            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
            _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
@@ -5896,26 +6441,26 @@ if test "$_lt_caught_CXX_error" != yes; then
           pgCC* | pgcpp*)
             # Portland Group C++ compiler
            case `$CC -V` in
-           *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*)
+           *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
              _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
                rm -rf $tpldir~
                $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-               compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
              _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
                rm -rf $tpldir~
                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-               $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
+               $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
                $RANLIB $oldlib'
              _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
                rm -rf $tpldir~
                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
              _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
                rm -rf $tpldir~
                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
              ;;
-           *) # Version 6 will use weak symbols
+           *) # Version 6 and above use weak symbols
              _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
              _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
              ;;
@@ -5923,7 +6468,7 @@ if test "$_lt_caught_CXX_error" != yes; then
 
            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
            _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-           _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
             ;;
          cxx*)
            # Compaq C++
@@ -5942,9 +6487,9 @@ if test "$_lt_caught_CXX_error" != yes; then
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
            ;;
-         xl*)
+         xl* | mpixl* | bgxl*)
            # IBM XL 8.0 on PPC, with GNU ld
            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
            _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
@@ -5964,13 +6509,13 @@ if test "$_lt_caught_CXX_error" != yes; then
              _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
              _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
              _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-             _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+             _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
              _LT_TAGVAR(compiler_needs_object, $1)=yes
 
              # Not sure whether something based on
              # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
              # would be better.
-             output_verbose_link_cmd='echo'
+             output_verbose_link_cmd='func_echo_all'
 
              # Archives containing C++ object files must be created using
              # "CC -xar", where "CC" is the Sun C++ compiler.  This is
@@ -6039,7 +6584,7 @@ if test "$_lt_caught_CXX_error" != yes; then
            _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
            _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
          fi
-         output_verbose_link_cmd=echo
+         output_verbose_link_cmd=func_echo_all
        else
          _LT_TAGVAR(ld_shlibs, $1)=no
        fi
@@ -6074,15 +6619,15 @@ if test "$_lt_caught_CXX_error" != yes; then
            case $host in
              osf3*)
                _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-               _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
                _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
                ;;
              *)
                _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-               _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
                _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
                  echo "-hidden">> $lib.exp~
-                 $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
+                 $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
                  $RM $lib.exp'
                _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
                ;;
@@ -6098,17 +6643,17 @@ if test "$_lt_caught_CXX_error" != yes; then
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
            ;;
          *)
            if test "$GXX" = yes && test "$with_gnu_ld" = no; then
              _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
              case $host in
                osf3*)
-                 _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
                  ;;
                *)
-                 _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
                  ;;
              esac
 
@@ -6118,7 +6663,7 @@ if test "$_lt_caught_CXX_error" != yes; then
              # Commands to make compiler produce verbose output that lists
              # what "hidden" libraries, object files and flags are used when
              # linking a shared library.
-             output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+             output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 
            else
              # FIXME: insert proper C++ library support
@@ -6154,7 +6699,7 @@ if test "$_lt_caught_CXX_error" != yes; then
 
       solaris*)
         case $cc_basename in
-          CC*)
+          CC* | sunCC*)
            # Sun C++ 4.2, 5.x and Centerline C++
             _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
            _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
@@ -6175,7 +6720,7 @@ if test "$_lt_caught_CXX_error" != yes; then
            esac
            _LT_TAGVAR(link_all_deplibs, $1)=yes
 
-           output_verbose_link_cmd='echo'
+           output_verbose_link_cmd='func_echo_all'
 
            # Archives containing C++ object files must be created using
            # "CC -xar", where "CC" is the Sun C++ compiler.  This is
@@ -6195,14 +6740,14 @@ if test "$_lt_caught_CXX_error" != yes; then
            if test "$GXX" = yes && test "$with_gnu_ld" = no; then
              _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
              if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-               _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
                _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-                 $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                 $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
                # linking a shared library.
-               output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+               output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
              else
                # g++ 2.7 appears to require `-G' NOT `-shared' on this
                # platform.
@@ -6213,7 +6758,7 @@ if test "$_lt_caught_CXX_error" != yes; then
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
                # linking a shared library.
-               output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+               output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
              fi
 
              _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
@@ -6267,6 +6812,10 @@ if test "$_lt_caught_CXX_error" != yes; then
           CC*)
            _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
            _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+             '"$_LT_TAGVAR(old_archive_cmds, $1)"
+           _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+             '"$_LT_TAGVAR(reload_cmds, $1)"
            ;;
          *)
            _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
@@ -6322,6 +6871,7 @@ if test "$_lt_caught_CXX_error" != yes; then
   fi # test -n "$compiler"
 
   CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
   LDCXX=$LD
   LD=$lt_save_LD
   GCC=$lt_save_GCC
@@ -6336,6 +6886,29 @@ AC_LANG_POP
 ])# _LT_LANG_CXX_CONFIG
 
 
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
 # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
 # ---------------------------------
 # Figure out "hidden" library dependencies from verbose
@@ -6344,6 +6917,7 @@ AC_LANG_POP
 # objects, libraries and library flags.
 m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
 [m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
 # Dependencies to place before and after the object being linked:
 _LT_TAGVAR(predep_objects, $1)=
 _LT_TAGVAR(postdep_objects, $1)=
@@ -6393,7 +6967,20 @@ public class foo {
   }
 };
 _LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
 ])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
 dnl Parse the compiler output and extract the necessary
 dnl objects, libraries and library flags.
 if AC_TRY_EVAL(ac_compile); then
@@ -6405,7 +6992,7 @@ if AC_TRY_EVAL(ac_compile); then
   pre_test_object_deps_done=no
 
   for p in `eval "$output_verbose_link_cmd"`; do
-    case $p in
+    case ${prev}${p} in
 
     -L* | -R* | -l*)
        # Some compilers place space between "-{L,R}" and the path.
@@ -6414,13 +7001,22 @@ if AC_TRY_EVAL(ac_compile); then
           test $p = "-R"; then
         prev=$p
         continue
-       else
-        prev=
        fi
 
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
        if test "$pre_test_object_deps_done" = no; then
-        case $p in
-        -L* | -R*)
+        case ${prev} in
+        -L | -R)
           # Internal compiler library paths should come after those
           # provided the user.  The postdeps already come after the
           # user supplied libs so there is no need to process them.
@@ -6440,8 +7036,10 @@ if AC_TRY_EVAL(ac_compile); then
           _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
         fi
        fi
+       prev=
        ;;
 
+    *.lto.$objext) ;; # Ignore GCC LTO objects
     *.$objext)
        # This assumes that the test object file only shows up
        # once in the compiler output.
@@ -6477,6 +7075,7 @@ else
 fi
 
 $RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
 
 # PORTME: override above test on systems where it is broken
 m4_if([$1], [CXX],
@@ -6513,7 +7112,7 @@ linux*)
 
 solaris*)
   case $cc_basename in
-  CC*)
+  CC* | sunCC*)
     # The more standards-conforming stlport4 library is
     # incompatible with the Cstd library. Avoid specifying
     # it if it's in CXXFLAGS. Ignore libCrun as
@@ -6557,32 +7156,16 @@ _LT_TAGDECL([], [compiler_lib_search_path], [1],
 ])# _LT_SYS_HIDDEN_LIBDEPS
 
 
-# _LT_PROG_F77
-# ------------
-# Since AC_PROG_F77 is broken, in that it returns the empty string
-# if there is no fortran compiler, we have our own version here.
-m4_defun([_LT_PROG_F77],
-[
-pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])
-AC_PROG_F77
-if test -z "$F77" || test "X$F77" = "Xno"; then
-  _lt_disable_F77=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_F77
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_F77], [])
-
-
 # _LT_LANG_F77_CONFIG([TAG])
 # --------------------------
 # Ensure that the configuration variables for a Fortran 77 compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
 # to write the compiler configuration to `libtool'.
 m4_defun([_LT_LANG_F77_CONFIG],
-[AC_REQUIRE([_LT_PROG_F77])dnl
-AC_LANG_PUSH(Fortran 77)
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
 
 _LT_TAGVAR(archive_cmds_need_lc, $1)=no
 _LT_TAGVAR(allow_undefined_flag, $1)=
@@ -6592,7 +7175,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
 _LT_TAGVAR(hardcode_direct, $1)=no
 _LT_TAGVAR(hardcode_direct_absolute, $1)=no
 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
 _LT_TAGVAR(hardcode_libdir_separator, $1)=
 _LT_TAGVAR(hardcode_minus_L, $1)=no
 _LT_TAGVAR(hardcode_automatic, $1)=no
@@ -6601,6 +7183,8 @@ _LT_TAGVAR(module_cmds, $1)=
 _LT_TAGVAR(module_expsym_cmds, $1)=
 _LT_TAGVAR(link_all_deplibs, $1)=unknown
 _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
 _LT_TAGVAR(no_undefined_flag, $1)=
 _LT_TAGVAR(whole_archive_flag_spec, $1)=
 _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
@@ -6640,7 +7224,9 @@ if test "$_lt_disable_F77" != yes; then
   # Allow CC to be a program name with arguments.
   lt_save_CC="$CC"
   lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
   CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
   compiler=$CC
   _LT_TAGVAR(compiler, $1)=$CC
   _LT_CC_BASENAME([$compiler])
@@ -6694,38 +7280,24 @@ if test "$_lt_disable_F77" != yes; then
 
   GCC=$lt_save_GCC
   CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
 fi # test "$_lt_disable_F77" != yes
 
 AC_LANG_POP
 ])# _LT_LANG_F77_CONFIG
 
 
-# _LT_PROG_FC
-# -----------
-# Since AC_PROG_FC is broken, in that it returns the empty string
-# if there is no fortran compiler, we have our own version here.
-m4_defun([_LT_PROG_FC],
-[
-pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])
-AC_PROG_FC
-if test -z "$FC" || test "X$FC" = "Xno"; then
-  _lt_disable_FC=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_FC
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_FC], [])
-
-
 # _LT_LANG_FC_CONFIG([TAG])
 # -------------------------
 # Ensure that the configuration variables for a Fortran compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
 # to write the compiler configuration to `libtool'.
 m4_defun([_LT_LANG_FC_CONFIG],
-[AC_REQUIRE([_LT_PROG_FC])dnl
-AC_LANG_PUSH(Fortran)
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
 
 _LT_TAGVAR(archive_cmds_need_lc, $1)=no
 _LT_TAGVAR(allow_undefined_flag, $1)=
@@ -6735,7 +7307,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
 _LT_TAGVAR(hardcode_direct, $1)=no
 _LT_TAGVAR(hardcode_direct_absolute, $1)=no
 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
 _LT_TAGVAR(hardcode_libdir_separator, $1)=
 _LT_TAGVAR(hardcode_minus_L, $1)=no
 _LT_TAGVAR(hardcode_automatic, $1)=no
@@ -6744,6 +7315,8 @@ _LT_TAGVAR(module_cmds, $1)=
 _LT_TAGVAR(module_expsym_cmds, $1)=
 _LT_TAGVAR(link_all_deplibs, $1)=unknown
 _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
 _LT_TAGVAR(no_undefined_flag, $1)=
 _LT_TAGVAR(whole_archive_flag_spec, $1)=
 _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
@@ -6783,7 +7356,9 @@ if test "$_lt_disable_FC" != yes; then
   # Allow CC to be a program name with arguments.
   lt_save_CC="$CC"
   lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
   CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
   compiler=$CC
   GCC=$ac_cv_fc_compiler_gnu
 
@@ -6839,7 +7414,8 @@ if test "$_lt_disable_FC" != yes; then
   fi # test -n "$compiler"
 
   GCC=$lt_save_GCC
-  CC="$lt_save_CC"
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
 fi # test "$_lt_disable_FC" != yes
 
 AC_LANG_POP
@@ -6876,10 +7452,12 @@ _LT_COMPILER_BOILERPLATE
 _LT_LINKER_BOILERPLATE
 
 # Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
 lt_save_GCC=$GCC
 GCC=yes
 CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
 _LT_TAGVAR(LD, $1)="$LD"
@@ -6889,6 +7467,8 @@ _LT_CC_BASENAME([$compiler])
 _LT_TAGVAR(archive_cmds_need_lc, $1)=no
 
 _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
 
 ## CAVEAT EMPTOR:
 ## There is no encapsulation within the following macros, do not change
@@ -6908,10 +7488,82 @@ fi
 AC_LANG_RESTORE
 
 GCC=$lt_save_GCC
-CC="$lt_save_CC"
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
 ])# _LT_LANG_GCJ_CONFIG
 
 
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
 # _LT_LANG_RC_CONFIG([TAG])
 # -------------------------
 # Ensure that the configuration variables for the Windows resource compiler
@@ -6943,9 +7595,11 @@ _LT_LINKER_BOILERPLATE
 
 # Allow CC to be a program name with arguments.
 lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
 lt_save_GCC=$GCC
 GCC=
 CC=${RC-"windres"}
+CFLAGS=
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
 _LT_CC_BASENAME([$compiler])
@@ -6958,7 +7612,8 @@ fi
 
 GCC=$lt_save_GCC
 AC_LANG_RESTORE
-CC="$lt_save_CC"
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
 ])# _LT_LANG_RC_CONFIG
 
 
@@ -6978,6 +7633,13 @@ dnl aclocal-1.4 backwards compatibility:
 dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
 
 
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
 # LT_PROG_RC
 # ----------
 AC_DEFUN([LT_PROG_RC],
@@ -7017,6 +7679,15 @@ _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
 AC_SUBST([OBJDUMP])
 ])
 
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
 
 # _LT_DECL_SED
 # ------------
@@ -7110,8 +7781,8 @@ m4_defun([_LT_CHECK_SHELL_FEATURES],
 # Try some XSI features
 xsi_shell=no
 ( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
     && eval 'test $(( 1 + 1 )) -eq 2 \
     && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
   && xsi_shell=yes
@@ -7150,208 +7821,162 @@ _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
 ])# _LT_CHECK_SHELL_FEATURES
 
 
-# _LT_PROG_XSI_SHELLFNS
-# ---------------------
-# Bourne and XSI compatible variants of some useful shell functions.
-m4_defun([_LT_PROG_XSI_SHELLFNS],
-[case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([    ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
 
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $[*] ))
-}
 
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"])
 
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
+  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}])
 
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
+  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}])
 
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
+  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
 
-dnl func_dirname_and_basename
-dnl A portable version of this function is already defined in general.m4sh
-dnl so there is no need for it here.
+  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac])
 
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
-  esac
-}
+  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
 
-# sed scripts:
-my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[[^=]]*=//'
+  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
 
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'`
-}
+  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
+fi
 
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$[@]"`
-}
+if test x"$lt_shell_append" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
 
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
+  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+    func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
 
-_LT_EOF
-esac
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
 
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
+if test x"$_lt_function_replace_fail" = x":"; then
+  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
 
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]+=\$[2]"
-}
-_LT_EOF
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
     ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]=\$$[1]\$[2]"
-}
-
-_LT_EOF
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
     ;;
-  esac
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
 ])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
index 34151a3..5d9acd8 100644 (file)
@@ -1,13 +1,14 @@
 # Helper functions for option handling.                    -*- Autoconf -*-
 #
-#   Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+#   Inc.
 #   Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
 # unlimited permission to copy and/or distribute it, with or without
 # modifications, as long as this notice is preserved.
 
-# serial 6 ltoptions.m4
+# serial 7 ltoptions.m4
 
 # This is to help aclocal find these macros, as it can't see m4_define.
 AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
@@ -125,7 +126,7 @@ LT_OPTION_DEFINE([LT_INIT], [win32-dll],
 [enable_win32_dll=yes
 
 case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
   AC_CHECK_TOOL(AS, as, false)
   AC_CHECK_TOOL(DLLTOOL, dlltool, false)
   AC_CHECK_TOOL(OBJDUMP, objdump, false)
@@ -133,13 +134,13 @@ case $host in
 esac
 
 test -z "$AS" && AS=as
-_LT_DECL([], [AS],      [0], [Assembler program])dnl
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
 
 test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
 
 test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
 ])# win32-dll
 
 AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
@@ -325,9 +326,24 @@ dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
 # MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
 m4_define([_LT_WITH_PIC],
 [AC_ARG_WITH([pic],
-    [AS_HELP_STRING([--with-pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
        [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [pic_mode="$withval"],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+       IFS="$lt_save_ifs"
+       if test "X$lt_pkg" = "X$lt_p"; then
+         pic_mode=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
     [pic_mode=default])
 
 test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
index f3c5309..07a8602 100644 (file)
@@ -7,17 +7,17 @@
 # unlimited permission to copy and/or distribute it, with or without
 # modifications, as long as this notice is preserved.
 
-# Generated from ltversion.in.
+# @configure_input@
 
-# serial 3017 ltversion.m4
+# serial 3337 ltversion.m4
 # This file is part of GNU Libtool
 
-m4_define([LT_PACKAGE_VERSION], [2.2.6b])
-m4_define([LT_PACKAGE_REVISION], [1.3017])
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
 
 AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.2.6b'
-macro_revision='1.3017'
+[macro_version='2.4.2'
+macro_revision='1.3337'
 _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
 _LT_DECL(, macro_revision, 0)
 ])
index 637bb20..c573da9 100644 (file)
@@ -1,13 +1,13 @@
 # lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
 #
-#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
+#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
 #   Written by Scott James Remnant, 2004.
 #
 # This file is free software; the Free Software Foundation gives
 # unlimited permission to copy and/or distribute it, with or without
 # modifications, as long as this notice is preserved.
 
-# serial 4 lt~obsolete.m4
+# serial 5 lt~obsolete.m4
 
 # These exist entirely to fool aclocal when bootstrapping libtool.
 #
@@ -77,7 +77,6 @@ m4_ifndef([AC_DISABLE_FAST_INSTALL],  [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
 m4_ifndef([_LT_AC_LANG_CXX],           [AC_DEFUN([_LT_AC_LANG_CXX])])
 m4_ifndef([_LT_AC_LANG_F77],           [AC_DEFUN([_LT_AC_LANG_F77])])
 m4_ifndef([_LT_AC_LANG_GCJ],           [AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_RC],             [AC_DEFUN([AC_LIBTOOL_RC])])
 m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],  [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
 m4_ifndef([_LT_AC_LANG_C_CONFIG],      [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
 m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],        [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
@@ -90,3 +89,10 @@ m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],       [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
 m4_ifndef([_LT_AC_LANG_RC_CONFIG],     [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
 m4_ifndef([AC_LIBTOOL_CONFIG],         [AC_DEFUN([AC_LIBTOOL_CONFIG])])
 m4_ifndef([_LT_AC_FILE_LTDLL_C],       [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],        [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],                [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],        [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],   [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],              [AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],               [AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],              [AC_DEFUN([_LT_PROG_CXX])])
diff --git a/m4/visibility.m4 b/m4/visibility.m4
new file mode 100644 (file)
index 0000000..2ff6330
--- /dev/null
@@ -0,0 +1,52 @@
+# visibility.m4 serial 1 (gettext-0.15)
+dnl Copyright (C) 2005 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Tests whether the compiler supports the command-line option
+dnl -fvisibility=hidden and the function and variable attributes
+dnl __attribute__((__visibility__("hidden"))) and
+dnl __attribute__((__visibility__("default"))).
+dnl Does *not* test for __visibility__("protected") - which has tricky
+dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
+dnl MacOS X.
+dnl Does *not* test for __visibility__("internal") - which has processor
+dnl dependent semantics.
+dnl Does *not* test for #pragma GCC visibility push(hidden) - which is
+dnl "really only recommended for legacy code".
+dnl Set the variable CFLAG_VISIBILITY.
+dnl Defines and sets the variable HAVE_VISIBILITY.
+
+AC_DEFUN([gl_VISIBILITY],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  CFLAG_VISIBILITY=
+  HAVE_VISIBILITY=0
+  if test -n "$GCC"; then
+    AC_MSG_CHECKING([for simple visibility declarations])
+    AC_CACHE_VAL(gl_cv_cc_visibility, [
+      gl_save_CFLAGS="$CFLAGS"
+      CFLAGS="$CFLAGS -fvisibility=hidden"
+      AC_TRY_COMPILE(
+        [extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+         extern __attribute__((__visibility__("default"))) int exportedvar;
+         extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+         extern __attribute__((__visibility__("default"))) int exportedfunc (void);],
+        [],
+        gl_cv_cc_visibility=yes,
+        gl_cv_cc_visibility=no)
+      CFLAGS="$gl_save_CFLAGS"])
+    AC_MSG_RESULT([$gl_cv_cc_visibility])
+    if test $gl_cv_cc_visibility = yes; then
+      CFLAG_VISIBILITY="-fvisibility=hidden"
+      HAVE_VISIBILITY=1
+    fi
+  fi
+  AC_SUBST([CFLAG_VISIBILITY])
+  AC_SUBST([HAVE_VISIBILITY])
+  AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
+    [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
+])
index 19c0eaa..1564e48 100644 (file)
@@ -1,24 +1,44 @@
 SET(MDOC3_PAGES
+  ZIP_SOURCE_GET_ARGS.mdoc
   libzip.mdoc
   zip_add.mdoc
   zip_add_dir.mdoc
   zip_close.mdoc
   zip_delete.mdoc
+  zip_dir_add.mdoc
+  zip_discard.mdoc
   zip_error_clear.mdoc
+  zip_error_code_system.mdoc
+  zip_error_code_zip.mdoc
+  zip_error_fini.mdoc
   zip_error_get.mdoc
   zip_error_get_sys_type.mdoc
+  zip_error_init.mdoc
+  zip_error_set.mdoc
+  zip_error_strerror.mdoc
+  zip_error_system_type.mdoc
+  zip_error_to_data.mdoc
   zip_error_to_str.mdoc
   zip_errors.mdoc
   zip_fclose.mdoc
   zip_fdopen.mdoc
+  zip_file_add.mdoc
+  zip_file_extra_field_delete.mdoc
+  zip_file_extra_field_get.mdoc
+  zip_file_extra_field_set.mdoc
+  zip_file_extra_fields_count.mdoc
+  zip_file_get_comment.mdoc 
+  zip_file_get_error.mdoc
+  zip_file_rename.mdoc
+  zip_file_set_comment.mdoc
   zip_file_strerror.mdoc
   zip_fopen.mdoc
   zip_fopen_encrypted.mdoc
   zip_fread.mdoc
   zip_get_archive_comment.mdoc
   zip_get_archive_flag.mdoc
+  zip_get_error.mdoc
   zip_get_file_comment.mdoc
-  zip_get_file_extra.mdoc
   zip_get_name.mdoc
   zip_get_num_entries.mdoc
   zip_get_num_files.mdoc
@@ -29,12 +49,32 @@ SET(MDOC3_PAGES
   zip_set_archive_flag.mdoc
   zip_set_default_password.mdoc
   zip_set_file_comment.mdoc
-  zip_set_file_extra.mdoc
+  zip_set_file_compression.mdoc
+  zip_source_begin_write.mdoc
   zip_source_buffer.mdoc
+  zip_source_close.mdoc
+  zip_source_commit_write.mdoc
+  zip_source_error.mdoc
   zip_source_file.mdoc
   zip_source_filep.mdoc
   zip_source_free.mdoc
   zip_source_function.mdoc
+  zip_source_is_deleted.mdoc
+  zip_source_keep.mdoc
+  zip_source_make_command_bitmap.mdoc
+  zip_source_open.mdoc
+  zip_source_read.mdoc
+  zip_source_rollback_write.mdoc
+  zip_source_seek.mdoc
+  zip_source_seek_compute_offset.mdoc
+  zip_source_seek_write.mdoc
+  zip_source_stat.mdoc
+  zip_source_tell.mdoc
+  zip_source_tell_write.mdoc
+  zip_source_win32a.mdoc
+  zip_source_win32handle.mdoc
+  zip_source_win32w.mdoc
+  zip_source_write.mdoc
   zip_source_zip.mdoc
   zip_stat.mdoc
   zip_stat_init.mdoc
@@ -45,7 +85,6 @@ SET(MDOC3_PAGES
 SET(MDOC1_PAGES
   zipcmp.mdoc
   zipmerge.mdoc
-  ziptorrent.mdoc
 )
 SET(MDOC_PAGES ${MDOC1_PAGES} ${MDOC3_PAGES})
 STRING(REGEX REPLACE .mdoc "" MAN1_PAGES "${MDOC1_PAGES}")
@@ -70,17 +109,31 @@ FOREACH(MAN_PAGE ${MAN3_PAGES})
   INSTALL(FILES ${MAN_PAGE}.${MANFMT} DESTINATION ${MAN_PATH}/man3
     RENAME ${MAN_PAGE}.3)
 ENDFOREACH(MAN_PAGE ${PROGRAMS})
-# XXX: usually symlinks, but I only know how to do this way
+# TODO: usually symlinks, but I only know how to do this way
 INSTALL(FILES zip_error_clear.${MANFMT} DESTINATION ${MAN_PATH}/man3
   RENAME zip_file_error_clear.3)
 INSTALL(FILES zip_error_get.${MANFMT} DESTINATION ${MAN_PATH}/man3
   RENAME zip_file_error_get.3)
+INSTALL(FILES zip_error_init.${MANFMT} DESTINATION ${MAN_PATH}/man3
+  RENAME zip_error_init_with_code.3)
+INSTALL(FILES zip_file_extra_field_delete.${MANFMT} DESTINATION ${MAN_PATH}/man3
+  RENAME zip_file_extra_field_delete_by_id.3)
+INSTALL(FILES zip_file_extra_field_get.${MANFMT} DESTINATION ${MAN_PATH}/man3
+  RENAME zip_file_extra_field_get_by_id.3)
+INSTALL(FILES zip_file_extra_fields_count.${MANFMT} DESTINATION ${MAN_PATH}/man3
+  RENAME zip_file_extra_fields_count_by_id.3)
+INSTALL(FILES zip_file_add.${MANFMT} DESTINATION ${MAN_PATH}/man3
+  RENAME zip_file_replace.3)
 INSTALL(FILES zip_fopen.${MANFMT} DESTINATION ${MAN_PATH}/man3
   RENAME zip_fopen_index.3)
 INSTALL(FILES zip_fopen_encrypted.${MANFMT} DESTINATION ${MAN_PATH}/man3
   RENAME zip_fopen_index_encrypted.3)
+INSTALL(FILES zip_open.${MANFMT} DESTINATION ${MAN_PATH}/man3
+  RENAME zip_open_from_source.3)
 INSTALL(FILES zip_add.${MANFMT} DESTINATION ${MAN_PATH}/man3
   RENAME zip_replace.3)
+INSTALL(FILES zip_source_function.${MANFMT} DESTINATION ${MAN_PATH}/man3
+  RENAME zip_source_function_create.3)
 INSTALL(FILES zip_stat.${MANFMT} DESTINATION ${MAN_PATH}/man3
   RENAME zip_stat_index.3)
 INSTALL(FILES zip_file_strerror.${MANFMT} DESTINATION ${MAN_PATH}/man3
@@ -91,14 +144,14 @@ INSTALL(FILES zip_file_strerror.${MANFMT} DESTINATION ${MAN_PATH}/man3
 #FOREACH(MAN ${MAN_PAGES})
 #  ADD_CUSTOM_TARGET(${MAN}.man
 #    DEPENDS ${MAN}.mdoc
-#    COMMAND mdoc2man ${CMAKE_CURRENT_SOURCE_DIR}/${MAN}.mdoc > ${MAN}.new
+#    COMMAND mandoc -T man ${CMAKE_CURRENT_SOURCE_DIR}/${MAN}.mdoc | sed '/TH/s,"NetBSD [^"]*","NiH",' > ${MAN}.new
 #    COMMAND diff -I NiH ${MAN}.new ${CMAKE_CURRENT_SOURCE_DIR}/${MAN}.man || mv ${MAN}.new ${CMAKE_CURRENT_SOURCE_DIR}/${MAN}.man
 #    COMMAND rm -f ${MAN}.new
 #    COMMENT Updating man page ${MAN}.man
 #    )
 #  ADD_CUSTOM_TARGET(${MAN}.html
 #    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${MAN}.mdoc
-#    COMMAND nroff -mdoc2html ${CMAKE_CURRENT_SOURCE_DIR}/${MAN}.mdoc | sed -e "s,../html[0-9]/,," > ${MAN}.html
+#    COMMAND mandoc -Thtml -Oman="%N.html",style=../nih-man.css ${CMAKE_CURRENT_SOURCE_DIR}/${MAN}.mdoc > ${MAN}.html
 #    COMMENT Updating HTML page ${MAN}.html
 #    )
 #ENDFOREACH(MAN)
@@ -111,11 +164,11 @@ INSTALL(FILES zip_file_strerror.${MANFMT} DESTINATION ${MAN_PATH}/man3
 #ADD_CUSTOM_TARGET(update-html
 #  DEPENDS ${HTMLDEPEND})
 
-# XXX: strange error:
+# TODO: strange error:
 #[ 94%] zipcmp.html
 #[ 97%] Built target zipcmp.html
 #[ 97%] zipmerge.html
 #[100%] Built target zipmerge.html
 #make: don't know how to make zipcmp.html. Stop
 
-# XXX: why are all the man pages rebuilt on a second 'make update-html'?
+# TODO: why are all the man pages rebuilt on a second 'make update-html'?
index a4e5a69..963294f 100644 (file)
@@ -3,29 +3,53 @@ man1_MANS=${MAN1:.mdoc=.${MANFMT}}
 man3_MANS=${MAN3:.mdoc=.${MANFMT}}
 
 DISTCLEANFILES=${HTML}
-EXTRA_DIST=${MANDOC} ${MAN} CMakeLists.txt
+EXTRA_DIST=${MANDOC} ${MAN} CMakeLists.txt handle_links links
 
-MAN1=  zipcmp.mdoc zipmerge.mdoc ziptorrent.mdoc
-MAN3=  libzip.mdoc \
+MAN1=  zipcmp.mdoc zipmerge.mdoc
+MAN3=  \
+       ZIP_SOURCE_GET_ARGS.mdoc \
+       libzip.mdoc \
        zip_add.mdoc \
        zip_add_dir.mdoc \
        zip_close.mdoc \
        zip_delete.mdoc \
+       zip_dir_add.mdoc \
+       zip_discard.mdoc \
        zip_error_clear.mdoc \
+       zip_error_code_system.mdoc \
+       zip_error_code_zip.mdoc \
+       zip_error_fini.mdoc \
        zip_error_get.mdoc \
        zip_error_get_sys_type.mdoc \
+       zip_error_init.mdoc \
+       zip_error_set.mdoc \
+       zip_error_strerror.mdoc \
+       zip_error_system_type.mdoc \
+       zip_error_to_data.mdoc \
        zip_error_to_str.mdoc \
        zip_errors.mdoc \
        zip_fclose.mdoc \
        zip_fdopen.mdoc \
+       zip_file_add.mdoc \
+       zip_file_extra_field_delete.mdoc \
+       zip_file_extra_field_get.mdoc \
+       zip_file_extra_field_set.mdoc \
+       zip_file_extra_fields_count.mdoc \
+       zip_file_get_comment.mdoc \
+       zip_file_get_error.mdoc \
+       zip_file_get_external_attributes.mdoc \
+       zip_file_rename.mdoc \
+       zip_file_set_comment.mdoc \
+       zip_file_set_external_attributes.mdoc \
+       zip_file_set_mtime.mdoc \
        zip_file_strerror.mdoc \
        zip_fopen.mdoc \
        zip_fopen_encrypted.mdoc \
        zip_fread.mdoc \
        zip_get_archive_comment.mdoc \
        zip_get_archive_flag.mdoc \
+       zip_get_error.mdoc \
        zip_get_file_comment.mdoc \
-        zip_get_file_extra.mdoc \
        zip_get_name.mdoc \
        zip_get_num_entries.mdoc \
        zip_get_num_files.mdoc \
@@ -36,12 +60,33 @@ MAN3=       libzip.mdoc \
        zip_set_archive_flag.mdoc \
        zip_set_default_password.mdoc \
        zip_set_file_comment.mdoc \
-        zip_set_file_extra.mdoc \
+       zip_set_file_compression.mdoc \
+       zip_source.mdoc \
+       zip_source_begin_write.mdoc \
        zip_source_buffer.mdoc \
+       zip_source_close.mdoc \
+       zip_source_commit_write.mdoc \
+       zip_source_error.mdoc \
        zip_source_file.mdoc \
        zip_source_filep.mdoc \
        zip_source_free.mdoc \
        zip_source_function.mdoc \
+       zip_source_is_deleted.mdoc \
+       zip_source_keep.mdoc \
+       zip_source_make_command_bitmap.mdoc \
+       zip_source_open.mdoc \
+       zip_source_read.mdoc \
+       zip_source_rollback_write.mdoc \
+       zip_source_seek.mdoc \
+       zip_source_seek_compute_offset.mdoc \
+       zip_source_seek_write.mdoc \
+       zip_source_stat.mdoc \
+       zip_source_tell.mdoc \
+       zip_source_tell_write.mdoc \
+       zip_source_win32a.mdoc \
+       zip_source_win32handle.mdoc \
+       zip_source_win32w.mdoc \
+       zip_source_write.mdoc \
        zip_source_zip.mdoc \
        zip_stat.mdoc \
        zip_stat_init.mdoc \
@@ -51,50 +96,22 @@ MAN3=       libzip.mdoc \
 
 install-data-hook: link-man3
 
-LN=ln
+LN=ln -f
 
 link-man3: install-man3 uninstall-hook
-       ${LN} ${DESTDIR}${man3dir}/zip_error_clear.3 \
-               ${DESTDIR}${man3dir}/zip_file_error_clear.3
-       ${LN} ${DESTDIR}${man3dir}/zip_error_get.3 \
-               ${DESTDIR}${man3dir}/zip_file_error_get.3
-       ${LN} ${DESTDIR}${man3dir}/zip_fopen.3 \
-               ${DESTDIR}${man3dir}/zip_fopen_index.3
-       ${LN} ${DESTDIR}${man3dir}/zip_fopen_encrypted.3 \
-               ${DESTDIR}${man3dir}/zip_fopen_index_encrypted.3
-       ${LN} ${DESTDIR}${man3dir}/zip_add.3 \
-               ${DESTDIR}${man3dir}/zip_replace.3
-       ${LN} ${DESTDIR}${man3dir}/zip_stat.3 \
-               ${DESTDIR}${man3dir}/zip_stat_index.3
-       ${LN} ${DESTDIR}${man3dir}/zip_file_strerror.3 \
-               ${DESTDIR}${man3dir}/zip_strerror.3
+       @${srcdir}/handle_links install directory=${DESTDIR}${man3dir} extension=3 command="${LN}" file=${srcdir}/links
 
 uninstall-hook:
-       -rm -f ${DESTDIR}${man3dir}/zip_file_error_clear.3
-       -rm -f ${DESTDIR}${man3dir}/zip_file_error_get.3
-       -rm -f ${DESTDIR}${man3dir}/zip_fopen_index.3
-       -rm -f ${DESTDIR}${man3dir}/zip_fopen_index_encrypted.3
-       -rm -f ${DESTDIR}${man3dir}/zip_replace.3
-       -rm -f ${DESTDIR}${man3dir}/zip_stat_index.3
-       -rm -f ${DESTDIR}${man3dir}/zip_strerror.3
+       @${srcdir}/handle_links uninstall directory=${DESTDIR}${man3dir} extension=3 command="rm -f" file=${srcdir}/links
 
 link-html: ${HTML}
-       -rm -f zip_file_error_get.html zip_fopen_index.html \
-               zip_fopen_index_encrypted \
-               zip_replace.html zip_stat_index.html \
-               zip_strerror.html
-       ${LN} zip_error_get.html zip_file_error_get.html
-       ${LN} zip_fopen.html zip_fopen_index.html
-       ${LN} zip_fopen_encrypted.html zip_fopen_index_encrypted.html
-       ${LN} zip_add.html zip_replace.html
-       ${LN} zip_stat.html zip_stat_index.html
-       ${LN} zip_file_strerror.html zip_strerror.html
+       @${srcdir}/handle_links uninstall directory=. extension=html command="rm -f" file=${srcdir}/links
+       @${srcdir}/handle_links install directory=. extension=html command="${LN}" file=${srcdir}/links
 
 MANDOC=${MAN1} ${MAN3}
 HTML=${MANDOC:.mdoc=.html}
 MAN=${MANDOC:.mdoc=.man}
 
-MDOC2MAN=mdoc2man
 SUFFIXES=.man .mdoc .html
 
 .PHONY: mkman update-errors
@@ -102,11 +119,14 @@ SUFFIXES=.man .mdoc .html
 mkman: ${MAN}
 mkhtml: ${HTML} link-html
 
+mkdocset: mkdocset.pl ${HTML}
+       SRCDIR=${srcdir} perl ${srcdir}/mkdocset.pl ${HTML}
+
 update-errors:
        sh $(srcdir)/make_zip_errors.sh $(srcdir)/../lib/zip.h zip_errors.mdoc
 
 .mdoc.man:
-       ${MDOC2MAN} $< > $@.$$$$ && mv $@.$$$$ $@
+       mandoc -T man $< | sed '/TH/s,"NetBSD [^"]*","NiH",' > $@.$$$$ && mv $@.$$$$ $@
 
 .mdoc.html:
-       mandoc -Thtml -Oman="%N.html",style=../nih-man.css $< > $@.$$$$ && mv $@.$$$$ $@
+       mandoc -Thtml -Oman="%N.html",style=../nih-man.css $< | ${srcdir}/fix-man-links.sh > $@.$$$$ && mv $@.$$$$ $@
index 1a288d4..8b9e64a 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 @SET_MAKE@
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -34,20 +78,37 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 subdir = man
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -69,14 +130,22 @@ am__nobase_list = $(am__nobase_strip_setup); \
 am__base_list = \
   sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
   sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
 man1dir = $(mandir)/man1
 am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"
 man3dir = $(mandir)/man3
 NROFF = nroff
 MANS = $(man1_MANS) $(man3_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -85,11 +154,13 @@ AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -99,6 +170,7 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -114,6 +186,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MANFMT = @MANFMT@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -129,6 +202,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG_RPATH = @PKG_CONFIG_RPATH@
 RANLIB = @RANLIB@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
@@ -139,6 +213,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
@@ -171,7 +246,6 @@ libdir = @libdir@
 libexecdir = @libexecdir@
 localedir = @localedir@
 localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
@@ -190,28 +264,52 @@ top_srcdir = @top_srcdir@
 man1_MANS = ${MAN1:.mdoc=.${MANFMT}}
 man3_MANS = ${MAN3:.mdoc=.${MANFMT}}
 DISTCLEANFILES = ${HTML}
-EXTRA_DIST = ${MANDOC} ${MAN} CMakeLists.txt
-MAN1 = zipcmp.mdoc zipmerge.mdoc ziptorrent.mdoc
-MAN3 = libzip.mdoc \
+EXTRA_DIST = ${MANDOC} ${MAN} CMakeLists.txt handle_links links
+MAN1 = zipcmp.mdoc zipmerge.mdoc
+MAN3 = \
+       ZIP_SOURCE_GET_ARGS.mdoc \
+       libzip.mdoc \
        zip_add.mdoc \
        zip_add_dir.mdoc \
        zip_close.mdoc \
        zip_delete.mdoc \
+       zip_dir_add.mdoc \
+       zip_discard.mdoc \
        zip_error_clear.mdoc \
+       zip_error_code_system.mdoc \
+       zip_error_code_zip.mdoc \
+       zip_error_fini.mdoc \
        zip_error_get.mdoc \
        zip_error_get_sys_type.mdoc \
+       zip_error_init.mdoc \
+       zip_error_set.mdoc \
+       zip_error_strerror.mdoc \
+       zip_error_system_type.mdoc \
+       zip_error_to_data.mdoc \
        zip_error_to_str.mdoc \
        zip_errors.mdoc \
        zip_fclose.mdoc \
        zip_fdopen.mdoc \
+       zip_file_add.mdoc \
+       zip_file_extra_field_delete.mdoc \
+       zip_file_extra_field_get.mdoc \
+       zip_file_extra_field_set.mdoc \
+       zip_file_extra_fields_count.mdoc \
+       zip_file_get_comment.mdoc \
+       zip_file_get_error.mdoc \
+       zip_file_get_external_attributes.mdoc \
+       zip_file_rename.mdoc \
+       zip_file_set_comment.mdoc \
+       zip_file_set_external_attributes.mdoc \
+       zip_file_set_mtime.mdoc \
        zip_file_strerror.mdoc \
        zip_fopen.mdoc \
        zip_fopen_encrypted.mdoc \
        zip_fread.mdoc \
        zip_get_archive_comment.mdoc \
        zip_get_archive_flag.mdoc \
+       zip_get_error.mdoc \
        zip_get_file_comment.mdoc \
-        zip_get_file_extra.mdoc \
        zip_get_name.mdoc \
        zip_get_num_entries.mdoc \
        zip_get_num_files.mdoc \
@@ -222,12 +320,33 @@ MAN3 = libzip.mdoc \
        zip_set_archive_flag.mdoc \
        zip_set_default_password.mdoc \
        zip_set_file_comment.mdoc \
-        zip_set_file_extra.mdoc \
+       zip_set_file_compression.mdoc \
+       zip_source.mdoc \
+       zip_source_begin_write.mdoc \
        zip_source_buffer.mdoc \
+       zip_source_close.mdoc \
+       zip_source_commit_write.mdoc \
+       zip_source_error.mdoc \
        zip_source_file.mdoc \
        zip_source_filep.mdoc \
        zip_source_free.mdoc \
        zip_source_function.mdoc \
+       zip_source_is_deleted.mdoc \
+       zip_source_keep.mdoc \
+       zip_source_make_command_bitmap.mdoc \
+       zip_source_open.mdoc \
+       zip_source_read.mdoc \
+       zip_source_rollback_write.mdoc \
+       zip_source_seek.mdoc \
+       zip_source_seek_compute_offset.mdoc \
+       zip_source_seek_write.mdoc \
+       zip_source_stat.mdoc \
+       zip_source_tell.mdoc \
+       zip_source_tell_write.mdoc \
+       zip_source_win32a.mdoc \
+       zip_source_win32handle.mdoc \
+       zip_source_win32w.mdoc \
+       zip_source_write.mdoc \
        zip_source_zip.mdoc \
        zip_stat.mdoc \
        zip_stat_init.mdoc \
@@ -235,11 +354,10 @@ MAN3 = libzip.mdoc \
        zip_unchange_all.mdoc \
        zip_unchange_archive.mdoc
 
-LN = ln
+LN = ln -f
 MANDOC = ${MAN1} ${MAN3}
 HTML = ${MANDOC:.mdoc=.html}
 MAN = ${MANDOC:.mdoc=.man}
-MDOC2MAN = mdoc2man
 SUFFIXES = .man .mdoc .html
 all: all-am
 
@@ -283,9 +401,18 @@ clean-libtool:
        -rm -rf .libs _libs
 install-man1: $(man1_MANS)
        @$(NORMAL_INSTALL)
-       test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
-       @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \
-       { for i in $$list; do echo "$$i"; done; \
+       @list1='$(man1_MANS)'; \
+       list2=''; \
+       test -n "$(man1dir)" \
+         && test -n "`echo $$list1$$list2`" \
+         || exit 0; \
+       echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+       $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+       { for i in $$list1; do echo "$$i"; done;  \
+       if test -n "$$list2"; then \
+         for i in $$list2; do echo "$$i"; done \
+           | sed -n '/\.1[a-z]*$$/p'; \
+       fi; \
        } | while read p; do \
          if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; echo "$$p"; \
@@ -312,14 +439,21 @@ uninstall-man1:
        files=`{ for i in $$list; do echo "$$i"; done; \
        } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
              -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
-       test -z "$$files" || { \
-         echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \
-         cd "$(DESTDIR)$(man1dir)" && rm -f $$files; }
+       dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
 install-man3: $(man3_MANS)
        @$(NORMAL_INSTALL)
-       test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)"
-       @list='$(man3_MANS)'; test -n "$(man3dir)" || exit 0; \
-       { for i in $$list; do echo "$$i"; done; \
+       @list1='$(man3_MANS)'; \
+       list2=''; \
+       test -n "$(man3dir)" \
+         && test -n "`echo $$list1$$list2`" \
+         || exit 0; \
+       echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \
+       $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \
+       { for i in $$list1; do echo "$$i"; done;  \
+       if test -n "$$list2"; then \
+         for i in $$list2; do echo "$$i"; done \
+           | sed -n '/\.3[a-z]*$$/p'; \
+       fi; \
        } | while read p; do \
          if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; echo "$$p"; \
@@ -346,30 +480,15 @@ uninstall-man3:
        files=`{ for i in $$list; do echo "$$i"; done; \
        } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
              -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
-       test -z "$$files" || { \
-         echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \
-         cd "$(DESTDIR)$(man3dir)" && rm -f $$files; }
-tags: TAGS
-TAGS:
+       dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
 
-ctags: CTAGS
-CTAGS:
+ctags CTAGS:
+
+cscope cscopelist:
 
 
 distdir: $(DISTFILES)
-       @list='$(MANS)'; if test -n "$$list"; then \
-         list=`for p in $$list; do \
-           if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
-           if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
-         if test -n "$$list" && \
-           grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
-           echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
-           grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/         /' >&2; \
-           echo "       to fix them, install help2man, remove and regenerate the man pages;" >&2; \
-           echo "       typically \`make maintainer-clean' will remove them" >&2; \
-           exit 1; \
-         else :; fi; \
-       else :; fi
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -416,10 +535,15 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -505,71 +629,48 @@ uninstall-man: uninstall-man1 uninstall-man3
 .MAKE: install-am install-data-am install-strip uninstall-am
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
-       distclean distclean-generic distclean-libtool distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-data-hook install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-man1 install-man3 install-pdf install-pdf-am \
-       install-ps install-ps-am install-strip installcheck \
-       installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
-       uninstall-hook uninstall-man uninstall-man1 uninstall-man3
+       cscopelist-am ctags-am distclean distclean-generic \
+       distclean-libtool distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am \
+       install-data-hook install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-man1 install-man3 \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags-am uninstall uninstall-am uninstall-hook uninstall-man \
+       uninstall-man1 uninstall-man3
 
 
 install-data-hook: link-man3
 
 link-man3: install-man3 uninstall-hook
-       ${LN} ${DESTDIR}${man3dir}/zip_error_clear.3 \
-               ${DESTDIR}${man3dir}/zip_file_error_clear.3
-       ${LN} ${DESTDIR}${man3dir}/zip_error_get.3 \
-               ${DESTDIR}${man3dir}/zip_file_error_get.3
-       ${LN} ${DESTDIR}${man3dir}/zip_fopen.3 \
-               ${DESTDIR}${man3dir}/zip_fopen_index.3
-       ${LN} ${DESTDIR}${man3dir}/zip_fopen_encrypted.3 \
-               ${DESTDIR}${man3dir}/zip_fopen_index_encrypted.3
-       ${LN} ${DESTDIR}${man3dir}/zip_add.3 \
-               ${DESTDIR}${man3dir}/zip_replace.3
-       ${LN} ${DESTDIR}${man3dir}/zip_stat.3 \
-               ${DESTDIR}${man3dir}/zip_stat_index.3
-       ${LN} ${DESTDIR}${man3dir}/zip_file_strerror.3 \
-               ${DESTDIR}${man3dir}/zip_strerror.3
+       @${srcdir}/handle_links install directory=${DESTDIR}${man3dir} extension=3 command="${LN}" file=${srcdir}/links
 
 uninstall-hook:
-       -rm -f ${DESTDIR}${man3dir}/zip_file_error_clear.3
-       -rm -f ${DESTDIR}${man3dir}/zip_file_error_get.3
-       -rm -f ${DESTDIR}${man3dir}/zip_fopen_index.3
-       -rm -f ${DESTDIR}${man3dir}/zip_fopen_index_encrypted.3
-       -rm -f ${DESTDIR}${man3dir}/zip_replace.3
-       -rm -f ${DESTDIR}${man3dir}/zip_stat_index.3
-       -rm -f ${DESTDIR}${man3dir}/zip_strerror.3
+       @${srcdir}/handle_links uninstall directory=${DESTDIR}${man3dir} extension=3 command="rm -f" file=${srcdir}/links
 
 link-html: ${HTML}
-       -rm -f zip_file_error_get.html zip_fopen_index.html \
-               zip_fopen_index_encrypted \
-               zip_replace.html zip_stat_index.html \
-               zip_strerror.html
-       ${LN} zip_error_get.html zip_file_error_get.html
-       ${LN} zip_fopen.html zip_fopen_index.html
-       ${LN} zip_fopen_encrypted.html zip_fopen_index_encrypted.html
-       ${LN} zip_add.html zip_replace.html
-       ${LN} zip_stat.html zip_stat_index.html
-       ${LN} zip_file_strerror.html zip_strerror.html
+       @${srcdir}/handle_links uninstall directory=. extension=html command="rm -f" file=${srcdir}/links
+       @${srcdir}/handle_links install directory=. extension=html command="${LN}" file=${srcdir}/links
 
 .PHONY: mkman update-errors
 
 mkman: ${MAN}
 mkhtml: ${HTML} link-html
 
+mkdocset: mkdocset.pl ${HTML}
+       SRCDIR=${srcdir} perl ${srcdir}/mkdocset.pl ${HTML}
+
 update-errors:
        sh $(srcdir)/make_zip_errors.sh $(srcdir)/../lib/zip.h zip_errors.mdoc
 
 .mdoc.man:
-       ${MDOC2MAN} $< > $@.$$$$ && mv $@.$$$$ $@
+       mandoc -T man $< | sed '/TH/s,"NetBSD [^"]*","NiH",' > $@.$$$$ && mv $@.$$$$ $@
 
 .mdoc.html:
-       mandoc -Thtml -Oman="%N.html",style=../nih-man.css $< > $@.$$$$ && mv $@.$$$$ $@
+       mandoc -Thtml -Oman="%N.html",style=../nih-man.css $< | ${srcdir}/fix-man-links.sh > $@.$$$$ && mv $@.$$$$ $@
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/man/ZIP_SOURCE_GET_ARGS.man b/man/ZIP_SOURCE_GET_ARGS.man
new file mode 100644 (file)
index 0000000..11a6724
--- /dev/null
@@ -0,0 +1,41 @@
+.TH "ZIP_SOURCE_GET_ARGS" "3" "October 30, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBZIP_SOURCE_GET_ARGS\fP
+\- validate and cast arguments to source callback
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+type *
+ZIP_SOURCE_GET_ARGS type void *data zip_uint64_t len zip_error_t *error
+.SH "DESCRIPTION"
+The
+ZIP_SOURCE_GET_ARGS
+macro casts
+\fIdata\fP
+to a pointer to
+\fItype\fP.
+.SH "RETURN VALUES"
+On success,
+ZIP_SOURCE_GET_ARGS
+returns
+\fIdata\fP.
+In case of error, it returns
+\fRNULL\fP
+and sets
+\fIerror\fP.
+.SH "ERRORS"
+ZIP_SOURCE_GET_ARGS
+fails if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIlen\fP
+is less than the size of
+\fItype\fP
+.SH "SEE ALSO"
+libzip(3),
+zip_source_function(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/ZIP_SOURCE_GET_ARGS.mdoc b/man/ZIP_SOURCE_GET_ARGS.mdoc
new file mode 100644 (file)
index 0000000..bb29412
--- /dev/null
@@ -0,0 +1,76 @@
+.\" ZIP_SOURCE_GET_ARGS -- validate and cast arguments to source callback
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 30, 2014
+.Dt ZIP_SOURCE_GET_ARGS 3
+.Os
+.Sh NAME
+.Nm ZIP_SOURCE_GET_ARGS
+.Nd validate and cast arguments to source callback
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft type *
+.Fn ZIP_SOURCE_GET_ARGS "type" "void *data" "zip_uint64_t len" "zip_error_t *error"
+.Sh DESCRIPTION
+The
+.Fn ZIP_SOURCE_GET_ARGS
+macro casts
+.Ar data
+to a pointer to
+.Ar type .
+.Sh RETURN VALUES
+On success,
+.Fn ZIP_SOURCE_GET_ARGS
+returns
+.Ar data .
+In case of error, it returns
+.Dv NULL
+and sets
+.Ar error .
+.Sh ERRORS
+.Fn ZIP_SOURCE_GET_ARGS
+fails if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_INVAL
+.Ar len
+is less than the size of
+.Ar type
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source_function 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/handle_links b/man/handle_links
new file mode 100755 (executable)
index 0000000..7c2ed37
--- /dev/null
@@ -0,0 +1,74 @@
+#!/usr/bin/env perl
+
+use strict;
+
+my $operation = shift @ARGV;
+
+if ($operation !~ m/^(install|uninstall)$/) {
+    print STDERR "$0: unknown operation $operation\n";
+    exit(1);
+}
+
+my %options = ();
+
+for my $arg (@ARGV) {
+    if ($arg =~ m/([^=]*)=(.*)/) {
+        $options{$1} = $2;
+    }
+    else {
+        print STDERR "$0: can't parse option [$arg]\n";
+        exit(1);
+    }
+}
+
+for my $option (qw(command directory extension file)) {
+    unless (defined($options{$option})) {
+        print STDERR "$0: required variable $option not provided\n";
+        exit(1);
+    }
+}
+
+my $fh;
+unless (open $fh, '<', $options{file}) {
+    print STDERR "$0: can't open links file '$options{file}': $!";
+    exit(1);
+}
+
+my @cmd = split /\s+/, $options{command};
+
+while (my $line = <$fh>) {
+    chomp $line;
+    my @args = split /\s+/, $line;
+
+    process(@args);
+}
+
+sub process {
+    my ($source, @destinations) = @_;
+
+    my @args = (@cmd);
+
+    if ($operation eq 'install') {
+        push @args, "$options{directory}/$source.$options{extension}";
+    }
+
+    for my $destination (@destinations) {
+        push @args, "$options{directory}/$destination.$options{extension}";
+        run_command(@args);
+        pop @args;
+    }
+}
+
+sub run_command {
+    print (join ' ', @_);
+    print "\n";
+
+    my $ret = system(@_);
+
+    if ($ret != 0) {
+        print STDERR "$0: command failed: $?\n";
+        exit(1);
+    }
+
+    return 1;
+}
index 68678a9..05f790d 100644 (file)
@@ -1,43 +1,13 @@
-.\" libzip.mdoc \-- general overview of available functions
-.\" Copyright (C) 2005-2011 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH LIBZIP 3 "February 14, 2011" NiH
+.TH "LIBZIP" "3" "August 2, 2014" "NiH" "Library Functions Manual"
 .SH "NAME"
-libzip \- library for manipulating zip archives
+\fBlibzip\fP
+\- library for manipulating zip archives
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
+zip.h
 .SH "DESCRIPTION"
-.B libzip
+\fBlibzip\fP
 is a library for reading, creating, and modifying zip archives.
 .PP
 Below there are two sections listing functions: one for how to read
@@ -57,11 +27,12 @@ zip_fread(3)
 zip_fclose(3)
 .SS "close archive"
 zip_close(3)
+zip_discard(3)
 .SS "miscellaneous"
 zip_stat(3)
+zip_file_get_comment(3)
 zip_get_archive_comment(3)
 zip_get_archive_flag(3)
-zip_get_file_comment(3)
 zip_get_name(3)
 zip_get_num_entries(3)
 zip_set_default_password(3)
@@ -69,16 +40,17 @@ zip_set_default_password(3)
 .SS "create/open archive"
 zip_open(3)
 .SS "add/change files and directories"
-zip_add(3)
-zip_add_dir(3)
-zip_replace(3)
-zip_set_file_comment(3)
+zip_dir_add(3)
+zip_file_add(3)
+zip_file_replace(3)
+zip_file_set_comment(3)
+zip_set_file_compression(3)
 zip_source_buffer(3)
 zip_source_file(3)
 zip_source_filep(3)
+zip_source_free(3)
 zip_source_function(3)
 zip_source_zip(3)
-zip_source_free(3)
 .SS "rename files"
 zip_rename(3)
 .SS "delete files"
@@ -87,11 +59,20 @@ zip_delete(3)
 zip_unchange(3)
 zip_unchange_all(3)
 zip_unchange_archive(3)
+.SS "read/modify extra fields"
+zip_file_extra_field_by_id(3)
+zip_file_extra_field_delete(3)
+zip_file_extra_field_delete_by_id(3)
+zip_file_extra_field_get(3)
+zip_file_extra_field_set(3)
+zip_file_extra_fields_count(3)
+zip_file_extra_fields_count_by_id(3)
 .SS "close archive"
 zip_close(3)
 .SS "miscellaneous"
 zip_set_archive_comment(3)
 zip_set_archive_flag(3)
+zip_source(3)
 .SH "ERROR HANDLING"
 zip_error_to_str(3)
 zip_strerror(3)
@@ -100,7 +81,6 @@ zip_error_get(3)
 zip_error_get_sys_type(3)
 zip_errors(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 9647f1c..e9862af 100644 (file)
@@ -1,5 +1,5 @@
 .\" libzip.mdoc -- general overview of available functions
-.\" Copyright (C) 2005-2011 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2005-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 14, 2011
+.Dd August 2, 2014
 .Dt LIBZIP 3
 .Os
 .Sh NAME
@@ -60,11 +60,12 @@ from zip archives and one for how to create/modify them.
 .Xr zip_fclose 3
 .Ss close archive
 .Xr zip_close 3
+.Xr zip_discard 3
 .Ss miscellaneous
 .Xr zip_stat 3
+.Xr zip_file_get_comment 3
 .Xr zip_get_archive_comment 3
 .Xr zip_get_archive_flag 3
-.Xr zip_get_file_comment 3
 .Xr zip_get_name 3
 .Xr zip_get_num_entries 3
 .Xr zip_set_default_password 3
@@ -72,16 +73,17 @@ from zip archives and one for how to create/modify them.
 .Ss create/open archive
 .Xr zip_open 3
 .Ss add/change files and directories
-.Xr zip_add 3
-.Xr zip_add_dir 3
-.Xr zip_replace 3
-.Xr zip_set_file_comment 3
+.Xr zip_dir_add 3
+.Xr zip_file_add 3
+.Xr zip_file_replace 3
+.Xr zip_file_set_comment 3
+.Xr zip_set_file_compression 3
 .Xr zip_source_buffer 3
 .Xr zip_source_file 3
 .Xr zip_source_filep 3
+.Xr zip_source_free 3
 .Xr zip_source_function 3
 .Xr zip_source_zip 3
-.Xr zip_source_free 3
 .Ss rename files
 .Xr zip_rename 3
 .Ss delete files
@@ -90,11 +92,20 @@ from zip archives and one for how to create/modify them.
 .Xr zip_unchange 3
 .Xr zip_unchange_all 3
 .Xr zip_unchange_archive 3
+.Ss read/modify extra fields
+.Xr zip_file_extra_field_by_id 3
+.Xr zip_file_extra_field_delete 3
+.Xr zip_file_extra_field_delete_by_id 3
+.Xr zip_file_extra_field_get 3
+.Xr zip_file_extra_field_set 3
+.Xr zip_file_extra_fields_count 3
+.Xr zip_file_extra_fields_count_by_id 3
 .Ss close archive
 .Xr zip_close 3
 .Ss miscellaneous
 .Xr zip_set_archive_comment 3
 .Xr zip_set_archive_flag 3
+.Xr zip_source 3
 .Sh ERROR HANDLING
 .Xr zip_error_to_str 3
 .Xr zip_strerror 3
@@ -104,6 +115,6 @@ from zip archives and one for how to create/modify them.
 .Xr zip_errors 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/links b/man/links
new file mode 100644 (file)
index 0000000..b2a0280
--- /dev/null
+++ b/man/links
@@ -0,0 +1,17 @@
+zip_error_clear zip_file_error_clear
+zip_error_get zip_file_error_get
+zip_error_init zip_error_init_with_code
+zip_file_add zip_file_replace
+zip_file_extra_field_delete zip_file_extra_field_delete_by_id
+zip_file_extra_field_get zip_file_extra_field_get_by_id
+zip_file_extra_fields_count zip_file_extra_fields_count_by_id
+zip_fopen zip_fopen_index
+zip_fopen_encrypted zip_fopen_index_encrypted
+zip_add zip_replace
+zip_open zip_open_from_source
+zip_stat zip_stat_index
+zip_source_function zip_source_function_create
+zip_file_strerror zip_strerror
+zip_source_win32a zip_source_win32a_create
+zip_source_win32handle zip_source_win32handle_create
+zip_source_win32w zip_source_win32w_create
index dcf6d31..f742b85 100644 (file)
-.\" zip_add.mdoc \-- add files to zip archive
-.\" Copyright (C) 2004-2009 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_ADD 3 "March 10, 2009" NiH
+.TH "ZIP_ADD" "3" "October 6, 2012" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_add , \- .Nm zip_replace
-add file to zip archive or replace file in zip archive
+\fBzip_add\fP,
+\fBzip_replace\fP
+\- add file to zip archive or replace file in zip archive
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 zip_int64_t
-zip_add(struct zip *archive, const char *name); \
-"struct zip_source *source"
-.PP
+zip_add zip_t *archive const char *name zip_source_t *source
 int
-zip_replace(struct zip *archive, zip_uint64_t index); \
-"struct zip_source *source"
+zip_replace zip_t *archive zip_uint64_t index zip_source_t *source
 .SH "DESCRIPTION"
 The function
 zip_add
-adds a file to a zip archive, while
-zip_replace
-replaces an existing file in a zip archive.
-The argument
-\fBarchive\fR
-specifies the zip archive to which the file should be added.
-\fBname\fR
-is the file's name in the zip archive (for
-zip_add ),
-while
-\fBindex\fR
-specifies which file should be replaced (for
-zip_replace ).
-The data is obtained from the
-\fBsource\fR
+is the obsolete version of
+zip_file_add(3).
+It is the same as calling
+zip_file_add(3)
+with an empty
+\fIflags\fP
 argument.
-See the
-zip_source_*
-functions cited in
-SEE ALSO.
-.SH "RETURN VALUES"
-Upon successful completion,
-zip_add
-returns the index of the new file in the archive, and
-zip_replace
-returns 0.
-Otherwise, \-1 is returned and the error code in
-\fBarchive\fR
-is set to indicate the error.
-.SH "EXAMPLES"
-.Bd \-literal \-offset indent
-struct zip_source *s;
-
-if ((s=zip_source_buffer(archive, buffer, len)) == NULL ||
-    zip_add(archive, name, s) \*[Lt] 0) {
-    zip_source_free(s);
-    printf("error adding file: %s\n", zip_strerror(archive));
-}
-.Ed
-.SH "ERRORS"
-zip_add
-and
+Similarly, the
 zip_replace
-fail if:
-.RS
-.TP 4
-[ZIP_ER_EXISTS]
-There is already a file called
-\fBname\fR
-in the archive.
-(Only applies to
-zip_add ).
-.TP 4
-[ZIP_ER_INVAL]
-\fBsource\fR
-or
-\fBname\fR
-are
-\fBNULL,\fR
-or
-\fBindex\fR
-is invalid.
-.TP 4
-[ZIP_ER_MEMORY]
-Required memory could not be allocated.
-.RE
+function is the obsolete version of
+zip_file_replace(3).
+It is the same as calling
+zip_file_replace(3)
+with an empty
+\fIflags\fP
+argument.
 .SH "SEE ALSO"
 libzip(3),
-zip_source_file(3),
-zip_source_filep(3),
-zip_source_function(3),
-zip_source_zip(3)
+zip_file_add(3),
+zip_file_replace(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index bc5c204..6d6a61c 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_add.mdoc -- add files to zip archive
-.\" Copyright (C) 2004-2009 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd March 10, 2009
+.Dd October 6, 2012
 .Dt ZIP_ADD 3
 .Os
 .Sh NAME
@@ -41,85 +41,36 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft zip_int64_t
-.Fn zip_add "struct zip *archive" "const char *name" \
-"struct zip_source *source"
+.Fn zip_add "zip_t *archive" "const char *name" \
+"zip_source_t *source"
 .Ft int
-.Fn zip_replace "struct zip *archive" "zip_uint64_t index" \
-"struct zip_source *source"
+.Fn zip_replace "zip_t *archive" "zip_uint64_t index" \
+"zip_source_t *source"
 .Sh DESCRIPTION
 The function
 .Fn zip_add
-adds a file to a zip archive, while
-.Fn zip_replace
-replaces an existing file in a zip archive.
-The argument
-.Ar archive
-specifies the zip archive to which the file should be added.
-.Ar name
-is the file's name in the zip archive (for
-.Fn zip_add ) ,
-while
-.Ar index
-specifies which file should be replaced (for
-.Fn zip_replace ) .
-The data is obtained from the
-.Ar source
+is the obsolete version of
+.Xr zip_file_add 3 .
+It is the same as calling
+.Xr zip_file_add 3
+with an empty
+.Ar flags
 argument.
-See the
-.Fn zip_source_*
-functions cited in
-.Sx SEE ALSO .
-.Sh RETURN VALUES
-Upon successful completion,
-.Fn zip_add
-returns the index of the new file in the archive, and
-.Fn zip_replace
-returns 0.
-Otherwise, \-1 is returned and the error code in
-.Ar archive
-is set to indicate the error.
-.Sh EXAMPLES
-.Bd -literal -offset indent
-struct zip_source *s;
-
-if ((s=zip_source_buffer(archive, buffer, len)) == NULL ||
-    zip_add(archive, name, s) \*[Lt] 0) {
-    zip_source_free(s);
-    printf("error adding file: %s\n", zip_strerror(archive));
-}
-.Ed
-.Sh ERRORS
-.Fn zip_add
-and
+Similarly, the
 .Fn zip_replace
-fail if:
-.Bl -tag -width Er
-.It Bq Er ZIP_ER_EXISTS
-There is already a file called
-.Ar name
-in the archive.
-(Only applies to
-.Fn zip_add ) .
-.It Bq Er ZIP_ER_INVAL
-.Ar source
-or
-.Ar name
-are
-.Dv NULL ,
-or
-.Ar index
-is invalid.
-.It Bq Er ZIP_ER_MEMORY
-Required memory could not be allocated.
-.El
+function is the obsolete version of
+.Xr zip_file_replace 3 .
+It is the same as calling
+.Xr zip_file_replace 3
+with an empty
+.Ar flags
+argument.
 .Sh SEE ALSO
 .Xr libzip 3 ,
-.Xr zip_source_file 3 ,
-.Xr zip_source_filep 3 ,
-.Xr zip_source_function 3 ,
-.Xr zip_source_zip 3
+.Xr zip_file_add 3 ,
+.Xr zip_file_replace 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index c746b41..8f80fdf 100644 (file)
@@ -1,84 +1,25 @@
-.\" zip_add_dir.mdoc \-- add directory to zip archive
-.\" Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_ADD_DIR 3 "March 10, 2009" NiH
+.TH "ZIP_ADD_DIR" "3" "June 23, 2012" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_add_dir \- add directory to zip archive
+\fBzip_add_dir\fP
+\- add directory to zip archive
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 zip_int64_t
-zip_add_dir(struct zip *archive, const char *name);
+zip_add_dir zip_t *archive const char *name
 .SH "DESCRIPTION"
 The function
 zip_add_dir
-adds a directory to a zip archive.
-The argument
-\fBarchive\fR
-specifies the zip archive to which the directory should be added.
-\fBname\fR
-is the directory's name in the zip archive.
-.SH "RETURN VALUES"
-Upon successful completion, the index of the new entry in the archive
-is returned.
-Otherwise, \-1 is returned and the error code in
-\fBarchive\fR
-is set to indicate the error.
-.SH "ERRORS"
-zip_add_dir
-fails if:
-.RS
-.TP 4
-[ZIP_ER_EXISTS]
-There is already an entry called
-\fBname\fR
-in the archive.
-.TP 4
-[ZIP_ER_INVAL]
-\fBarchive\fR
-or
-\fBname\fR
-are
-\fBNULL.\fR
-.TP 4
-[ZIP_ER_MEMORY]
-Required memory could not be allocated.
-.RE
+is the obsolete version of
+zip_dir_add(3).
+It is the same as calling
+zip_dir_add(3)
+with an empty flags argument.
 .SH "SEE ALSO"
 libzip(3),
-zip_add(3)
+zip_dir_add(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 7f7014e..d6a6087 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_add_dir.mdoc -- add directory to zip archive
-.\" Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd March 10, 2009
+.Dd June 23, 2012
 .Dt ZIP_ADD_DIR 3
 .Os
 .Sh NAME
@@ -40,44 +40,20 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft zip_int64_t
-.Fn zip_add_dir "struct zip *archive" "const char *name"
+.Fn zip_add_dir "zip_t *archive" "const char *name"
 .Sh DESCRIPTION
 The function
 .Fn zip_add_dir
-adds a directory to a zip archive.
-The argument
-.Ar archive
-specifies the zip archive to which the directory should be added.
-.Ar name
-is the directory's name in the zip archive.
-.Sh RETURN VALUES
-Upon successful completion, the index of the new entry in the archive
-is returned.
-Otherwise, \-1 is returned and the error code in
-.Ar archive
-is set to indicate the error.
-.Sh ERRORS
-.Fn zip_add_dir
-fails if:
-.Bl -tag -width Er
-.It Bq Er ZIP_ER_EXISTS
-There is already an entry called
-.Ar name
-in the archive.
-.It Bq Er ZIP_ER_INVAL
-.Ar archive
-or
-.Ar name
-are
-.Dv NULL .
-.It Bq Er ZIP_ER_MEMORY
-Required memory could not be allocated.
-.El
+is the obsolete version of
+.Xr zip_dir_add 3 .
+It is the same as calling
+.Xr zip_dir_add 3
+with an empty flags argument.
 .Sh SEE ALSO
 .Xr libzip 3 ,
-.Xr zip_add 3
+.Xr zip_dir_add 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 3fc9a2a..2fc8bc5 100644 (file)
-.\" zip_close.mdoc \-- close zip archive
-.\" Copyright (C) 2003-2009 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_CLOSE 3 "February 15, 2009" NiH
+.TH "ZIP_CLOSE" "3" "February 13, 2012" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_close \- close zip archive
+\fBzip_close\fP
+\- close zip archive
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_close(struct zip *archive);
+zip_close zip_t *archive
 .SH "DESCRIPTION"
 The
 zip_close
 function closes
-\fBarchive\fR
+\fIarchive\fP
 and frees the memory allocated for it.
 If any files within were changed, those changes are written to disk
 first.
 If writing changes fails,
 zip_close
 fails and
-\fBarchive\fR
+\fIarchive\fP
 is left unchanged.
 If
-\fBarchive\fR
+\fIarchive\fP
 contains no files, the file is completely removed (no empty archive is
 written).
+.PP
+To close a zip file without saving changes, use
+zip_discard(3).
 .SH "RETURN VALUES"
 Upon successful completion 0 is returned.
 Otherwise, \-1 is returned and the error code in
-\fBarchive\fR
+\fIarchive\fP
 is set to indicate the error.
 .SH "ERRORS"
 zip_close
 will fail if:
-.RS
-.TP 4
-[ZIP_ER_EOF]
+.TP 17n
+[\fRZIP_ER_EOF\fP]
 Unexpected end-of-file found while reading from a file.
-.TP 4
-[ZIP_ER_INTERNAL]
+.TP 17n
+[\fRZIP_ER_INTERNAL\fP]
 The callback function of an added or replaced file returned an
 error but failed to report which.
-.TP 4
-[ZIP_ER_INVAL]
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
 The
-\fBpath\fR
+\fIpath\fP
 argument is
-\fBNULL.\fR
-.TP 4
-[ZIP_ER_MEMORY]
+\fRNULL\fP.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
 Required memory could not be allocated.
-.TP 4
-[ZIP_ER_NOZIP]
+.TP 17n
+[\fRZIP_ER_NOZIP\fP]
 File is not a zip archive.
-.TP 4
-[ZIP_ER_READ]
+.TP 17n
+[\fRZIP_ER_READ\fP]
 A file read failed.
-.TP 4
-[ZIP_ER_RENAME]
+.TP 17n
+[\fRZIP_ER_RENAME\fP]
 A temporary file could not be renamed to its final name.
-.TP 4
-[ZIP_ER_SEEK]
+.TP 17n
+[\fRZIP_ER_SEEK\fP]
 A file seek failed.
-.TP 4
-[ZIP_ER_TMPOPEN]
+.TP 17n
+[\fRZIP_ER_TMPOPEN\fP]
 A temporary file could not be created.
-.TP 4
-[ZIP_ER_WRITE]
+.TP 17n
+[\fRZIP_ER_WRITE\fP]
 A file write failed.
-.TP 4
-[ZIP_ER_ZLIB]
+.TP 17n
+[\fRZIP_ER_ZLIB\fP]
 An error occurred while (de)compressing a stream with
 zlib(3).
-.RE
 Additionally, any errors returned by the callback function
 for added or replaced files will be passed back.
 .SH "SEE ALSO"
 libzip(3),
+zip_discard(3),
 zip_error_get(3),
 zip_fdopen(3),
 zip_open(3),
 zip_strerror(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 0db9bb6..6932ca2 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_close.mdoc -- close zip archive
-.\" Copyright (C) 2003-2009 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 15, 2009
+.Dd February 13, 2012
 .Dt ZIP_CLOSE 3
 .Os
 .Sh NAME
@@ -40,7 +40,7 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_close "struct zip *archive"
+.Fn zip_close "zip_t *archive"
 .Sh DESCRIPTION
 The
 .Fn zip_close
@@ -58,6 +58,9 @@ If
 .Ar archive
 contains no files, the file is completely removed (no empty archive is
 written).
+.Pp
+To close a zip file without saving changes, use
+.Xr zip_discard 3 .
 .Sh RETURN VALUES
 Upon successful completion 0 is returned.
 Otherwise, \-1 is returned and the error code in
@@ -99,12 +102,13 @@ Additionally, any errors returned by the callback function
 for added or replaced files will be passed back.
 .Sh SEE ALSO
 .Xr libzip 3 ,
+.Xr zip_discard 3 ,
 .Xr zip_error_get 3 ,
 .Xr zip_fdopen 3 ,
 .Xr zip_open 3 ,
 .Xr zip_strerror 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 61e8c3c..bd6b688 100644 (file)
@@ -1,70 +1,36 @@
-.\" zip_delete.mdoc \-- delete files from zip archive
-.\" Copyright (C) 2003-2009 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_DELETE 3 "March 10, 2009" NiH
+.TH "ZIP_DELETE" "3" "March 10, 2009" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_delete \- delete file from zip archive
+\fBzip_delete\fP
+\- delete file from zip archive
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_delete(struct zip *archive, zip_uint64_t index);
+zip_delete zip_t *archive zip_uint64_t index
 .SH "DESCRIPTION"
 The file at position
-\fBindex\fR
+\fIindex\fP
 in the zip archive
-\fBarchive\fR
+\fIarchive\fP
 is marked as deleted.
 .SH "RETURN VALUES"
 Upon successful completion 0 is returned.
 Otherwise, \-1 is returned and the error code in
-\fBarchive\fR
+\fIarchive\fP
 is set to indicate the error.
 .SH "ERRORS"
 zip_delete
 fails if:
-.RS
-.TP 4
-[ZIP_ER_INVAL]
-\fBindex\fR
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIindex\fP
 is not a valid file index in
-\fBarchive.\fR
-.RE
+\fIarchive\fP.
 .SH "SEE ALSO"
 libzip(3),
 zip_unchange(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index d17eadc..423d050 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_delete.mdoc -- delete files from zip archive
-.\" Copyright (C) 2003-2009 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -40,7 +40,7 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_delete "struct zip *archive" "zip_uint64_t index"
+.Fn zip_delete "zip_t *archive" "zip_uint64_t index"
 .Sh DESCRIPTION
 The file at position
 .Ar index
@@ -66,6 +66,6 @@ is not a valid file index in
 .Xr zip_unchange 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_dir_add.man b/man/zip_dir_add.man
new file mode 100644 (file)
index 0000000..8149269
--- /dev/null
@@ -0,0 +1,73 @@
+.TH "ZIP_DIR_ADD" "3" "December 4, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_dir_add\fP
+\- add directory to zip archive
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_int64_t
+zip_dir_add zip_t *archive const char *name zip_flags_t flags
+.SH "DESCRIPTION"
+The function
+zip_dir_add
+adds a directory to a zip archive.
+The argument
+\fIarchive\fP
+specifies the zip archive to which the directory should be added.
+\fIname\fP
+is the directory's name in the zip archive.
+The
+\fIflags\fP
+argument can be any of:
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_ENC_GUESS\fP
+Guess encoding of
+\fIname\fP
+(default).
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_ENC_UTF_8\fP
+Interpret
+\fIname\fP
+as UTF-8.
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_ENC_CP437\fP
+Interpret
+\fIname\fP
+as code page 437 (CP-437).
+.SH "RETURN VALUES"
+Upon successful completion, the index of the new entry in the archive
+is returned.
+Otherwise, \-1 is returned and the error code in
+\fIarchive\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_dir_add
+fails if:
+.TP 17n
+[\fRZIP_ER_EXISTS\fP]
+There is already an entry called
+\fIname\fP
+in the archive.
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIarchive\fP
+or
+\fIname\fP
+are
+\fRNULL\fP,
+or invalid UTF-8 encoded file names.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
+Required memory could not be allocated.
+.SH "SEE ALSO"
+libzip(3),
+zip_add(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
+.SH "CAVEATS"
+zip_dir_add
+does not look in the file system, it just creates one entry in the
+archive for the provided name.
diff --git a/man/zip_dir_add.mdoc b/man/zip_dir_add.mdoc
new file mode 100644 (file)
index 0000000..657dcd5
--- /dev/null
@@ -0,0 +1,106 @@
+.\" zip_dir_add.mdoc -- add directory to zip archive
+.\" Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd December 4, 2014
+.Dt ZIP_DIR_ADD 3
+.Os
+.Sh NAME
+.Nm zip_dir_add
+.Nd add directory to zip archive
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft zip_int64_t
+.Fn zip_dir_add "zip_t *archive" "const char *name" \
+"zip_flags_t flags"
+.Sh DESCRIPTION
+The function
+.Fn zip_dir_add
+adds a directory to a zip archive.
+The argument
+.Ar archive
+specifies the zip archive to which the directory should be added.
+.Ar name
+is the directory's name in the zip archive.
+The
+.Ar flags
+argument can be any of:
+.Bl -tag -width XZIPXFLXENCXSTRICTXX
+.It Dv ZIP_FL_ENC_GUESS
+Guess encoding of
+.Ar name
+(default).
+.It Dv ZIP_FL_ENC_UTF_8
+Interpret
+.Ar name
+as UTF-8.
+.It Dv ZIP_FL_ENC_CP437
+Interpret
+.Ar name
+as code page 437 (CP-437).
+.El
+.Sh RETURN VALUES
+Upon successful completion, the index of the new entry in the archive
+is returned.
+Otherwise, \-1 is returned and the error code in
+.Ar archive
+is set to indicate the error.
+.Sh ERRORS
+.Fn zip_dir_add
+fails if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_EXISTS
+There is already an entry called
+.Ar name
+in the archive.
+.It Bq Er ZIP_ER_INVAL
+.Ar archive
+or
+.Ar name
+are
+.Dv NULL ,
+or invalid UTF-8 encoded file names.
+.It Bq Er ZIP_ER_MEMORY
+Required memory could not be allocated.
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_add 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
+.Sh CAVEATS
+.Fn zip_dir_add
+does not look in the file system, it just creates one entry in the
+archive for the provided name.
diff --git a/man/zip_discard.man b/man/zip_discard.man
new file mode 100644 (file)
index 0000000..42eb65e
--- /dev/null
@@ -0,0 +1,24 @@
+.TH "ZIP_DISCARD" "3" "February 13, 2012" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_discard\fP
+\- close zip archive and discard changes
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+void
+zip_discard zip_t *archive
+.SH "DESCRIPTION"
+The
+zip_discard
+function closes
+\fIarchive\fP
+and frees the memory allocated for it.
+Any changes to the archive are not written to disk and discarded.
+.SH "SEE ALSO"
+libzip(3),
+zip_close(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_discard.mdoc b/man/zip_discard.mdoc
new file mode 100644 (file)
index 0000000..b262076
--- /dev/null
@@ -0,0 +1,58 @@
+.\" zip_discard.mdoc -- close zip archive and discard changes
+.\" Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd February 13, 2012
+.Dt ZIP_DISCARD 3
+.Os
+.Sh NAME
+.Nm zip_discard
+.Nd close zip archive and discard changes
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft void
+.Fn zip_discard "zip_t *archive"
+.Sh DESCRIPTION
+The
+.Fn zip_discard
+function closes
+.Ar archive
+and frees the memory allocated for it.
+Any changes to the archive are not written to disk and discarded.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_close 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 750f832..4c7251b 100644 (file)
@@ -1,63 +1,30 @@
-.\" zip_clear_error.mdoc \-- clear error state for archive or file
-.\" Copyright (C) 2006 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_CLEAR_ERROR 3 "October 4, 2006" NiH
+.TH "ZIP_ERROR_CLEAR" "3" "October 30, 2014" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_error_clear , \- .Nm zip_file_error_clear
-clear error state for archive or file
+\fBzip_error_clear\fP,
+\fBzip_file_error_clear\fP
+\- clear error state for archive or file
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 void
-zip_error_clear(struct zip *archive);
-.PP
+zip_error_clear zip_t *archive
 void
-zip_file_error_clear(struct zip_file *file);
+zip_file_error_clear zip_file_t *file
 .SH "DESCRIPTION"
 The
 zip_error_clear
 function clears the error state for the zip archive
-\fBarchive.\fR
+\fIarchive\fP.
 .PP
 The
 zip_file_error_clear
 function does the same for the zip file
-\fBfile.\fR
+\fIfile\fP.
 .SH "SEE ALSO"
 libzip(3),
 zip_error_get(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 5268723..fe1d79c 100644 (file)
@@ -1,5 +1,5 @@
-.\" zip_clear_error.mdoc -- clear error state for archive or file
-.\" Copyright (C) 2006 Dieter Baron and Thomas Klausner
+.\" zip_error_clear.mdoc -- clear error state for archive or file
+.\" Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,8 +29,8 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd October 4, 2006
-.Dt ZIP_CLEAR_ERROR 3
+.Dd October 30, 2014
+.Dt ZIP_ERROR_CLEAR 3
 .Os
 .Sh NAME
 .Nm zip_error_clear ,
@@ -41,9 +41,9 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft void
-.Fn zip_error_clear "struct zip *archive"
+.Fn zip_error_clear "zip_t *archive"
 .Ft void
-.Fn zip_file_error_clear "struct zip_file *file"
+.Fn zip_file_error_clear "zip_file_t *file"
 .Sh DESCRIPTION
 The
 .Fn zip_error_clear
@@ -59,6 +59,6 @@ function does the same for the zip file
 .Xr zip_error_get 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_error_code_system.man b/man/zip_error_code_system.man
new file mode 100644 (file)
index 0000000..91e1702
--- /dev/null
@@ -0,0 +1,26 @@
+.TH "ZIP_ERROR_CODE_SYSTEM" "3" "October 30, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_error_code_system\fP
+\- get operating system error part of zip_error
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_error_code_system const zip_error_t *ze
+.SH "DESCRIPTION"
+The
+zip_error_code_system
+function returns the system specific part of the error from the
+zip_error error
+\fIze\fP.
+For finding out what system reported the error, use
+zip_error_system_type(3).
+.SH "SEE ALSO"
+libzip(3),
+zip_error_code_zip(3),
+zip_error_system_type(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_error_code_system.mdoc b/man/zip_error_code_system.mdoc
new file mode 100644 (file)
index 0000000..6b9b3a4
--- /dev/null
@@ -0,0 +1,60 @@
+.\" zip_error_code_system.mdoc -- get system error part of zip_error
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 30, 2014
+.Dt ZIP_ERROR_CODE_SYSTEM 3
+.Os
+.Sh NAME
+.Nm zip_error_code_system
+.Nd get operating system error part of zip_error
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_error_code_system "const zip_error_t *ze"
+.Sh DESCRIPTION
+The
+.Fn zip_error_code_system
+function returns the system specific part of the error from the
+zip_error error
+.Ar ze .
+For finding out what system reported the error, use
+.Xr zip_error_system_type 3 .
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_error_code_zip 3 ,
+.Xr zip_error_system_type 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_error_code_zip.man b/man/zip_error_code_zip.man
new file mode 100644 (file)
index 0000000..87bf748
--- /dev/null
@@ -0,0 +1,23 @@
+.TH "ZIP_ERROR_CODE_ZIP" "3" "October 30, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_error_code_zip\fP
+\- get libzip error part of zip_error
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_error_code_zip const zip_error_t *ze
+.SH "DESCRIPTION"
+The
+zip_error_code_zip
+function returns the libzip specific part of the error from the
+zip_error error
+\fIze\fP.
+.SH "SEE ALSO"
+libzip(3),
+zip_error_code_system(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_error_code_zip.mdoc b/man/zip_error_code_zip.mdoc
new file mode 100644 (file)
index 0000000..2875d64
--- /dev/null
@@ -0,0 +1,57 @@
+.\" zip_error_code_zip.mdoc -- get libzip error part of zip_error
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 30, 2014
+.Dt ZIP_ERROR_CODE_ZIP 3
+.Os
+.Sh NAME
+.Nm zip_error_code_zip
+.Nd get libzip error part of zip_error
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_error_code_zip "const zip_error_t *ze"
+.Sh DESCRIPTION
+The
+.Fn zip_error_code_zip
+function returns the libzip specific part of the error from the
+zip_error error
+.Ar ze .
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_error_code_system 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_error_fini.man b/man/zip_error_fini.man
new file mode 100644 (file)
index 0000000..f8409da
--- /dev/null
@@ -0,0 +1,23 @@
+.TH "ZIP_ERROR_FINI" "3" "October 30, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_error_fini\fP
+\- clean up zip_error structure
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+void
+zip_error_fini zip_error_t *ze
+.SH "DESCRIPTION"
+The
+zip_error_fini
+function cleans up and frees internally allocated memory of the
+zip_error pointed to by
+\fIze\fP.
+.SH "SEE ALSO"
+libzip(3),
+zip_error_init(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_error_fini.mdoc b/man/zip_error_fini.mdoc
new file mode 100644 (file)
index 0000000..6f7dffa
--- /dev/null
@@ -0,0 +1,57 @@
+.\" zip_error_fini.mdoc -- clean up zip_error
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 30, 2014
+.Dt ZIP_ERROR_FINI 3
+.Os
+.Sh NAME
+.Nm zip_error_fini
+.Nd clean up zip_error structure
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft void
+.Fn zip_error_fini "zip_error_t *ze"
+.Sh DESCRIPTION
+The
+.Fn zip_error_fini
+function cleans up and frees internally allocated memory of the
+zip_error pointed to by
+.Ar ze .
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_error_init 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
index ce3d547..73e5db0 100644 (file)
@@ -1,80 +1,65 @@
-.\" zip_error_get.mdoc \-- get error codes for archive or file
-.\" Copyright (C) 2004, 2005 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_ERROR_GET 3 "October 4, 2006" NiH
+.TH "ZIP_ERROR_GET" "3" "December 2, 2014" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_error_get , \- .Nm zip_file_error_get
-get error codes for archive or file
+\fBzip_error_get\fP,
+\fBzip_file_error_get\fP
+\- get error codes for archive or file
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 void
-zip_error_get(struct zip *archive, int *zep, int *sep);
-.PP
+zip_error_get zip_t *archive int *zep int *sep
 void
-zip_file_error_get(struct zip_file *file, int *zep, int *sep);
+zip_file_error_get zip_file_t *file int *zep int *sep
 .SH "DESCRIPTION"
-The
+The functions
 zip_error_get
-function returns the error codes for the zip archive
-\fBarchive.\fR
-If
-\fBzep\fR
-is not
-\fBNULL,\fR
-\fB*zep\fR
-will be filled in with the error code from libzip.
-Similarly,
-\fB*sep\fR
-will contain the corresponding system error code, if
-\fBsep\fR
-is not
-\fBNULL;\fR
-use
-zip_error_get_sys_type
-to determine the type of system error code.
-.PP
-The
+and
 zip_file_error_get
-function does the same for the zip file
-\fBfile.\fR
+are deprecated.
+Use
+zip_error_code_system(3),
+zip_error_code_zip(3),
+zip_file_get_error(3),
+and
+zip_get_error(3)
+instead.
+.PP
+For
+zip_error_get,
+replace
+.nf
+int ze, se;
+zip_error_get(za, &ze, &se);
+.fi
+with
+.nf
+int ze, se;
+zip_error_t *error = zip_get_error(za);
+ze = zip_error_code_zip(error);
+se = zip_error_code_system(error);
+.fi
+For
+zip_file_error_get,
+replace
+.nf
+int ze, se;
+zip_file_error_get(zf, &ze, &se);
+.fi
+with
+.nf
+int ze, se;
+zip_error_t *error = zip_file_get_error(zf);
+ze = zip_error_code_zip(error);
+se = zip_error_code_system(error);
+.fi
 .SH "SEE ALSO"
 libzip(3),
-zip_error_clear(3),
-zip_error_get_sys_type(3),
-zip_error_to_str(3)
+zip_error_code_system(3),
+zip_error_code_zip(3),
+zip_file_get_error(3),
+zip_get_error(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 4fdf20a..26a8bed 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_error_get.mdoc -- get error codes for archive or file
-.\" Copyright (C) 2004, 2005 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd October 4, 2006
+.Dd December 2, 2014
 .Dt ZIP_ERROR_GET 3
 .Os
 .Sh NAME
@@ -41,41 +41,59 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft void
-.Fn zip_error_get "struct zip *archive" "int *zep" "int *sep"
+.Fn zip_error_get "zip_t *archive" "int *zep" "int *sep"
 .Ft void
-.Fn zip_file_error_get "struct zip_file *file" "int *zep" "int *sep"
+.Fn zip_file_error_get "zip_file_t *file" "int *zep" "int *sep"
 .Sh DESCRIPTION
-The
+The functions
 .Fn zip_error_get
-function returns the error codes for the zip archive
-.Ar archive .
-If
-.Ar zep
-is not
-.Dv NULL ,
-.Ar *zep
-will be filled in with the error code from libzip.
-Similarly,
-.Ar *sep
-will contain the corresponding system error code, if
-.Ar sep
-is not
-.Dv NULL ;
-use
-.Fn zip_error_get_sys_type
-to determine the type of system error code.
-.Pp
-The
+and
 .Fn zip_file_error_get
-function does the same for the zip file
-.Ar file .
+are deprecated.
+Use
+.Xr zip_error_code_system 3 ,
+.Xr zip_error_code_zip 3 ,
+.Xr zip_file_get_error 3 ,
+and
+.Xr zip_get_error 3
+instead.
+.Pp
+For
+.Fn zip_error_get ,
+replace
+.Bd -literal -offset indent
+int ze, se;
+zip_error_get(za, &ze, &se);
+.Ed
+with
+.Bd -literal -offset indent
+int ze, se;
+zip_error_t *error = zip_get_error(za);
+ze = zip_error_code_zip(error);
+se = zip_error_code_system(error);
+.Ed
+For
+.Fn zip_file_error_get ,
+replace
+.Bd -literal -offset indent
+int ze, se;
+zip_file_error_get(zf, &ze, &se);
+.Ed
+with
+.Bd -literal -offset indent
+int ze, se;
+zip_error_t *error = zip_file_get_error(zf);
+ze = zip_error_code_zip(error);
+se = zip_error_code_system(error);
+.Ed
 .Sh SEE ALSO
 .Xr libzip 3 ,
-.Xr zip_error_clear 3 ,
-.Xr zip_error_get_sys_type 3 ,
-.Xr zip_error_to_str 3
+.Xr zip_error_code_system 3 ,
+.Xr zip_error_code_zip 3 ,
+.Xr zip_file_get_error 3 ,
+.Xr zip_get_error 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 9e13948..4d79406 100644 (file)
@@ -1,69 +1,37 @@
-.\" zip_error_get_sys_type.mdoc \-- get type of error
-.\" Copyright (C) 2004, 2005 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_ERROR_SYS_TYPE 3 "November 30, 2004" NiH
+.TH "ZIP_ERROR_GET_SYS_TYPE" "3" "December 2, 2014" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_error_get_sys_type \- get type of system error code
+\fBzip_error_get_sys_type\fP
+\- get type of system error code
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_error_get_sys_type(int ze);
+zip_error_get_sys_type int ze
 .SH "DESCRIPTION"
-The
+The function
 zip_error_get_sys_type
-function returns the type of the system error code for the libzip error
-\fBze.\fR
-Possible types are:
-.RS
-.TP 16
-\fBZIP_ET_NONE\fR
-System error code is unused.
-.TP 16
-\fBZIP_ET_SYS\fR
-System error code is an errno value.
-.TP 16
-\fBZIP_ET_ZLIB\fR
-System error code is from
-zlib(3).
-.RE
+is deprecated; use
+zip_error_init_with_code(3)
+and
+zip_error_system_type(3)
+instead.
+.PP
+Replace
+.nf
+int i = zip_error_get_sys_type(ze);
+.fi
+with
+.nf
+zip_error_t error;
+zip_error_init_with_code(&error, ze);
+int i = zip_error_system_type(&error);
+.fi
 .SH "SEE ALSO"
 libzip(3),
-zip_error_get(3),
-zip_error_to_str(3),
-zip_file_error_get(3)
+zip_error_init_with_code(3),
+zip_error_system_type(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index dedab2c..0e656e3 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_error_get_sys_type.mdoc -- get type of error
-.\" Copyright (C) 2004, 2005 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,8 +29,8 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd November 30, 2004
-.Dt ZIP_ERROR_SYS_TYPE 3
+.Dd December 2, 2014
+.Dt ZIP_ERROR_GET_SYS_TYPE 3
 .Os
 .Sh NAME
 .Nm zip_error_get_sys_type
@@ -42,27 +42,30 @@ libzip (-lzip)
 .Ft int
 .Fn zip_error_get_sys_type "int ze"
 .Sh DESCRIPTION
-The
+The function
 .Fn zip_error_get_sys_type
-function returns the type of the system error code for the libzip error
-.Ar ze .
-Possible types are:
-.Bl -tag -width XZIP_ET_NONEXX -offset indent -compact
-.It Dv ZIP_ET_NONE
-System error code is unused.
-.It Dv ZIP_ET_SYS
-System error code is an errno value.
-.It Dv ZIP_ET_ZLIB
-System error code is from
-.Xr zlib 3 .
-.El
+is deprecated; use
+.Xr zip_error_init_with_code 3
+and
+.Xr zip_error_system_type 3
+instead.
+.Pp
+Replace
+.Bd -literal -offset indent
+int i = zip_error_get_sys_type(ze);
+.Ed
+with
+.Bd -literal -offset indent
+zip_error_t error;
+zip_error_init_with_code(&error, ze);
+int i = zip_error_system_type(&error);
+.Ed
 .Sh SEE ALSO
 .Xr libzip 3 ,
-.Xr zip_error_get  3 ,
-.Xr zip_error_to_str  3 ,
-.Xr zip_file_error_get  3
+.Xr zip_error_init_with_code 3 ,
+.Xr zip_error_system_type 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_error_init.man b/man/zip_error_init.man
new file mode 100644 (file)
index 0000000..42cfc3f
--- /dev/null
@@ -0,0 +1,36 @@
+.TH "ZIP_ERROR_INIT" "3" "December 2, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_error_init\fP,
+\fBzip_error_init_with_code\fP
+\- initialize zip_error structure
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+void
+zip_error_init zip_error_t *error
+void
+zip_error_init_with_code zip_error_t *error int ze
+.SH "DESCRIPTION"
+The
+zip_error_init
+function initializes the zip_error pointed to by
+\fIerror\fP.
+\fI*error\fP
+must be allocated before calling
+zip_error_init.
+.PP
+The
+zip_error_init_with_code
+function does the same, but additionally sets the zip error code to
+\fIze\fP
+and sets the system error code to the current
+errno(3)
+value, if appropriate.
+.SH "SEE ALSO"
+libzip(3),
+zip_error_fini(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
similarity index 61%
rename from man/ziptorrent.man
rename to man/zip_error_init.mdoc
index 59edc63..3f6cbf7 100644 (file)
@@ -1,5 +1,5 @@
-.\" ziptorrent.mdoc \-- torrentzip zip archives
-.\" Copyright (C) 2008 Dieter Baron and Thomas Klausner
+.\" zip_error_init.mdoc -- initialize zip_error
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.TH ZIPTORRENT 1 "July 24, 2008" NiH
-.SH "NAME"
-ziptorrent \- torrentzip zip archives
-.SH "SYNOPSIS"
-.B ziptorrent
-[\fB-hnVv\fR]
-\fBarchive Op \fB...\fR\fR
-.SH "DESCRIPTION"
-.B ziptorrent
-torrentzips
-\fBarchive.\fR
-This is a restricted file format used for using bittorrent on zip
-files.
-Please see
-zip_set_archive_flag(3)
-for details on what information gets lost through this process.
-.PP
-Supported options:
-.RS
-.TP 5
-\fB-h\fR
-Display a short help message and exit.
-.TP 5
-\fB-n\fR
-Don't actually change archives, just print what would be done.
-.TP 5
-\fB-V\fR
-Display version information and exit.
-.TP 5
-\fB-v\fR
-Be verbose: print which archives are already torrentzipped and which
-need to be rezipped.
-.RE
-.SH "EXIT STATUS"
-.B ziptorrent
-exits 0 on success and \*[Gt]1 if an error occurred.
-.SH "SEE ALSO"
-zipcmp(1),
-zipmerge(1),
-libzip(3)
-.SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+.Dd December 2, 2014
+.Dt ZIP_ERROR_INIT 3
+.Os
+.Sh NAME
+.Nm zip_error_init ,
+.Nm zip_error_init_with_code
+.Nd initialize zip_error structure
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft void
+.Fn zip_error_init "zip_error_t *error"
+.Ft void
+.Fn zip_error_init_with_code "zip_error_t *error" "int ze"
+.Sh DESCRIPTION
+The
+.Fn zip_error_init
+function initializes the zip_error pointed to by
+.Ar error .
+.Ar *error
+must be allocated before calling
+.Fn zip_error_init .
+.Pp
+The
+.Fn zip_error_init_with_code
+function does the same, but additionally sets the zip error code to
+.Ar ze
+and sets the system error code to the current
+.Xr errno 3
+value, if appropriate.
+.\" TODO: describe when you would need to call this at all
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_error_fini 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-Thomas Klausner <tk@giga.or.at>
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_error_set.man b/man/zip_error_set.man
new file mode 100644 (file)
index 0000000..98f8284
--- /dev/null
@@ -0,0 +1,32 @@
+.TH "ZIP_ERROR_SET" "3" "October 30, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_error_set\fP
+\- fill in zip_error structure
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+void
+zip_error_set zip_error_t *ze int le int se
+.SH "DESCRIPTION"
+The
+zip_error_set
+function sets the zip_error pointed to by
+\fIze\fP
+to the libzip error code
+\fIle\fP
+and the system error code
+\fIse\fP.
+.PP
+\fIze\fP
+must be allocated and initialized with
+zip_error_fini(3)
+before calling
+zip_error set.
+.SH "SEE ALSO"
+libzip(3),
+zip_error_init(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_error_set.mdoc b/man/zip_error_set.mdoc
new file mode 100644 (file)
index 0000000..4cb82ff
--- /dev/null
@@ -0,0 +1,66 @@
+.\" zip_error_set.mdoc -- set zip_error
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 30, 2014
+.Dt ZIP_ERROR_SET 3
+.Os
+.Sh NAME
+.Nm zip_error_set
+.Nd fill in zip_error structure
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft void
+.Fn zip_error_set "zip_error_t *ze" "int le" "int se"
+.Sh DESCRIPTION
+The
+.Fn zip_error_set
+function sets the zip_error pointed to by
+.Ar ze
+to the libzip error code
+.Ar le
+and the system error code
+.Ar se .
+.Pp
+.Ar ze
+must be allocated and initialized with
+.Xr zip_error_fini 3
+before calling
+.Fn zip_error set .
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_error_init 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_error_strerror.man b/man/zip_error_strerror.man
new file mode 100644 (file)
index 0000000..40abf4f
--- /dev/null
@@ -0,0 +1,30 @@
+.TH "ZIP_ERROR_STRERROR" "3" "October 30, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_error_strerror\fP
+\- create human-readable string for zip_error
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+const char *
+zip_error_strerror zip_error_t *ze
+.SH "DESCRIPTION"
+The
+zip_error_strerror
+function returns an error message string corresponding to
+\fIze\fP
+like
+strerror(3).
+This string will stay valid until the next call to
+zip_error_strerror
+or until
+zip_error_fini(3)
+is called.
+.SH "SEE ALSO"
+libzip(3),
+strerror(3),
+zip_error_fini(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_error_strerror.mdoc b/man/zip_error_strerror.mdoc
new file mode 100644 (file)
index 0000000..6e8b27b
--- /dev/null
@@ -0,0 +1,64 @@
+.\" zip_error_strerror.mdoc -- create human-readable version of zip_error
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 30, 2014
+.Dt ZIP_ERROR_STRERROR 3
+.Os
+.Sh NAME
+.Nm zip_error_strerror
+.Nd create human-readable string for zip_error
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft const char *
+.Fn zip_error_strerror "zip_error_t *ze"
+.Sh DESCRIPTION
+The
+.Fn zip_error_strerror
+function returns an error message string corresponding to
+.Ar ze
+like
+.Xr strerror 3 .
+This string will stay valid until the next call to
+.Fn zip_error_strerror
+or until
+.Xr zip_error_fini 3
+is called.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr strerror 3 ,
+.Xr zip_error_fini 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_error_system_type.man b/man/zip_error_system_type.man
new file mode 100644 (file)
index 0000000..91f7ab8
--- /dev/null
@@ -0,0 +1,40 @@
+.TH "ZIP_ERROR_SYSTEM_TYPE" "3" "October 30, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_error_system_type\fP
+\- return type of system error
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_error_system_type const zip_error_t *ze
+.SH "DESCRIPTION"
+The
+zip_error_system_type
+function returns the type of the system specific part for the zip_error
+\fIze\fP.
+Currently, the following system types are defined:
+.TP ZIP_ET_NONE
+\fRZIP_ET_NONE\fP
+System specific part of
+\fIze\fP
+is unused.
+.TP ZIP_ET_NONE
+\fRZIP_ET_SYS\fP
+System specific part of
+\fIze\fP
+is an
+errno(2).
+.TP ZIP_ET_NONE
+\fRZIP_ET_ZLIB\fP
+\fIze\fP
+is a
+zlib(3)
+error.
+.SH "SEE ALSO"
+libzip(3),
+zip_error_code_system(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_error_system_type.mdoc b/man/zip_error_system_type.mdoc
new file mode 100644 (file)
index 0000000..cdab136
--- /dev/null
@@ -0,0 +1,74 @@
+.\" zip_error_system_type.mdoc -- return system type for error
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 30, 2014
+.Dt ZIP_ERROR_SYSTEM_TYPE 3
+.Os
+.Sh NAME
+.Nm zip_error_system_type
+.Nd return type of system error
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_error_system_type "const zip_error_t *ze"
+.Sh DESCRIPTION
+The
+.Fn zip_error_system_type
+function returns the type of the system specific part for the zip_error
+.Ar ze .
+Currently, the following system types are defined:
+.Bl -tag -width ZIP_ET_NONE
+.It Dv ZIP_ET_NONE
+System specific part of
+.Ar ze
+is unused.
+.It Dv ZIP_ET_SYS
+System specific part of
+.Ar ze
+is an
+.Xr errno 2 .
+.It Dv ZIP_ET_ZLIB
+.System specific part of
+.Ar ze
+is a
+.Xr zlib 3
+error.
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_error_code_system 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_error_to_data.man b/man/zip_error_to_data.man
new file mode 100644 (file)
index 0000000..4e88985
--- /dev/null
@@ -0,0 +1,32 @@
+.TH "ZIP_ERROR_TO_DATA" "3" "November 2, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_error_to_data\fP
+\- convert zip_error to return value suitable for ZIP_SOURCE_ERROR
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_int64_t
+zip_error_to_data const zip_error_t *ze void *data zip_uint64_t len
+.SH "DESCRIPTION"
+zip_error_to_data
+function converts the zip_error
+\fIze\fP
+into data suitable as return value for
+\fRZIP_SOURCE_ERROR\fP.
+The data is written into the buffer
+\fIdata\fP
+of size
+\fIlen\fP.
+If the buffer is not large enough to hold 2 ints, an error is
+returned.
+.SH "RETURN VALUES"
+zip_error_to_data
+returns 2*(sizeof int) on success, and \-1 on error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source_function(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_error_to_data.mdoc b/man/zip_error_to_data.mdoc
new file mode 100644 (file)
index 0000000..d2cbf8e
--- /dev/null
@@ -0,0 +1,66 @@
+.\" zip_error_to_data.mdoc -- create error data for ZIP_SOURCE_ERROR
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 2, 2014
+.Dt ZIP_ERROR_TO_DATA 3
+.Os
+.Sh NAME
+.Nm zip_error_to_data
+.Nd convert zip_error to return value suitable for ZIP_SOURCE_ERROR
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft zip_int64_t
+.Fn zip_error_to_data "const zip_error_t *ze" "void *data" "zip_uint64_t len"
+.Sh DESCRIPTION
+.Fn zip_error_to_data
+function converts the zip_error
+.Ar ze
+into data suitable as return value for
+.Dv ZIP_SOURCE_ERROR .
+The data is written into the buffer
+.Ar data
+of size
+.Ar len .
+If the buffer is not large enough to hold 2 ints, an error is
+returned.
+.Sh RETURN VALUES
+.Fn zip_error_to_data
+returns 2*(sizeof int) on success, and \-1 on error.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source_function 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 6cdfb94..e411684 100644 (file)
@@ -1,86 +1,40 @@
-.\" zip_error_to_str.mdoc \-- get string representation of zip error code
-.\" Copyright (C) 2003-2009 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_ERROR_TO_STR 3 "March 10, 2009" NiH
+.TH "ZIP_ERROR_TO_STR" "3" "December 2, 2014" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_error_to_str \- get string representation of zip error
+\fBzip_error_to_str\fP
+\- get string representation of zip error
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_error_to_str(char *buf, zip_uint64_t len, int ze, int se);
+zip_error_to_str char *buf zip_uint64_t len int ze int se
 .SH "DESCRIPTION"
-The
+The function
 zip_error_to_str
-function stores a string describing the libzip error code
-\fBze\fR
-in the user-provided buffer
-\fBbuf\fR
-which has size
-\fBlen.\fR
-The buffer is always NUL-terminated.
-\fBse\fR
-should be the value of the global variable
-\fBerrno\fR
-at the time of the error or the zlib error code, depending on
-\fBze.\fR
+is deprecated; use
+zip_error_init_with_code(3)
+and
+zip_error_strerror(3)
+instead.
 .PP
-zip_error_to_str
-is especially useful if
-zip_open
-failed, since then there is no
-.Vt struct zip
-is available to store the error code; otherwise
-zip_strerror
-or
-zip_file_strerror
-are more convenient.
-.SH "RETURN VALUES"
-zip_error_to_str
-returns the number of characters that would have been written to a
-sufficiently sized
-\fBbuf,\fR
-excluding the terminating NUL character.
+Replace
+.nf
+char buf[BUFSIZE];
+zip_error_to_str(buf, sizeof(buf), ze, se);
+printf("%s", buf);
+.fi
+with
+.nf
+zip_error_t error;
+zip_error_init_with_code(&error, ze);
+printf("%s", zip_error_strerror(&error));
+zip_error_fini(&error);
+.fi
 .SH "SEE ALSO"
 libzip(3),
-zip_error_get(3),
-zip_error_get_sys_type(3),
-zip_file_error_get(3),
-zip_file_strerror(3),
-zip_open(3),
-zip_strerror(3)
+zip_error_init_with_code(3),
+zip_error_strerror(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 870029d..1ff2846 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_error_to_str.mdoc -- get string representation of zip error code
-.\" Copyright (C) 2003-2009 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd March 10, 2009
+.Dd December 2, 2014
 .Dt ZIP_ERROR_TO_STR 3
 .Os
 .Sh NAME
@@ -42,47 +42,33 @@ libzip (-lzip)
 .Ft int
 .Fn zip_error_to_str "char *buf" "zip_uint64_t len" "int ze" "int se"
 .Sh DESCRIPTION
-The
+The function
 .Fn zip_error_to_str
-function stores a string describing the libzip error code
-.Ar ze
-in the user-provided buffer
-.Ar buf
-which has size
-.Ar len .
-The buffer is always NUL-terminated.
-.Ar se
-should be the value of the global variable
-.Ar errno
-at the time of the error or the zlib error code, depending on
-.Ar ze .
+is deprecated; use
+.Xr zip_error_init_with_code 3
+and
+.Xr zip_error_strerror 3
+instead.
 .Pp
-.Fn zip_error_to_str
-is especially useful if
-.Fn zip_open
-failed, since then there is no
-.Vt struct zip
-is available to store the error code; otherwise
-.Fn zip_strerror
-or
-.Fn zip_file_strerror
-are more convenient.
-.Sh RETURN VALUES
-.Fn zip_error_to_str
-returns the number of characters that would have been written to a
-sufficiently sized
-.Ar buf ,
-excluding the terminating NUL character.
+Replace
+.Bd -literal -offset indent
+char buf[BUFSIZE];
+zip_error_to_str(buf, sizeof(buf), ze, se);
+printf("%s", buf);
+.Ed
+with
+.Bd -literal -offset indent
+zip_error_t error;
+zip_error_init_with_code(&error, ze);
+printf("%s", zip_error_strerror(&error));
+zip_error_fini(&error);
+.Ed
 .Sh SEE ALSO
 .Xr libzip 3 ,
-.Xr zip_error_get 3 ,
-.Xr zip_error_get_sys_type 3 ,
-.Xr zip_file_error_get 3 ,
-.Xr zip_file_strerror 3 ,
-.Xr zip_open 3 ,
-.Xr zip_strerror 3
+.Xr zip_error_init_with_code 3 ,
+.Xr zip_error_strerror 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 99707c4..f39801e 100644 (file)
-.\" zip_errors.mdoc \-- list of all libzip error codes
-.\" Copyright (C) 2004, 2005 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\"   This file was generated automatically by./make_zip_errors.sh
-.\"   from./../lib/zip.h; make changes there.
-.\"
-.TH ZIP_ERRORS 3 "March 10, 2009" NiH
+.TH "ZIP_ERRORS" "3" "March 10, 2009" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_errors \- list of all libzip error codes
+\fBzip_errors\fP
+\- list of all libzip error codes
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
+zip.h
 .SH "DESCRIPTION"
 The following error codes are used by libzip:
-.RS
-.TP 23
-[ZIP_ER_OK]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_OK\fP]
 No error.
-.TP 23
-[ZIP_ER_MULTIDISK]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_MULTIDISK\fP]
 Multi-disk zip archives not supported.
-.TP 23
-[ZIP_ER_RENAME]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_RENAME\fP]
 Renaming temporary file failed.
-.TP 23
-[ZIP_ER_CLOSE]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_CLOSE\fP]
 Closing zip archive failed.
-.TP 23
-[ZIP_ER_SEEK]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_SEEK\fP]
 Seek error.
-.TP 23
-[ZIP_ER_READ]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_READ\fP]
 Read error.
-.TP 23
-[ZIP_ER_WRITE]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_WRITE\fP]
 Write error.
-.TP 23
-[ZIP_ER_CRC]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_CRC\fP]
 CRC error.
-.TP 23
-[ZIP_ER_ZIPCLOSED]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_ZIPCLOSED\fP]
 Containing zip archive was closed.
-.TP 23
-[ZIP_ER_NOENT]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_NOENT\fP]
 No such file.
-.TP 23
-[ZIP_ER_EXISTS]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_EXISTS\fP]
 File already exists.
-.TP 23
-[ZIP_ER_OPEN]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_OPEN\fP]
 Can't open file.
-.TP 23
-[ZIP_ER_TMPOPEN]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_TMPOPEN\fP]
 Failure to create temporary file.
-.TP 23
-[ZIP_ER_ZLIB]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_ZLIB\fP]
 Zlib error.
-.TP 23
-[ZIP_ER_MEMORY]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_MEMORY\fP]
 Malloc failure.
-.TP 23
-[ZIP_ER_CHANGED]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_CHANGED\fP]
 Entry has been changed.
-.TP 23
-[ZIP_ER_COMPNOTSUPP]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_COMPNOTSUPP\fP]
 Compression method not supported.
-.TP 23
-[ZIP_ER_EOF]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_EOF\fP]
 Premature EOF.
-.TP 23
-[ZIP_ER_INVAL]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_INVAL\fP]
 Invalid argument.
-.TP 23
-[ZIP_ER_NOZIP]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_NOZIP\fP]
 Not a zip archive.
-.TP 23
-[ZIP_ER_INTERNAL]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_INTERNAL\fP]
 Internal error.
-.TP 23
-[ZIP_ER_INCONS]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_INCONS\fP]
 Zip archive inconsistent.
-.TP 23
-[ZIP_ER_REMOVE]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_REMOVE\fP]
 Can't remove file.
-.TP 23
-[ZIP_ER_DELETED]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_DELETED\fP]
 Entry has been deleted.
-.TP 23
-[ZIP_ER_ENCRNOTSUPP]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_ENCRNOTSUPP\fP]
 Encryption method not supported.
-.TP 23
-[ZIP_ER_RDONLY]
-Read-only archive. 
-.TP 23
-[ZIP_ER_NOPASSWD]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_RDONLY\fP]
+Read-only archive.
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_NOPASSWD\fP]
 No password provided.
-.TP 23
-[ZIP_ER_WRONGPASSWD]
+.TP XZIPXERXCOMPNOTSUPPXX
+[\fRZIP_ER_WRONGPASSWD\fP]
 Wrong password provided.
-.RE
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 9aa4cc9..4447a37 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_errors.mdoc -- list of all libzip error codes
-.\" Copyright (C) 2004, 2005 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -96,7 +96,7 @@ Entry has been deleted.
 .It Bq Er ZIP_ER_ENCRNOTSUPP
 Encryption method not supported.
 .It Bq Er ZIP_ER_RDONLY
-Read-only archive. 
+Read-only archive.
 .It Bq Er ZIP_ER_NOPASSWD
 No password provided.
 .It Bq Er ZIP_ER_WRONGPASSWD
@@ -104,6 +104,6 @@ Wrong password provided.
 .El
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index a644c8f..154fa70 100644 (file)
@@ -1,49 +1,18 @@
-.\" zip_fclose.mdoc \-- close file in zip archive
-.\" Copyright (C) 2003, 2005 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_FCLOSE 3 "October 3, 2003" NiH
+.TH "ZIP_FCLOSE" "3" "October 3, 2003" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_fclose \- close file in zip archive
+\fBzip_fclose\fP
+\- close file in zip archive
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_fclose(struct zip_file *file);
+zip_fclose zip_file_t *file
 .SH "DESCRIPTION"
 The
 zip_fclose
 function closes
-\fBfile\fR
+\fIfile\fP
 and frees the memory allocated for it.
 .SH "RETURN VALUES"
 Upon successful completion 0 is returned.
@@ -53,7 +22,6 @@ libzip(3),
 zip_fopen(3),
 zip_fread(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index e709e8f..3c79a66 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_fclose.mdoc -- close file in zip archive
-.\" Copyright (C) 2003, 2005 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -40,7 +40,7 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_fclose "struct zip_file *file"
+.Fn zip_fclose "zip_file_t *file"
 .Sh DESCRIPTION
 The
 .Fn zip_fclose
@@ -56,6 +56,6 @@ Otherwise, the error code is returned.
 .Xr zip_fread 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index e08e806..9fba5dc 100644 (file)
-.\" zip_fdopen.mdoc \-- open zip archive using existing file descriptor
-.\" Copyright (C) 2009-2010 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_FDOPEN 3 "February 1, 2010" NiH
+.TH "ZIP_FDOPEN" "3" "February 13, 2012" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_fdopen \- open zip archive using open file descriptor
+\fBzip_fdopen\fP
+\- open zip archive using open file descriptor
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
-struct zip *
-zip_fdopen(int fd, int flags, int *errorp);
+zip.h
+zip_t *
+zip_fdopen int fd int flags int *errorp
 .SH "DESCRIPTION"
 The zip archive specified by the open file descriptor
-\fBfd\fR
+\fIfd\fP
 is opened and a pointer to a
-.PP
 struct zip,
 used to manipulate the archive, is returned.
 In contrast to
 zip_open(3),
 using
-.Nm zip_fdopen
+\fBzip_fdopen\fP
 the archive can only be opened in read-only mode.
 The
-\fBfd\fR
+\fIfd\fP
 argument may not be used any longer after calling
-.Nm zip_fdopen.
+\fBzip_fdopen\fP.
 The
-.Fa flags
+flags
 are specified by
-.I or'ing
+\fIor\fP'ing
 the following values, or 0 for none of them.
-.RS
-.TP 15
-\fBZIP_CHECKCONS\fR
-Perform additional consistency checks on the archive, and error if
-they fail.
-.RE
+.TP ZIP_CHECKCONS
+\fRZIP_CHECKCONS\fP
+Perform additional stricter consistency checks on the archive, and
+error if they fail.
 .PP
 If an error occurs and
-\fBerrorp\fR
+\fIerrorp\fP
 is
-.No non-\fBNULL,\fR
+non-\fRNULL\fP,
 it will be set to the corresponding error code.
 .SH "RETURN VALUES"
 Upon successful completion
 zip_fdopen
 returns a
-.PP
 struct zip
 pointer, and
-\fBfd\fR
+\fIfd\fP
 should not be used any longer, nor passed to
 close(2).
 Otherwise,
-\fBNULL\fR
+\fRNULL\fP
 is returned and
-\fB*errorp\fR
+\fI*errorp\fP
 is set to indicate the error.
 In the error case,
-\fBfd\fR
+\fIfd\fP
 remains unchanged.
 .SH "ERRORS"
 The file specified by
-\fBfd\fR
+\fIfd\fP
 is prepared for use by
 libzip(3)
 unless:
-.RS
-.TP 4
-[ZIP_ER_INCONS]
+.TP 17n
+[\fRZIP_ER_INCONS\fP]
 Inconsistencies were found in the file specified by
-\fBpath\fR
-and
-\fBZIP_CHECKCONS\fR
-was specified.
-.TP 4
-[ZIP_ER_INVAL]
+\fIpath\fP.
+This error is often caused by specifying
+\fRZIP_CHECKCONS\fP
+but can also happen without it.
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
 The
-\fBflags\fR
+\fIflags\fP
 argument is invalid.
 Not all
 zip_open(3)
 flags are allowed for
-.Nm zip_fdopen,
+\fBzip_fdopen\fP,
 see
-DESCRIPTION.
-.TP 4
-[ZIP_ER_MEMORY]
+\fIDESCRIPTION\fP.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
 Required memory could not be allocated.
-.TP 4
-[ZIP_ER_NOZIP]
+.TP 17n
+[\fRZIP_ER_NOZIP\fP]
 The file specified by
-\fBfd\fR
+\fIfd\fP
 is not a zip archive.
-.TP 4
-[ZIP_ER_OPEN]
+.TP 17n
+[\fRZIP_ER_OPEN\fP]
 The file specified by
-\fBfd\fR
+\fIfd\fP
 could not be prepared for use by
 libzip(3).
-.TP 4
-[ZIP_ER_READ]
+.TP 17n
+[\fRZIP_ER_READ\fP]
 A read error occurred; see
-.Va errno
+errno
 for details.
-.TP 4
-[ZIP_ER_SEEK]
+.TP 17n
+[\fRZIP_ER_SEEK\fP]
 The file specified by
-\fBfd\fR
+\fIfd\fP
 does not allow seeks.
-.RE
 .SH "SEE ALSO"
 libzip(3),
 zip_close(3),
 zip_error_to_str(3),
 zip_open(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 86fdaa3..2e568b3 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_fdopen.mdoc -- open zip archive using existing file descriptor
-.\" Copyright (C) 2009-2010 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 1, 2010
+.Dd February 13, 2012
 .Dt ZIP_FDOPEN 3
 .Os
 .Sh NAME
@@ -39,7 +39,7 @@
 libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
-.Ft struct zip *
+.Ft zip_t *
 .Fn zip_fdopen "int fd" "int flags" "int *errorp"
 .Sh DESCRIPTION
 The zip archive specified by the open file descriptor
@@ -63,8 +63,8 @@ are specified by
 the following values, or 0 for none of them.
 .Bl -tag -offset indent -width ZIP_CHECKCONS
 .It Dv ZIP_CHECKCONS
-Perform additional consistency checks on the archive, and error if
-they fail.
+Perform additional stricter consistency checks on the archive, and
+error if they fail.
 .El
 .Pp
 If an error occurs and
@@ -98,10 +98,10 @@ unless:
 .Bl -tag -width Er
 .It Bq Er ZIP_ER_INCONS
 Inconsistencies were found in the file specified by
-.Ar path
-and
+.Ar path .
+This error is often caused by specifying
 .Dv ZIP_CHECKCONS
-was specified.
+but can also happen without it.
 .It Bq Er ZIP_ER_INVAL
 The
 .Ar flags
@@ -139,6 +139,6 @@ does not allow seeks.
 .Xr zip_open 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_file_add.man b/man/zip_file_add.man
new file mode 100644 (file)
index 0000000..646c81e
--- /dev/null
@@ -0,0 +1,118 @@
+.TH "ZIP_FILE_ADD" "3" "August 2, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_file_add\fP,
+\fBzip_file_replace\fP
+\- add file to zip archive or replace file in zip archive
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_int64_t
+zip_file_add zip_t *archive const char *name zip_source_t *source zip_flags_t flags
+int
+zip_file_replace zip_t *archive zip_uint64_t index zip_source_t *source zip_flags_t flags
+.SH "DESCRIPTION"
+The function
+zip_file_add
+adds a file to a zip archive, while
+zip_file_replace
+replaces an existing file in a zip archive.
+The argument
+\fIarchive\fP
+specifies the zip archive to which the file should be added.
+\fIname\fP
+is the file's name in the zip archive (for
+zip_file_add),
+while
+\fIindex\fP
+specifies which file should be replaced (for
+zip_file_replace).
+The
+\fIflags\fP
+argument can be any combination of
+\fRZIP_FL_OVERWRITE\fP
+with one of
+\fRZIP_FL_ENC_*\fP:
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_OVERWRITE\fP
+Overwrite any existing file of the same name.
+For
+\fBzip_file_add\fP
+only.
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_ENC_GUESS\fP
+Guess encoding of
+\fIname\fP
+(default).
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_ENC_UTF_8\fP
+Interpret
+\fIname\fP
+as UTF-8.
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_ENC_CP437\fP
+Interpret
+\fIname\fP
+as code page 437 (CP-437).
+The data is obtained from the
+\fIsource\fP
+argument, see
+zip_source(3).
+.SH "RETURN VALUES"
+Upon successful completion,
+zip_file_add
+returns the index of the new file in the archive, and
+zip_file_replace
+returns 0.
+Otherwise, \-1 is returned and the error code in
+\fIarchive\fP
+is set to indicate the error.
+.SH "EXAMPLES"
+.nf
+zip_source_t *s;
+const char buf="teststring";
+
+if ((s=zip_source_buffer(archive, buffer, sizeof(buf), 0)) == NULL ||
+    zip_file_add(archive, name, s, ZIP_FL_ENC_UTF_8) < 0) {
+    zip_source_free(s);
+    printf("error adding file: %s\en", zip_strerror(archive));
+}
+.fi
+.SH "ERRORS"
+zip_file_add
+and
+zip_file_replace
+fail if:
+.TP 17n
+[\fRZIP_ER_EXISTS\fP]
+There is already a file called
+\fIname\fP
+in the archive.
+(Only applies to
+zip_file_add,
+and only if
+\fRZIP_FL_OVERWRITE\fP
+is not provided).
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIsource\fP
+or
+\fIname\fP
+are
+\fRNULL\fP,
+or
+\fIindex\fP
+is invalid.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
+Required memory could not be allocated.
+.TP 17n
+[\fRZIP_ER_RDONLY\fP]
+Archive was opened in read-only mode.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_file_add.mdoc b/man/zip_file_add.mdoc
new file mode 100644 (file)
index 0000000..0b1a47d
--- /dev/null
@@ -0,0 +1,150 @@
+.\" zip_file_add.mdoc -- add files to zip archive
+.\" Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd August 2, 2014
+.Dt ZIP_FILE_ADD 3
+.Os
+.Sh NAME
+.Nm zip_file_add ,
+.Nm zip_file_replace
+.Nd add file to zip archive or replace file in zip archive
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft zip_int64_t
+.Fn zip_file_add "zip_t *archive" "const char *name" \
+"zip_source_t *source" "zip_flags_t flags"
+.Ft int
+.Fn zip_file_replace "zip_t *archive" "zip_uint64_t index" \
+"zip_source_t *source" "zip_flags_t flags"
+.Sh DESCRIPTION
+The function
+.Fn zip_file_add
+adds a file to a zip archive, while
+.Fn zip_file_replace
+replaces an existing file in a zip archive.
+The argument
+.Ar archive
+specifies the zip archive to which the file should be added.
+.Ar name
+is the file's name in the zip archive (for
+.Fn zip_file_add ) ,
+while
+.Ar index
+specifies which file should be replaced (for
+.Fn zip_file_replace ) .
+The
+.Ar flags
+argument can be any combination of
+.Dv ZIP_FL_OVERWRITE
+with one of
+.Dv ZIP_FL_ENC_* :
+.Bl -tag -width XZIPXFLXENCXSTRICTXX
+.It Dv ZIP_FL_OVERWRITE
+Overwrite any existing file of the same name.
+For
+.Nm zip_file_add
+only.
+.It Dv ZIP_FL_ENC_GUESS
+Guess encoding of
+.Ar name
+(default).
+.It Dv ZIP_FL_ENC_UTF_8
+Interpret
+.Ar name
+as UTF-8.
+.It Dv ZIP_FL_ENC_CP437
+Interpret
+.Ar name
+as code page 437 (CP-437).
+.El
+The data is obtained from the
+.Ar source
+argument, see
+.Xr zip_source 3 .
+.Sh RETURN VALUES
+Upon successful completion,
+.Fn zip_file_add
+returns the index of the new file in the archive, and
+.Fn zip_file_replace
+returns 0.
+Otherwise, \-1 is returned and the error code in
+.Ar archive
+is set to indicate the error.
+.Sh EXAMPLES
+.Bd -literal -offset indent
+zip_source_t *s;
+const char buf="teststring";
+
+if ((s=zip_source_buffer(archive, buffer, sizeof(buf), 0)) == NULL ||
+    zip_file_add(archive, name, s, ZIP_FL_ENC_UTF_8) \*[Lt] 0) {
+    zip_source_free(s);
+    printf("error adding file: %s\en", zip_strerror(archive));
+}
+.Ed
+.Sh ERRORS
+.Fn zip_file_add
+and
+.Fn zip_file_replace
+fail if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_EXISTS
+There is already a file called
+.Ar name
+in the archive.
+(Only applies to
+.Fn zip_file_add ,
+and only if
+.Dv ZIP_FL_OVERWRITE
+is not provided).
+.It Bq Er ZIP_ER_INVAL
+.Ar source
+or
+.Ar name
+are
+.Dv NULL ,
+or
+.Ar index
+is invalid.
+.It Bq Er ZIP_ER_MEMORY
+Required memory could not be allocated.
+.It Bq Er ZIP_ER_RDONLY
+Archive was opened in read-only mode.
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_file_extra_field_delete.man b/man/zip_file_extra_field_delete.man
new file mode 100644 (file)
index 0000000..d3c07c1
--- /dev/null
@@ -0,0 +1,90 @@
+.TH "ZIP_FILE_EXTRA_FIELD_DELETE" "3" "July 31, 2013" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_file_extra_field_delete\fP,
+\fBzip_file_extra_field_delete_by_id\fP
+\- delete extra field for file in zip
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_file_extra_field_delete zip_t *archive zip_uint64_t index zip_uint16_t extra_field_index zip_flags_t flags
+int
+zip_file_extra_field_delete_by_id zip_t *archive zip_uint64_t index zip_uint16_t extra_field_id zip_uint16_t extra_field_index zip_flags_t flags
+.SH "DESCRIPTION"
+The
+zip_file_extra_field_delete
+function deletes the extra field with index
+\fIextra_field_index\fP
+for the file at position
+\fIindex\fP
+in the zip archive.
+.PP
+If
+\fIextra_field_index\fP
+is
+\fRZIP_EXTRA_FIELD_ALL\fP,
+then all extra fields will be deleted.
+.PP
+The following
+\fIflags\fP
+are supported:
+.TP ZIP_FL_CENTRALXX
+\fRZIP_FL_CENTRAL\fP
+Delete extra fields from the archive's central directory.
+.TP ZIP_FL_CENTRALXX
+\fRZIP_FL_LOCAL\fP
+Delete extra fields from the local file headers.
+.PP
+The
+zip_file_extra_field_delete_by_id
+function deletes the extra field with ID (two-byte signature)
+\fIextra_field_id\fP
+and index
+\fIextra_field_index\fP
+(in other words, the
+\fIextra_field_index\fP'th
+extra field with ID
+\fIextra_field_id\fP)
+The other arguments are the same as for
+zip_file_extra_field_delete
+(\fRZIP_EXTRA_FIELD_ALL\fP
+will delete all extra fields of the specified ID).
+.PP
+Please note that due to the library design, the index of an extra
+field may be different between central directory and local file
+headers.
+For this reason, it is not allowed to specify both
+\fRZIP_FL_CENTRAL\fP
+and
+\fRZIP_FL_LOCAL\fP
+in
+\fIflags\fP,
+except when deleting all extra fields (i.e.,
+\fIextra_field_index\fP
+being
+\fRZIP_EXTRA_FIELD_ALL\fP).
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error code in
+\fIarchive\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_file_extra_field_delete
+and
+zip_file_extra_field_delete_by_id
+fail if:
+.TP 17n
+[\fRZIP_ER_NOENT\fP]
+\fIindex\fP
+is not a valid file index in
+\fIarchive\fP.
+.SH "SEE ALSO"
+libzip(3),
+zip_file_extra_field_get(3),
+zip_file_extra_field_set(3),
+zip_file_extra_fields_count(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_file_extra_field_delete.mdoc b/man/zip_file_extra_field_delete.mdoc
new file mode 100644 (file)
index 0000000..68ce67d
--- /dev/null
@@ -0,0 +1,127 @@
+.\" zip_file_extra_field_delete.mdoc -- delete extra field for file in zip
+.\" Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP files.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd July 31, 2013
+.Dt ZIP_FILE_EXTRA_FIELD_DELETE 3
+.Os
+.Sh NAME
+.Nm zip_file_extra_field_delete ,
+.Nm zip_file_extra_field_delete_by_id
+.Nd delete extra field for file in zip
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_file_extra_field_delete "zip_t *archive" "zip_uint64_t index" \
+"zip_uint16_t extra_field_index" "zip_flags_t flags"
+.Ft int
+.Fn zip_file_extra_field_delete_by_id "zip_t *archive" "zip_uint64_t index" \
+"zip_uint16_t extra_field_id" "zip_uint16_t extra_field_index" "zip_flags_t flags"
+.Sh DESCRIPTION
+The
+.Fn zip_file_extra_field_delete
+function deletes the extra field with index
+.Ar extra_field_index
+for the file at position
+.Ar index
+in the zip archive.
+.Pp
+If
+.Ar extra_field_index
+is
+.Dv ZIP_EXTRA_FIELD_ALL ,
+then all extra fields will be deleted.
+.Pp
+The following
+.Ar flags
+are supported:
+.Bl -tag -width ZIP_FL_CENTRALXX -offset indent
+.It Dv ZIP_FL_CENTRAL
+Delete extra fields from the archive's central directory.
+.It Dv ZIP_FL_LOCAL
+Delete extra fields from the local file headers.
+.El
+.Pp
+The
+.Fn zip_file_extra_field_delete_by_id
+function deletes the extra field with ID (two-byte signature)
+.Ar extra_field_id
+and index
+.Ar extra_field_index
+(in other words, the
+.Ar extra_field_index Ns No 'th
+extra field with ID
+.Ar extra_field_id )
+The other arguments are the same as for
+.Fn zip_file_extra_field_delete
+.Dv ( ZIP_EXTRA_FIELD_ALL
+will delete all extra fields of the specified ID).
+.Pp
+Please note that due to the library design, the index of an extra
+field may be different between central directory and local file
+headers.
+For this reason, it is not allowed to specify both
+.Dv ZIP_FL_CENTRAL
+and
+.Dv ZIP_FL_LOCAL
+in
+.Ar flags ,
+except when deleting all extra fields (i.e.,
+.Ar extra_field_index
+being
+.Dv ZIP_EXTRA_FIELD_ALL ) .
+.Sh RETURN VALUES
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error code in
+.Ar archive
+is set to indicate the error.
+.Sh ERRORS
+.Fn zip_file_extra_field_delete
+and
+.Fn zip_file_extra_field_delete_by_id
+fail if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_NOENT
+.Ar index
+is not a valid file index in
+.Ar archive .
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_file_extra_field_get 3 ,
+.Xr zip_file_extra_field_set 3 ,
+.Xr zip_file_extra_fields_count 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_file_extra_field_get.man b/man/zip_file_extra_field_get.man
new file mode 100644 (file)
index 0000000..30aad9e
--- /dev/null
@@ -0,0 +1,118 @@
+.TH "ZIP_FILE_EXTRA_FIELD_GET" "3" "October 8, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_file_extra_field_get\fP,
+\fBzip_file_extra_field_get_by_id\fP
+\- get extra field for file in zip
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+const zip_uint8_t *
+zip_file_extra_field_get zip_t *archive zip_uint64_t index zip_uint16_t extra_field_index zip_uint16_t *idp zip_uint16_t *lenp zip_flags_t flags
+const zip_uint8_t *
+zip_file_extra_field_get_by_id zip_t *archive zip_uint64_t index zip_uint16_t extra_field_id zip_uint16_t extra_field_index zip_uint16_t *lenp zip_flags_t flags
+.SH "DESCRIPTION"
+The
+zip_file_extra_field_get
+function returns the extra field with index
+\fIextra_field_index\fP
+for the file at position
+\fIindex\fP
+in the zip archive.
+This pointer should not be modified or
+free(3)'d,
+and becomes invalid when
+\fIarchive\fP
+is closed.
+If
+\fIidp\fP
+is not
+\fRNULL\fP,
+the integer to which it points will be set to the ID (two-byte
+signature) of the selected extra field.
+If
+\fIlenp\fP
+is not
+\fRNULL\fP,
+the integer to which it points will be set to the length of the
+extra field.
+Generally speaking,
+\fIlenp\fP
+and
+\fIidp\fP
+should be passed since only the extra field data is returned (i.e.,
+neither the ID nor the length, if the
+\fIidp\fP
+and
+\fIlenp\fP
+arguments are not provided).
+.PP
+The following
+\fIflags\fP
+are supported:
+.TP ZIP_FL_UNCHANGEDXX
+\fRZIP_FL_CENTRAL\fP
+Return extra fields from the archive's central directory.
+.TP ZIP_FL_UNCHANGEDXX
+\fRZIP_FL_LOCAL\fP
+Return extra fields from the local file headers.
+.TP ZIP_FL_UNCHANGEDXX
+\fRZIP_FL_UNCHANGED\fP
+Return the original unchanged extra fields, ignoring any changes made.
+.PP
+The
+zip_file_extra_field_get_by_id
+function returns the extra field with ID (two-byte signature)
+\fIextra_field_id\fP
+and index
+\fIextra_field_index\fP
+(in other words, the
+\fIextra_field_index\fP'th
+extra field with ID
+\fIextra_field_id\fP)
+The other arguments are the same as for
+zip_file_extra_field_get.
+.SH "RETURN VALUES"
+Upon successful completion, a pointer to an extra field is returned,
+or
+\fRNULL\fP
+if there is no extra field with that
+\fIextra_field_index\fP
+for the file with index
+\fIindex\fP.
+In case of an error,
+\fRNULL\fP
+is returned and the error code in
+\fIarchive\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_file_extra_field_get
+and
+zip_file_extra_field_get_by_id
+fail if:
+.TP 17n
+[\fRZIP_ER_NOENT\fP]
+\fIindex\fP
+is not a valid file index in
+\fIarchive\fP,
+or
+\fIextra_field_index\fP
+is not a valid extra file index (for ID
+\fIextra_field_id\fP).
+.SH "SEE ALSO"
+libzip(3),
+zip_file_extra_field_delete(3),
+zip_file_extra_field_set(3),
+zip_file_extra_fields_count(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
+.SH "CAVEATS"
+Please note that the extra field IDs 0x0001 (ZIP64 extension),
+0x6375 (Infozip UTF-8 comment), and
+0x7075 (Infozip UTF-8 file name) can not be read using
+zip_file_extra_field_get
+since they are used by
+libzip(3)
+internally.
diff --git a/man/zip_file_extra_field_get.mdoc b/man/zip_file_extra_field_get.mdoc
new file mode 100644 (file)
index 0000000..c2cfdc9
--- /dev/null
@@ -0,0 +1,156 @@
+.\" zip_file_extra_field_get.mdoc -- get extra field for file in zip
+.\" Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP files.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 8, 2014
+.Dt ZIP_FILE_EXTRA_FIELD_GET 3
+.Os
+.Sh NAME
+.Nm zip_file_extra_field_get ,
+.Nm zip_file_extra_field_get_by_id
+.Nd get extra field for file in zip
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft const zip_uint8_t *
+.Fn zip_file_extra_field_get "zip_t *archive" "zip_uint64_t index" \
+"zip_uint16_t extra_field_index" "zip_uint16_t *idp" "zip_uint16_t *lenp" \
+"zip_flags_t flags"
+.Ft const zip_uint8_t *
+.Fn zip_file_extra_field_get_by_id "zip_t *archive" "zip_uint64_t index" \
+"zip_uint16_t extra_field_id" "zip_uint16_t extra_field_index" "zip_uint16_t *lenp" \
+"zip_flags_t flags"
+.Sh DESCRIPTION
+The
+.Fn zip_file_extra_field_get
+function returns the extra field with index
+.Ar extra_field_index
+for the file at position
+.Ar index
+in the zip archive.
+This pointer should not be modified or
+.Xr free 3 Ap d ,
+and becomes invalid when
+.Ar archive
+is closed.
+If
+.Ar idp
+is not
+.Dv NULL ,
+the integer to which it points will be set to the ID (two-byte
+signature) of the selected extra field.
+If
+.Ar lenp
+is not
+.Dv NULL ,
+the integer to which it points will be set to the length of the
+extra field.
+Generally speaking,
+.Ar lenp
+and
+.Ar idp
+should be passed since only the extra field data is returned (i.e.,
+neither the ID nor the length, if the
+.Ar idp
+and
+.Ar lenp
+arguments are not provided).
+.Pp
+The following
+.Ar flags
+are supported:
+.Bl -tag -width ZIP_FL_UNCHANGEDXX -offset indent
+.It Dv ZIP_FL_CENTRAL
+Return extra fields from the archive's central directory.
+.It Dv ZIP_FL_LOCAL
+Return extra fields from the local file headers.
+.It Dv ZIP_FL_UNCHANGED
+Return the original unchanged extra fields, ignoring any changes made.
+.El
+.Pp
+The
+.Fn zip_file_extra_field_get_by_id
+function returns the extra field with ID (two-byte signature)
+.Ar extra_field_id
+and index
+.Ar extra_field_index
+(in other words, the
+.Ar extra_field_index Ns No 'th
+extra field with ID
+.Ar extra_field_id )
+The other arguments are the same as for
+.Fn zip_file_extra_field_get .
+.Sh RETURN VALUES
+Upon successful completion, a pointer to an extra field is returned,
+or
+.Dv NULL
+if there is no extra field with that
+.Ar extra_field_index
+for the file with index
+.Ar index .
+In case of an error,
+.Dv NULL
+is returned and the error code in
+.Ar archive
+is set to indicate the error.
+.Sh ERRORS
+.Fn zip_file_extra_field_get
+and
+.Fn zip_file_extra_field_get_by_id
+fail if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_NOENT
+.Ar index
+is not a valid file index in
+.Ar archive ,
+or
+.Ar extra_field_index
+is not a valid extra file index (for ID
+.Ar extra_field_id ) .
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_file_extra_field_delete 3 ,
+.Xr zip_file_extra_field_set 3 ,
+.Xr zip_file_extra_fields_count 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
+.Sh CAVEATS
+Please note that the extra field IDs 0x0001 (ZIP64 extension),
+0x6375 (Infozip UTF-8 comment), and
+0x7075 (Infozip UTF-8 file name) can not be read using
+.Fn zip_file_extra_field_get
+since they are used by
+.Xr libzip 3
+internally.
diff --git a/man/zip_file_extra_field_set.man b/man/zip_file_extra_field_set.man
new file mode 100644 (file)
index 0000000..b7385ec
--- /dev/null
@@ -0,0 +1,79 @@
+.TH "ZIP_FILE_EXTRA_FIELD_SET" "3" "February 20, 2013" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_file_extra_field_set\fP
+\- set extra field for file in zip
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_file_extra_field_set zip_t *archive zip_uint64_t index zip_uint16_t extra_field_id zip_uint16_t extra_field_index const zip_uint8_t *extra_field_data zip_uint16_t len zip_flags_t flags
+.SH "DESCRIPTION"
+The
+zip_file_extra_field_set
+function sets the extra field with ID (two-byte signature)
+\fIextra_field_id\fP
+and index
+\fIextra_field_index\fP
+for the file at position
+\fIindex\fP
+in the zip archive.
+The extra field's data will be set to
+\fIextra_field_data\fP
+and length
+\fIlen\fP.
+If a new entry shall be appended, set
+\fIextra_field_index\fP
+to
+\fRZIP_EXTRA_FIELD_NEW\fP.
+.PP
+At least one of the following
+\fIflags\fP
+must be set:
+.TP ZIP_FL_CENTRALXX
+\fRZIP_FL_CENTRAL\fP
+Set extra field in the archive's central directory.
+.TP ZIP_FL_CENTRALXX
+\fRZIP_FL_LOCAL\fP
+Set extra field in the local file headers.
+.PP
+Please note that the extra field IDs 0x0001 (ZIP64 extension),
+0x6375 (Infozip UTF-8 comment), and
+0x7075 (Infozip UTF-8 file name) can not be set using
+zip_file_extra_field_set
+since they are set by
+libzip(3)
+automatically when needed.
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error code in
+\fIarchive\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_file_extra_field_set
+fails if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+The extra field size is too large (ID and length need 4 bytes; the
+maximum length of all extra fields for one file combined is 65536
+bytes).
+This error also occurs if
+\fIextra_field_index\fP
+is too large.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
+Required memory could not be allocated.
+.TP 17n
+[\fRZIP_ER_NOENT\fP]
+\fIindex\fP
+is not a valid file index in
+\fIarchive\fP.
+.SH "SEE ALSO"
+libzip(3),
+zip_file_extra_field_delete(3),
+zip_file_extra_field_get(3),
+zip_file_extra_fields_count(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_file_extra_field_set.mdoc b/man/zip_file_extra_field_set.mdoc
new file mode 100644 (file)
index 0000000..585db4d
--- /dev/null
@@ -0,0 +1,115 @@
+.\" zip_file_extra_field_set.mdoc -- set extra field for file in zip
+.\" Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP files.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd February 20, 2013
+.Dt ZIP_FILE_EXTRA_FIELD_SET 3
+.Os
+.Sh NAME
+.Nm zip_file_extra_field_set
+.Nd set extra field for file in zip
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_file_extra_field_set "zip_t *archive" "zip_uint64_t index" \
+"zip_uint16_t extra_field_id" "zip_uint16_t extra_field_index" \
+"const zip_uint8_t *extra_field_data" "zip_uint16_t len" \
+"zip_flags_t flags"
+.Sh DESCRIPTION
+The
+.Fn zip_file_extra_field_set
+function sets the extra field with ID (two-byte signature)
+.Ar extra_field_id
+and index
+.Ar extra_field_index
+for the file at position
+.Ar index
+in the zip archive.
+The extra field's data will be set to
+.Ar extra_field_data
+and length
+.Ar len .
+If a new entry shall be appended, set
+.Ar extra_field_index
+to
+.Dv ZIP_EXTRA_FIELD_NEW .
+.Pp
+At least one of the following
+.Ar flags
+must be set:
+.Bl -tag -width ZIP_FL_CENTRALXX -offset indent
+.It Dv ZIP_FL_CENTRAL
+Set extra field in the archive's central directory.
+.It Dv ZIP_FL_LOCAL
+Set extra field in the local file headers.
+.El
+.Pp
+Please note that the extra field IDs 0x0001 (ZIP64 extension),
+0x6375 (Infozip UTF-8 comment), and
+0x7075 (Infozip UTF-8 file name) can not be set using
+.Fn zip_file_extra_field_set
+since they are set by
+.Xr libzip 3
+automatically when needed.
+.Sh RETURN VALUES
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error code in
+.Ar archive
+is set to indicate the error.
+.Sh ERRORS
+.Fn zip_file_extra_field_set
+fails if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_INVAL
+The extra field size is too large (ID and length need 4 bytes; the
+maximum length of all extra fields for one file combined is 65536
+bytes).
+This error also occurs if
+.Ar extra_field_index
+is too large.
+.It Bq Er ZIP_ER_MEMORY
+Required memory could not be allocated.
+.It Bq Er ZIP_ER_NOENT
+.Ar index
+is not a valid file index in
+.Ar archive .
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_file_extra_field_delete 3 ,
+.Xr zip_file_extra_field_get 3 ,
+.Xr zip_file_extra_fields_count 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_file_extra_fields_count.man b/man/zip_file_extra_fields_count.man
new file mode 100644 (file)
index 0000000..80916d4
--- /dev/null
@@ -0,0 +1,73 @@
+.TH "ZIP_FILE_EXTRA_FIELDS_COUNT" "3" "February 20, 2013" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_file_extra_fields_count\fP,
+\fBzip_file_extra_fields_count_by_id\fP
+\- count extra fields for file in zip
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_int16_t
+zip_file_extra_fields_count zip_t *archive zip_uint64_t index zip_flags_t flags
+zip_int16_t
+zip_file_extra_fields_count_by_id zip_t *archive zip_uint64_t index zip_uint16_t extra_field_id zip_flags_t flags
+.SH "DESCRIPTION"
+The
+zip_file_extra_fields_count
+function counts the extra fields for the file at position
+\fIindex\fP
+in the zip archive.
+.PP
+The following
+\fIflags\fP
+are supported:
+.TP ZIP_FL_CENTRALXX
+\fRZIP_FL_CENTRAL\fP
+Count extra fields from the archive's central directory.
+.TP ZIP_FL_CENTRALXX
+\fRZIP_FL_LOCAL\fP
+Count extra fields from the local file headers.
+.TP ZIP_FL_CENTRALXX
+\fRZIP_FL_UNCHANGED\fP
+Count the original unchanged extra fields, ignoring any changes made.
+.PP
+The
+zip_file_extra_fields_count_by_id
+function counts the extra fields with ID (two-byte signature)
+\fIextra_field_id\fP.
+The other arguments are the same as for
+zip_file_extra_fields_count.
+.PP
+Extra fields that are the same in the central directory and the local file
+header are merged into one.
+Therefore, the counts with
+\fRZIP_FL_CENTRAL\fP
+and
+\fRZIP_FL_LOCAL\fP
+do not need to add up to the same value as when given
+\fRZIP_FL_CENTRAL|ZIP_FL_LOCAL\fP
+at the same time.
+.SH "RETURN VALUES"
+Upon successful completion, the requested number of extra fields is returned.
+Otherwise, \-1 is returned and the error code in
+\fIarchive\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_file_extra_fields_count
+and
+zip_file_extra_fields_count_by_id
+fail if:
+.TP 17n
+[\fRZIP_ER_NOENT\fP]
+\fIindex\fP
+is not a valid file index in
+\fIarchive\fP.
+.SH "SEE ALSO"
+libzip(3),
+zip_file_extra_field_delete(3),
+zip_file_extra_field_get(3),
+zip_file_extra_field_set(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_file_extra_fields_count.mdoc b/man/zip_file_extra_fields_count.mdoc
new file mode 100644 (file)
index 0000000..9905d44
--- /dev/null
@@ -0,0 +1,110 @@
+.\" zip_file_extra_fields_count.mdoc -- count extra field for file in zip
+.\" Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP files.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd February 20, 2013
+.Dt ZIP_FILE_EXTRA_FIELDS_COUNT 3
+.Os
+.Sh NAME
+.Nm zip_file_extra_fields_count ,
+.Nm zip_file_extra_fields_count_by_id
+.Nd count extra fields for file in zip
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft zip_int16_t
+.Fn zip_file_extra_fields_count "zip_t *archive" "zip_uint64_t index" \
+"zip_flags_t flags"
+.Ft zip_int16_t
+.Fn zip_file_extra_fields_count_by_id "zip_t *archive" "zip_uint64_t index" \
+"zip_uint16_t extra_field_id" "zip_flags_t flags"
+.Sh DESCRIPTION
+The
+.Fn zip_file_extra_fields_count
+function counts the extra fields for the file at position
+.Ar index
+in the zip archive.
+.Pp
+The following
+.Ar flags
+are supported:
+.Bl -tag -width ZIP_FL_CENTRALXX -offset indent
+.It Dv ZIP_FL_CENTRAL
+Count extra fields from the archive's central directory.
+.It Dv ZIP_FL_LOCAL
+Count extra fields from the local file headers.
+.It Dv ZIP_FL_UNCHANGED
+Count the original unchanged extra fields, ignoring any changes made.
+.El
+.Pp
+The
+.Fn zip_file_extra_fields_count_by_id
+function counts the extra fields with ID (two-byte signature)
+.Ar extra_field_id .
+The other arguments are the same as for
+.Fn zip_file_extra_fields_count .
+.Pp
+Extra fields that are the same in the central directory and the local file
+header are merged into one.
+Therefore, the counts with
+.Dv ZIP_FL_CENTRAL
+and
+.Dv ZIP_FL_LOCAL
+do not need to add up to the same value as when given
+.Dv ZIP_FL_CENTRAL|ZIP_FL_LOCAL
+at the same time.
+.Sh RETURN VALUES
+Upon successful completion, the requested number of extra fields is returned.
+Otherwise, \-1 is returned and the error code in
+.Ar archive
+is set to indicate the error.
+.Sh ERRORS
+.Fn zip_file_extra_fields_count
+and
+.Fn zip_file_extra_fields_count_by_id
+fail if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_NOENT
+.Ar index
+is not a valid file index in
+.Ar archive .
+.\" TODO: _zip_read_local_ef errors
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_file_extra_field_delete 3 ,
+.Xr zip_file_extra_field_get 3 ,
+.Xr zip_file_extra_field_set 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_file_get_comment.man b/man/zip_file_get_comment.man
new file mode 100644 (file)
index 0000000..d505d6a
--- /dev/null
@@ -0,0 +1,81 @@
+.TH "ZIP_FILE_GET_COMMENT" "3" "September 19, 2013" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_file_get_comment\fP
+\- get comment for file in zip
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+const char *
+zip_file_get_comment zip_t *archive zip_uint64_t index zip_uint32_t *lenp zip_flags_t flags
+.SH "DESCRIPTION"
+The
+zip_file_get_comment
+function returns the comment for the file at position
+\fIindex\fP
+in the zip archive.
+The name is in UTF-8 encoding unless
+\fRZIP_FL_ENC_RAW\fP
+was specified (see below).
+This pointer should not be modified or
+free(3)'d,
+and becomes invalid when
+\fIarchive\fP
+is closed.
+If
+\fIlenp\fP
+is not
+\fRNULL\fP,
+the integer to which it points will be set to the length of the
+comment.
+If
+\fIflags\fP
+is set to
+\fRZIP_FL_UNCHANGED\fP,
+the original unchanged comment is returned.
+.PP
+Additionally, the following
+\fIflags\fP
+are supported:
+.TP ZIP_FL_ENC_STRICTXX
+\fRZIP_FL_ENC_RAW\fP
+Return the unmodified comment as it is in the ZIP archive.
+.TP ZIP_FL_ENC_STRICTXX
+\fRZIP_FL_ENC_GUESS\fP
+(Default.)
+Guess the encoding of the comment in the ZIP archive and convert it
+to UTF-8, if necessary.
+.TP ZIP_FL_ENC_STRICTXX
+\fRZIP_FL_ENC_STRICT\fP
+Follow the ZIP specification for file names and extend it to file
+comments, expecting them to be encoded in CP-437 in the ZIP archive
+(except if it is a UTF-8 comment from the special extra field).
+Convert it to UTF-8.
+\fINote\fP:
+ASCII is a subset of both CP-437 and UTF-8.
+.SH "RETURN VALUES"
+Upon successful completion, a pointer to the comment is returned,
+or
+\fRNULL\fP
+if there is no comment.
+In case of an error,
+\fRNULL\fP
+is returned and the error code in
+\fIarchive\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_file_get_comment
+fails if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIindex\fP
+is not a valid file index in
+\fIarchive\fP.
+.SH "SEE ALSO"
+libzip(3),
+zip_file_set_comment(3),
+zip_get_archive_comment(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
similarity index 50%
rename from man/zip_get_file_extra.man
rename to man/zip_file_get_comment.mdoc
index b767b47..63163ba 100644 (file)
@@ -1,5 +1,5 @@
-.\" zip_get_file_extra.mdoc \-- get extra field for file in zip
-.\" Copyright (C) 2006-2011 Dieter Baron and Thomas Klausner
+.\" zip_file_get_comment.mdoc -- get comment for file in zip
+.\" Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP files.
 .\" The authors can be contacted at <libzip@nih.at>
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.TH ZIP_GET_FILE_EXTRA 3 "February 13, 2011" NiH
-.SH "NAME"
-zip_get_file_extra \- get extra field for file in zip
-.SH "LIBRARY"
+.Dd September 19, 2013
+.Dt ZIP_FILE_GET_COMMENT 3
+.Os
+.Sh NAME
+.Nm zip_file_get_comment
+.Nd get comment for file in zip
+.Sh LIBRARY
 libzip (-lzip)
-.SH "SYNOPSIS"
-#include <zip.h>
-.PP
-const char *
-zip_get_file_extra(struct zip *archive, zip_uint64_t index); \
-"int *lenp" "int flags"
-.SH "DESCRIPTION"
+.Sh SYNOPSIS
+.In zip.h
+.Ft const char *
+.Fn zip_file_get_comment "zip_t *archive" "zip_uint64_t index" "zip_uint32_t *lenp" \
+"zip_flags_t flags"
+.Sh DESCRIPTION
 The
-zip_get_file_extra
-function returns the extra field for the file at position
-\fBindex\fR
+.Fn zip_file_get_comment
+function returns the comment for the file at position
+.Ar index
 in the zip archive.
+The name is in UTF-8 encoding unless
+.Dv ZIP_FL_ENC_RAW
+was specified (see below).
 This pointer should not be modified or
-free(3)
-Ap d.
+.Xr free 3 Ap d ,
+and becomes invalid when
+.Ar archive
+is closed.
 If
-\fBlenp\fR
+.Ar lenp
 is not
-\fBNULL,\fR
+.Dv NULL ,
 the integer to which it points will be set to the length of the
-extra.
+comment.
 If
-\fBflags\fR
+.Ar flags
 is set to
-\fBZIP_FL_UNCHANGED,\fR
-the original unchanged extra field is returned.
-.SH "RETURN VALUES"
-Upon successful completion, a pointer to the extra field is returned,
+.Dv ZIP_FL_UNCHANGED ,
+the original unchanged comment is returned.
+.Pp
+Additionally, the following
+.Ar flags
+are supported:
+.Bl -tag -width ZIP_FL_ENC_STRICTXX -offset indent
+.It Dv ZIP_FL_ENC_RAW
+Return the unmodified comment as it is in the ZIP archive.
+.It Dv ZIP_FL_ENC_GUESS
+(Default.)
+Guess the encoding of the comment in the ZIP archive and convert it
+to UTF-8, if necessary.
+.It Dv ZIP_FL_ENC_STRICT
+Follow the ZIP specification for file names and extend it to file
+comments, expecting them to be encoded in CP-437 in the ZIP archive
+(except if it is a UTF-8 comment from the special extra field).
+Convert it to UTF-8.
+.El
+.Em Note :
+ASCII is a subset of both CP-437 and UTF-8.
+.Sh RETURN VALUES
+Upon successful completion, a pointer to the comment is returned,
 or
-\fBNULL\fR
-if there is no extra field.
+.Dv NULL
+if there is no comment.
 In case of an error,
-\fBNULL\fR
+.Dv NULL
 is returned and the error code in
-\fBarchive\fR
+.Ar archive
 is set to indicate the error.
-.SH "ERRORS"
-zip_get_file_extra
+.Sh ERRORS
+.Fn zip_file_get_comment
 fails if:
-.RS
-.TP 4
-[ZIP_ER_INVAL]
-\fBindex\fR
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_INVAL
+.Ar index
 is not a valid file index in
-\fBarchive.\fR
-.RE
-.SH "SEE ALSO"
-libzip(3),
-zip_set_file_extra(3)
-.SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+.Ar archive .
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_file_set_comment 3 ,
+.Xr zip_get_archive_comment 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-Thomas Klausner <tk@giga.or.at>
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_file_get_error.man b/man/zip_file_get_error.man
new file mode 100644 (file)
index 0000000..df484a1
--- /dev/null
@@ -0,0 +1,20 @@
+.TH "ZIP_FILE_GET_ERROR" "3" "November 9, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_file_get_error\fP
+\- extract zip_error from zip_file
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_error_t *
+zip_file_get_error zip_file_t *zf
+.SH "DESCRIPTION"
+zip_file_get_error
+function returns the zip_error associated with the zip_file
+\fIzf\fP.
+.SH "SEE ALSO"
+libzip(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_file_get_error.mdoc b/man/zip_file_get_error.mdoc
new file mode 100644 (file)
index 0000000..f56693f
--- /dev/null
@@ -0,0 +1,54 @@
+.\" zip_file_get_error.mdoc -- extract zip_error from zip_file
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 9, 2014
+.Dt ZIP_FILE_GET_ERROR 3
+.Os
+.Sh NAME
+.Nm zip_file_get_error
+.Nd extract zip_error from zip_file
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft zip_error_t *
+.Fn zip_file_get_error "zip_file_t *zf"
+.Sh DESCRIPTION
+.Fn zip_file_get_error
+function returns the zip_error associated with the zip_file
+.Ar zf .
+.Sh SEE ALSO
+.Xr libzip 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_file_get_external_attributes.man b/man/zip_file_get_external_attributes.man
new file mode 100644 (file)
index 0000000..76a6a38
--- /dev/null
@@ -0,0 +1,125 @@
+.TH "ZIP_FILE_GET_EXTERNAL_ATTRIBUTES" "3" "September 19, 2013" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_file_get_external_attributes\fP
+\- get external attributes for file in zip
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+const char *
+zip_file_get_external_attributes zip_t *archive zip_uint64_t index zip_flags_t flags zip_uint8_t *opsys zip_uint32_t *attributes
+.SH "DESCRIPTION"
+The
+zip_file_get_external_attributes
+function returns the operating system and external attributes for the
+file at position
+\fIindex\fP
+in the zip archive.
+The external attributes usually contain the operating system-specific
+file permissions.
+If
+\fIflags\fP
+is set to
+\fRZIP_FL_UNCHANGED\fP,
+the original unchanged values are returned.
+If
+\fIopsys\fP
+or
+\fIattributes\fP
+are
+\fRNULL\fP,
+they are not filled in.
+.PP
+The following operating systems are defined by the zip specification:
+.TP
+\fRZIP_OPSYS_ACORN_RISC\fP
+.TP
+\fRZIP_OPSYS_ALTERNATE_MVS\fP
+.TP
+\fRZIP_OPSYS_AMIGA\fP
+.TP
+\fRZIP_OPSYS_ATARI_ST\fP
+.TP
+\fRZIP_OPSYS_BEOS\fP
+.TP
+\fRZIP_OPSYS_CPM\fP
+.TP
+\fRZIP_OPSYS_DOS\fP
+.TP
+\fRZIP_OPSYS_MACINTOSH\fP
+.TP
+\fRZIP_OPSYS_MVS\fP
+.TP
+\fRZIP_OPSYS_OPENVMS\fP
+.TP
+\fRZIP_OPSYS_OS_2\fP
+.TP
+\fRZIP_OPSYS_OS_400\fP
+.TP
+\fRZIP_OPSYS_OS_X\fP
+.TP
+\fRZIP_OPSYS_TANDEM\fP
+.TP
+\fRZIP_OPSYS_UNIX\fP
+.TP
+\fRZIP_OPSYS_VFAT\fP
+.TP
+\fRZIP_OPSYS_VM_CMS\fP
+.TP
+\fRZIP_OPSYS_VSE\fP
+.TP
+\fRZIP_OPSYS_WINDOWS_NTFS\fP
+(uncommon, use
+\fRZIP_OPSYS_DOS\fP
+instead)
+.TP
+\fRZIP_OPSYS_Z_SYSTEM\fP
+.PP
+The defines above follow the PKWARE Inc. Appnote; please note that
+the InfoZIP Appnote has a slightly different mapping.
+.SH "RETURN VALUES"
+Upon successful completion, 0 is returned.
+In case of an error,
+\fR\-1\fP
+is returned and the error code in
+\fIarchive\fP
+is set to indicate the error.
+.SH "EXAMPLES"
+The following code can be used to expand
+\fIattributes\fP
+if the operating system is
+\fRZIP_OPSYS_DOS\fP.
+.nf
+#include <sys/stat.h>
+
+#define FA_RDONLY       0x01            // FILE_ATTRIBUTE_READONLY
+#define FA_DIREC        0x10            // FILE_ATTRIBUTE_DIRECTORY
+
+static mode_t
+_zip_dos_attr2mode(zip_uint32_t attr)
+{
+   mode_t m = S_IRUSR | S_IRGRP | S_IROTH;
+   if (0 == (attr & FA_RDONLY))
+      m |= S_IWUSR | S_IWGRP | S_IWOTH;
+
+   if (attr & FA_DIREC)
+      m = (S_IFDIR | (m & ~S_IFMT)) | S_IXUSR | S_IXGRP | S_IXOTH;
+
+   return m;
+}
+.fi
+.SH "ERRORS"
+zip_file_get_external_attributes
+fails if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIindex\fP
+is not a valid file index in
+\fIarchive\fP.
+.SH "SEE ALSO"
+libzip(3),
+zip_file_set_external_attributes(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_file_get_external_attributes.mdoc b/man/zip_file_get_external_attributes.mdoc
new file mode 100644 (file)
index 0000000..ebd2f00
--- /dev/null
@@ -0,0 +1,163 @@
+.\" zip_file_get_external_attributes.mdoc -- get external attributes for file in zip
+.\" Copyright (C) 2013-2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP files.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd September 19, 2013
+.Dt ZIP_FILE_GET_EXTERNAL_ATTRIBUTES 3
+.Os
+.Sh NAME
+.Nm zip_file_get_external_attributes
+.Nd get external attributes for file in zip
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft const char *
+.Fn zip_file_get_external_attributes "zip_t *archive" "zip_uint64_t index" "zip_flags_t flags" \
+"zip_uint8_t *opsys" "zip_uint32_t *attributes"
+.Sh DESCRIPTION
+The
+.Fn zip_file_get_external_attributes
+function returns the operating system and external attributes for the
+file at position
+.Ar index
+in the zip archive.
+The external attributes usually contain the operating system-specific
+file permissions.
+If
+.Ar flags
+is set to
+.Dv ZIP_FL_UNCHANGED ,
+the original unchanged values are returned.
+If
+.Ar opsys
+or
+.Ar attributes
+are
+.Dv NULL ,
+they are not filled in.
+.Pp
+The following operating systems are defined by the zip specification:
+.Bl -item -compact -offset indent
+.It
+.Dv ZIP_OPSYS_ACORN_RISC
+.It
+.Dv ZIP_OPSYS_ALTERNATE_MVS
+.It
+.Dv ZIP_OPSYS_AMIGA
+.It
+.Dv ZIP_OPSYS_ATARI_ST
+.It
+.Dv ZIP_OPSYS_BEOS
+.It
+.Dv ZIP_OPSYS_CPM
+.It
+.Dv ZIP_OPSYS_DOS
+.It
+.Dv ZIP_OPSYS_MACINTOSH
+.It
+.Dv ZIP_OPSYS_MVS
+.It
+.Dv ZIP_OPSYS_OPENVMS
+.It
+.Dv ZIP_OPSYS_OS_2
+.It
+.Dv ZIP_OPSYS_OS_400
+.It
+.Dv ZIP_OPSYS_OS_X
+.It
+.Dv ZIP_OPSYS_TANDEM
+.It
+.Dv ZIP_OPSYS_UNIX
+.It
+.Dv ZIP_OPSYS_VFAT
+.It
+.Dv ZIP_OPSYS_VM_CMS
+.It
+.Dv ZIP_OPSYS_VSE
+.It
+.Dv ZIP_OPSYS_WINDOWS_NTFS
+(uncommon, use
+.Dv ZIP_OPSYS_DOS
+instead)
+.It
+.Dv ZIP_OPSYS_Z_SYSTEM
+.El
+.Pp
+The defines above follow the PKWARE Inc. Appnote; please note that
+the InfoZIP Appnote has a slightly different mapping.
+.Sh RETURN VALUES
+Upon successful completion, 0 is returned.
+In case of an error,
+.Dv \-1
+is returned and the error code in
+.Ar archive
+is set to indicate the error.
+.Sh EXAMPLES
+The following code can be used to expand
+.Ar attributes
+if the operating system is
+.Dv ZIP_OPSYS_DOS .
+.Bd -literal
+#include <sys/stat.h>
+
+#define FA_RDONLY       0x01            // FILE_ATTRIBUTE_READONLY
+#define FA_DIREC        0x10            // FILE_ATTRIBUTE_DIRECTORY
+
+static mode_t
+_zip_dos_attr2mode(zip_uint32_t attr)
+{
+   mode_t m = S_IRUSR | S_IRGRP | S_IROTH;
+   if (0 == (attr & FA_RDONLY))
+      m |= S_IWUSR | S_IWGRP | S_IWOTH;
+
+   if (attr & FA_DIREC)
+      m = (S_IFDIR | (m & ~S_IFMT)) | S_IXUSR | S_IXGRP | S_IXOTH;
+
+   return m;
+}
+.Ed
+.Sh ERRORS
+.Fn zip_file_get_external_attributes
+fails if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_INVAL
+.Ar index
+is not a valid file index in
+.Ar archive .
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_file_set_external_attributes 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_file_rename.man b/man/zip_file_rename.man
new file mode 100644 (file)
index 0000000..f677d46
--- /dev/null
@@ -0,0 +1,68 @@
+.TH "ZIP_FILE_RENAME" "3" "June 23, 2012" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_file_rename\fP
+\- rename file in zip archive
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_file_rename zip_t *archive zip_uint64_t index const char *name zip_flags_t flags
+.SH "DESCRIPTION"
+The file at position
+\fIindex\fP
+in the zip archive
+\fIarchive\fP
+is renamed to
+\fIname\fP.
+The
+\fIflags\fP
+argument can be any of:
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_ENC_GUESS\fP
+Guess encoding of
+\fIname\fP
+(default).
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_ENC_UTF_8\fP
+Interpret
+\fIname\fP
+as UTF-8.
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_ENC_CP437\fP
+Interpret
+\fIname\fP
+as code page 437 (CP-437).
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error code in
+\fIarchive\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_rename
+fails if:
+.TP 17n
+[\fRZIP_ER_DELETED\fP]
+The file to be renamed has been deleted from the archive.
+.TP 17n
+[\fRZIP_ER_EXISTS\fP]
+There is already a file called
+\fIname\fP
+in the archive.
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIindex\fP
+is not a valid file index in
+\fIarchive\fP,
+\fIname is\fP
+\fRNULL\fP,
+the empty string, or not a valid UTF-8 encoded string.
+Also a file cannot be renamed to a directory or vice versa.
+Directories are denoted by a trailing slash.
+.SH "SEE ALSO"
+libzip(3),
+zip_unchange(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_file_rename.mdoc b/man/zip_file_rename.mdoc
new file mode 100644 (file)
index 0000000..49f8077
--- /dev/null
@@ -0,0 +1,101 @@
+.\" zip_file_rename.mdoc -- rename file in zip archive
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd June 23, 2012
+.Dt ZIP_FILE_RENAME 3
+.Os
+.Sh NAME
+.Nm zip_file_rename
+.Nd rename file in zip archive
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_file_rename "zip_t *archive" "zip_uint64_t index" "const char *name" \
+"zip_flags_t flags"
+.Sh DESCRIPTION
+The file at position
+.Ar index
+in the zip archive
+.Ar archive
+is renamed to
+.Ar name .
+The
+.Ar flags
+argument can be any of:
+.Bl -tag -width XZIPXFLXENCXSTRICTXX
+.It Dv ZIP_FL_ENC_GUESS
+Guess encoding of
+.Ar name
+(default).
+.It Dv ZIP_FL_ENC_UTF_8
+Interpret
+.Ar name
+as UTF-8.
+.It Dv ZIP_FL_ENC_CP437
+Interpret
+.Ar name
+as code page 437 (CP-437).
+.El
+.Sh RETURN VALUES
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error code in
+.Ar archive
+is set to indicate the error.
+.Sh ERRORS
+.Fn zip_rename
+fails if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_DELETED
+The file to be renamed has been deleted from the archive.
+.It Bq Er ZIP_ER_EXISTS
+There is already a file called
+.Ar name
+in the archive.
+.It Bq Er ZIP_ER_INVAL
+.Ar index
+is not a valid file index in
+.Ar archive ,
+.Ar name is
+.Dv NULL ,
+the empty string, or not a valid UTF-8 encoded string.
+Also a file cannot be renamed to a directory or vice versa.
+Directories are denoted by a trailing slash.
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_unchange 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_file_set_comment.man b/man/zip_file_set_comment.man
new file mode 100644 (file)
index 0000000..20a534b
--- /dev/null
@@ -0,0 +1,80 @@
+.TH "ZIP_FILE_SET_COMMENT" "3" "September 19, 2013" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_file_set_comment\fP
+\- set comment for file in zip
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_set_file_comment zip_t *archive zip_uint64_t index const char *comment zip_uint16_t len zip_flags_t flags
+.SH "DESCRIPTION"
+The
+zip_file_set_comment
+function sets the comment for the file at position
+\fIindex\fP
+in the zip archive to
+\fIcomment\fP
+of length
+\fIlen\fP.
+If
+\fIcomment\fP
+is
+\fRNULL\fP
+and
+\fIlen\fP
+is 0, the file comment will be removed.
+The
+\fIflags\fP
+argument can be any of:
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_ENC_GUESS\fP
+Guess encoding of
+\fIcomment\fP
+(default).
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_ENC_UTF_8\fP
+Interpret
+\fIcomment\fP
+as UTF-8.
+.TP XZIPXFLXENCXSTRICTXX
+\fRZIP_FL_ENC_CP437\fP
+Interpret
+\fIcomment\fP
+as code page 437 (CP-437).
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+\fIarchive\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_file_set_comment
+fails if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIindex\fP
+is not a valid file index in
+\fIarchive\fP,
+or
+\fIlen\fP
+is less than 0 or longer than the maximum comment length in a zip file
+(65535), or
+\fIcomment\fP
+is not a valid UTF-8 encoded string.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
+Required memory could not be allocated.
+.TP 17n
+[\fRZIP_ER_RDONLY\fP]
+The
+\fIarchive\fP
+was opened in read-only mode.
+.SH "SEE ALSO"
+libzip(3),
+zip_file_get_comment(3),
+zip_get_archive_comment(3),
+zip_set_archive_comment(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_file_set_comment.mdoc b/man/zip_file_set_comment.mdoc
new file mode 100644 (file)
index 0000000..14f6344
--- /dev/null
@@ -0,0 +1,113 @@
+.\" zip_file_set_comment.mdoc -- set comment for file in zip
+.\" Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP files.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd September 19, 2013
+.Dt ZIP_FILE_SET_COMMENT 3
+.Os
+.Sh NAME
+.Nm zip_file_set_comment
+.Nd set comment for file in zip
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_set_file_comment "zip_t *archive" "zip_uint64_t index" \
+"const char *comment" "zip_uint16_t len" "zip_flags_t flags"
+.Sh DESCRIPTION
+The
+.Fn zip_file_set_comment
+function sets the comment for the file at position
+.Ar index
+in the zip archive to
+.Ar comment
+of length
+.Ar len .
+If
+.Ar comment
+is
+.Dv NULL
+and
+.Ar len
+is 0, the file comment will be removed.
+The
+.Ar flags
+argument can be any of:
+.Bl -tag -width XZIPXFLXENCXSTRICTXX
+.It Dv ZIP_FL_ENC_GUESS
+Guess encoding of
+.Ar comment
+(default).
+.It Dv ZIP_FL_ENC_UTF_8
+Interpret
+.Ar comment
+as UTF-8.
+.It Dv ZIP_FL_ENC_CP437
+Interpret
+.Ar comment
+as code page 437 (CP-437).
+.El
+.Sh RETURN VALUES
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar archive
+is set to indicate the error.
+.Sh ERRORS
+.Fn zip_file_set_comment
+fails if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_INVAL
+.Ar index
+is not a valid file index in
+.Ar archive ,
+or
+.Ar len
+is less than 0 or longer than the maximum comment length in a zip file
+(65535), or
+.Ar comment
+is not a valid UTF-8 encoded string.
+.It Bq Er ZIP_ER_MEMORY
+Required memory could not be allocated.
+.It Bq Er ZIP_ER_RDONLY
+The
+.Ar archive
+was opened in read-only mode.
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_file_get_comment 3 ,
+.Xr zip_get_archive_comment 3 ,
+.Xr zip_set_archive_comment 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_file_set_external_attributes.man b/man/zip_file_set_external_attributes.man
new file mode 100644 (file)
index 0000000..233ccde
--- /dev/null
@@ -0,0 +1,53 @@
+.TH "ZIP_FILE_SET_EXTERNAL_ATTRIBUTES" "3" "September 19, 2013" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_file_set_external_attributes\fP
+\- set external attributes for file in zip
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+const char *
+zip_file_set_external_attributes zip_t *archive zip_uint64_t index zip_flags_t flags zip_uint8_t opsys zip_uint32_t attributes
+.SH "DESCRIPTION"
+The
+zip_file_set_external_attributes
+function sets the operating system and external attributes for the
+file at position
+\fIindex\fP
+in the zip archive.
+Currently, no
+\fIflags\fP
+are supported.
+.PP
+For a list of known
+\fIopsys\fP
+values, see
+zip_file_get_external_attributes(3).
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+\fIarchive\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_file_set_external_attributes
+fails if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIindex\fP
+is not a valid file index in
+\fIarchive\fP.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
+Required memory could not be allocated.
+.TP 17n
+[\fRZIP_ER_RDONLY\fP]
+The
+\fIarchive\fP
+was opened in read-only mode.
+.SH "SEE ALSO"
+libzip(3),
+zip_file_get_external_attributes(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
similarity index 64%
rename from man/zip_get_file_extra.mdoc
rename to man/zip_file_set_external_attributes.mdoc
index bf6e49e..6ff2155 100644 (file)
@@ -1,5 +1,5 @@
-.\" zip_get_file_extra.mdoc -- get extra field for file in zip
-.\" Copyright (C) 2006-2011 Dieter Baron and Thomas Klausner
+.\" zip_file_set_external_attributes.mdoc -- set external attributes for file in zip
+.\" Copyright (C) 2013-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP files.
 .\" The authors can be contacted at <libzip@nih.at>
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 13, 2011
-.Dt ZIP_GET_FILE_EXTRA 3
+.Dd September 19, 2013
+.Dt ZIP_FILE_SET_EXTERNAL_ATTRIBUTES 3
 .Os
 .Sh NAME
-.Nm zip_get_file_extra
-.Nd get extra field for file in zip
+.Nm zip_file_set_external_attributes
+.Nd set external attributes for file in zip
 .Sh LIBRARY
 libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft const char *
-.Fn zip_get_file_extra "struct zip *archive" "zip_uint64_t index" \
-"int *lenp" "int flags"
+.Fn zip_file_set_external_attributes "zip_t *archive" "zip_uint64_t index" "zip_flags_t flags" \
+"zip_uint8_t opsys" "zip_uint32_t attributes"
 .Sh DESCRIPTION
 The
-.Fn zip_get_file_extra
-function returns the extra field for the file at position
+.Fn zip_file_set_external_attributes
+function sets the operating system and external attributes for the
+file at position
 .Ar index
 in the zip archive.
-This pointer should not be modified or
-.Xr free 3 Ap d .
-If
-.Ar lenp
-is not
-.Dv NULL ,
-the integer to which it points will be set to the length of the
-extra.
-If
+Currently, no
 .Ar flags
-is set to
-.Dv ZIP_FL_UNCHANGED ,
-the original unchanged extra field is returned.
+are supported.
+.Pp
+For a list of known
+.Ar opsys
+values, see
+.Xr zip_file_get_external_attributes 3 .
 .Sh RETURN VALUES
-Upon successful completion, a pointer to the extra field is returned,
-or
-.Dv NULL
-if there is no extra field.
-In case of an error,
-.Dv NULL
-is returned and the error code in
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
 .Ar archive
 is set to indicate the error.
 .Sh ERRORS
-.Fn zip_get_file_extra
+.Fn zip_file_set_external_attributes
 fails if:
 .Bl -tag -width Er
 .It Bq Er ZIP_ER_INVAL
 .Ar index
 is not a valid file index in
 .Ar archive .
+.It Bq Er ZIP_ER_MEMORY
+Required memory could not be allocated.
+.It Bq Er ZIP_ER_RDONLY
+The
+.Ar archive
+was opened in read-only mode.
 .El
 .Sh SEE ALSO
 .Xr libzip 3 ,
-.Xr zip_set_file_extra 3
+.Xr zip_file_get_external_attributes 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_file_set_mtime.man b/man/zip_file_set_mtime.man
new file mode 100644 (file)
index 0000000..c509539
--- /dev/null
@@ -0,0 +1,49 @@
+.TH "ZIP_FILE_SET_MTIME" "3" "August 5, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_file_set_mtime\fP
+\- set last modification time (mtime) for file in zip
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_set_file_mtime zip_t *archive zip_uint64_t index time_t mtime zip_flags_t flags
+.SH "DESCRIPTION"
+The
+zip_file_set_mtime
+function sets the last modification time (mtime) for the file at
+position
+\fIindex\fP
+in the zip archive to
+\fImtime\fP.
+Currently, no support for any
+\fIflags\fP
+is implemented.
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+\fIarchive\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_file_set_mtime
+fails if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIindex\fP
+is not a valid file index in
+\fIarchive\fP.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
+Required memory could not be allocated.
+.TP 17n
+[\fRZIP_ER_RDONLY\fP]
+The
+\fIarchive\fP
+was opened in read-only mode.
+.SH "SEE ALSO"
+libzip(3),
+zip_stat(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
similarity index 73%
rename from man/zip_set_file_extra.mdoc
rename to man/zip_file_set_mtime.mdoc
index d54a14c..82ae600 100644 (file)
@@ -1,5 +1,5 @@
-.\" zip_set_file_extra.mdoc -- set extra field for file in zip
-.\" Copyright (C) 2006-2011 Dieter Baron and Thomas Klausner
+.\" zip_file_set_mtime.mdoc -- set mtime for file in zip
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP files.
 .\" The authors can be contacted at <libzip@nih.at>
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 13, 2011
-.Dt ZIP_SET_FILE_EXTRA 3
+.Dd August 5, 2014
+.Dt ZIP_FILE_SET_MTIME 3
 .Os
 .Sh NAME
-.Nm zip_set_file_extra
-.Nd set extra field for file in zip
+.Nm zip_file_set_mtime
+.Nd set last modification time (mtime) for file in zip
 .Sh LIBRARY
 libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_set_file_extra "struct zip *archive" "zip_uint64_t index" \
-"const char *extra" "int len"
+.Fn zip_set_file_mtime "zip_t *archive" "zip_uint64_t index" \
+"time_t mtime" "zip_flags_t flags"
 .Sh DESCRIPTION
 The
-.Fn zip_set_file_extra
-function sets the extra field for the file at position
+.Fn zip_file_set_mtime
+function sets the last modification time (mtime) for the file at
+position
 .Ar index
 in the zip archive to
-.Ar extra
-of length
-.Ar len .
-If
-.Ar extra
-is
-.Dv NULL
-and
-.Ar len
-is 0, the file extra field will be removed.
+.Ar mtime .
+Currently, no support for any
+.Ar flags
+is implemented.
 .Sh RETURN VALUES
 Upon successful completion 0 is returned.
 Otherwise, \-1 is returned and the error information in
 .Ar archive
 is set to indicate the error.
 .Sh ERRORS
-.Fn zip_set_file_extra
+.Fn zip_file_set_mtime
 fails if:
 .Bl -tag -width Er
 .It Bq Er ZIP_ER_INVAL
 .Ar index
 is not a valid file index in
-.Ar archive ,
-or
-.Ar len
-is less than 0 or longer than the maximum extra field length in a zip file
-(65535).
+.Ar archive .
 .It Bq Er ZIP_ER_MEMORY
 Required memory could not be allocated.
+.It Bq Er ZIP_ER_RDONLY
+The
+.Ar archive
+was opened in read-only mode.
 .El
 .Sh SEE ALSO
 .Xr libzip 3 ,
-.Xr zip_get_file_extra 3
+.Xr zip_stat 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index eeadc8c..3a630ca 100644 (file)
@@ -1,62 +1,30 @@
-.\" zip_file_strerror.mdoc \-- get string representation for a zip error
-.\" Copyright (C) 2003, 2005 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_FILE_STRERROR 3 "December 27, 2004" NiH
+.TH "ZIP_FILE_STRERROR" "3" "December 27, 2004" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_file_strerror , \- .Nm zip_strerror
-get string representation for a zip error
+\fBzip_file_strerror\fP,
+\fBzip_strerror\fP
+\- get string representation for a zip error
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 const char *
-zip_file_strerror(struct zip_file *file);
-.PP
+zip_file_strerror zip_file_t *file
 const char *
-zip_strerror(struct zip *archive);
+zip_strerror zip_t *archive
 .SH "DESCRIPTION"
 The
 zip_strerror
 function returns a string describing the last error for the zip archive
-\fBarchive,\fR
+\fIarchive\fP,
 while the
 zip_file_strerror
 function does the same for a zip file
-\fBfile\fR
+\fIfile\fP
 (one file in an archive).
 The returned string must not be modified or freed, and becomes invalid when
-\fBarchive\fR
+\fIarchive\fP
 or
-\fBfile,\fR
+\fIfile\fP,
 respectively,
 is closed or on the next call to
 zip_strerror
@@ -73,7 +41,6 @@ return a pointer to the error string.
 libzip(3),
 zip_error_to_str(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 81f56d1..6ca3012 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_file_strerror.mdoc -- get string representation for a zip error
-.\" Copyright (C) 2003, 2005 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -41,9 +41,9 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft const char *
-.Fn zip_file_strerror "struct zip_file *file"
+.Fn zip_file_strerror "zip_file_t *file"
 .Ft const char *
-.Fn zip_strerror "struct zip *archive"
+.Fn zip_strerror "zip_t *archive"
 .Sh DESCRIPTION
 The
 .Fn zip_strerror
@@ -75,6 +75,6 @@ return a pointer to the error string.
 .Xr zip_error_to_str 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index aa045df..6385092 100644 (file)
@@ -1,79 +1,45 @@
-.\" zip_fopen.mdoc \-- open file in zip archive for reading
-.\" Copyright (C) 2003-2011 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_FOPEN 3 "February 14, 2011" NiH
+.TH "ZIP_FOPEN" "3" "October 23, 2013" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_fopen , \- .Nm zip_fopen_index
-open file in zip archive for reading
+\fBzip_fopen\fP,
+\fBzip_fopen_index\fP
+\- open file in zip archive for reading
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
-struct zip_file *
-zip_fopen(struct zip *archive, const char *fname, int flags);
-.PP
-struct zip_file *
-zip_fopen_index(struct zip *archive, zip_uint64_t index, int flags);
+zip.h
+zip_file_t *
+zip_fopen zip_t *archive const char *fname zip_flags_t flags
+zip_file_t *
+zip_fopen_index zip_t *archive zip_uint64_t index zip_flags_t flags
 .SH "DESCRIPTION"
 The
 zip_fopen
 function opens the file name
-\fBfname\fR
+\fIfname\fP
 in
-\fBarchive.\fR
+\fIarchive\fP.
 The
-\fBflags\fR
+\fIflags\fP
 argument specifies how the name lookup should be done, according to
 the values are described in
 zip_name_locate(3).
 Also, the following values may be
-.I or'ed
+\fIor\fP'ed
 to it.
-.RS
-.TP 19
-\fBZIP_FL_COMPRESSED\fR
+.TP ZIP_FL_COMPRESSED
+\fRZIP_FL_COMPRESSED\fP
 Read the compressed data.
 Otherwise the data is uncompressed by
 zip_fread.
-.TP 19
-\fBZIP_FL_UNCHANGED\fR
+.TP ZIP_FL_COMPRESSED
+\fRZIP_FL_UNCHANGED\fP
 Read the original data from the zip archive, ignoring any changes made
 to the file.
-.RE
 .PP
 The
 zip_fopen_index
 function opens the file at position
-\fBindex.\fR
+\fIindex\fP.
 .PP
 If encrypted data is encountered, the functions call
 zip_fopen_encrypted(3)
@@ -83,52 +49,57 @@ respectively, using the default password set with
 zip_set_default_password(3).
 .SH "RETURN VALUES"
 Upon successful completion, a
-.PP
 struct zip_file
 pointer is returned.
 Otherwise,
-\fBNULL\fR
+\fRNULL\fP
 is returned and the error code in
-\fBarchive\fR
+\fIarchive\fP
 is set to indicate the error.
 .SH "ERRORS"
-.RS
-.TP 4
-[ZIP_ER_CHANGED]
+.TP 17n
+[\fRZIP_ER_CHANGED\fP]
 The file data has been changed.
-.TP 4
-[ZIP_ER_COMPNOTSUPP]
+.TP 17n
+[\fRZIP_ER_COMPNOTSUPP\fP]
 The compression method used is not supported.
-.TP 4
-[ZIP_ER_ENCRNOTSUPP]
+.TP 17n
+[\fRZIP_ER_ENCRNOTSUPP\fP]
 The encryption method used is not supported.
-.TP 4
-[ZIP_ER_MEMORY]
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
 Required memory could not be allocated.
-.TP 4
-[ZIP_ER_READ]
+.TP 17n
+[\fRZIP_ER_NOPASSWD\fP]
+The file is encrypted, but no password has been provided.
+.TP 17n
+[\fRZIP_ER_READ\fP]
 A file read error occurred.
-.TP 4
-[ZIP_ER_SEEK]
+.TP 17n
+[\fRZIP_ER_SEEK\fP]
 A file seek error occurred.
-.TP 4
-[ZIP_ER_ZLIB]
+.TP 17n
+[\fRZIP_ER_WRONGPASSWD\fP]
+The provided password does not match the password used for encryption.
+Note that some incorrect passwords are not detected by the check done by
+zip_fopen.
+.TP 17n
+[\fRZIP_ER_ZLIB\fP]
 Initializing the zlib stream failed.
-.RE
 .PP
 The function
 zip_fopen
 may also fail and set
-.Va zip_err
+zip_err
 for any of the errors specified for the routine
 zip_name_locate(3).
 .PP
 The function
 zip_fopen_index
 may also fail with
-ZIP_ER_INVAL
+\fRZIP_ER_INVAL\fP
 if
-\fBindex\fR
+\fIindex\fP
 is invalid.
 .SH "SEE ALSO"
 libzip(3),
@@ -138,7 +109,6 @@ zip_get_num_entries(3),
 zip_name_locate(3),
 zip_set_default_password(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 5f0aa03..8d747ef 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_fopen.mdoc -- open file in zip archive for reading
-.\" Copyright (C) 2003-2011 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 14, 2011
+.Dd October 23, 2013
 .Dt ZIP_FOPEN 3
 .Os
 .Sh NAME
 libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
-.Ft struct zip_file *
-.Fn zip_fopen "struct zip *archive" "const char *fname" "int flags"
-.Ft struct zip_file *
-.Fn zip_fopen_index "struct zip *archive" "zip_uint64_t index" "int flags"
+.Ft zip_file_t *
+.Fn zip_fopen "zip_t *archive" "const char *fname" "zip_flags_t flags"
+.Ft zip_file_t *
+.Fn zip_fopen_index "zip_t *archive" "zip_uint64_t index" "zip_flags_t flags"
 .Sh DESCRIPTION
 The
 .Fn zip_fopen
@@ -99,10 +99,16 @@ The compression method used is not supported.
 The encryption method used is not supported.
 .It Bq Er ZIP_ER_MEMORY
 Required memory could not be allocated.
+.It Bq Er ZIP_ER_NOPASSWD
+The file is encrypted, but no password has been provided.
 .It Bq Er ZIP_ER_READ
 A file read error occurred.
 .It Bq Er ZIP_ER_SEEK
 A file seek error occurred.
+.It Bq Er ZIP_ER_WRONGPASSWD
+The provided password does not match the password used for encryption.
+Note that some incorrect passwords are not detected by the check done by
+.Fn zip_fopen .
 .It Bq Er ZIP_ER_ZLIB
 Initializing the zlib stream failed.
 .El
@@ -130,6 +136,6 @@ is invalid.
 .Xr zip_set_default_password 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 638242d..eb38114 100644 (file)
-.\" zip_fopen_encrypted.mdoc \-- open encrypted file in zip archive for reading
-.\" Copyright (C) 2011 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_FOPEN_ENCRYPTED 3 "February 14, 2011" NiH
+.TH "ZIP_FOPEN_ENCRYPTED" "3" "July 22, 2012" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_fopen_encrypted , \- .Nm zip_fopen_index_encrypted
-open encrypted file in zip archive for reading
+\fBzip_fopen_encrypted\fP,
+\fBzip_fopen_index_encrypted\fP
+\- open encrypted file in zip archive for reading
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
-struct zip_file *
-zip_fopen_encrypted(struct zip *archive, const char *fname, int flags, const char *password);
-.PP
-struct zip_file *
-zip_fopen_index_encrypted(struct zip *archive, zip_uint64_t index, int flags, const char *password);
+zip.h
+zip_file_t *
+zip_fopen_encrypted zip_t *archive const char *fname zip_flags_t flags const char *password
+zip_file_t *
+zip_fopen_index_encrypted zip_t *archive zip_uint64_t index zip_flags_t flags const char *password
 .SH "DESCRIPTION"
 The
 zip_fopen_encrypted
 function opens the encrypted file name
-\fBfname\fR
+\fIfname\fP
 in
-\fBarchive\fR
+\fIarchive\fP
 using the password given in the
-\fBpassword\fR
+\fIpassword\fP
 argument.
 The
-\fBflags\fR
+\fIflags\fP
 argument are the same as for
 zip_fopen(3).
 .PP
 The
 zip_fopen_index_encrypted
 function opens the file at position
-\fBindex,\fR
+\fIindex\fP,
 see
 zip_fopen_index(3).
 These functions are called automatically by
 zip_fopen(3);
 you only need to call them if you want to specify a non-default password
 (see
-zip_set_default_password(3)
-).
+zip_set_default_password(3)).
 .SH "RETURN VALUES"
 Upon successful completion, a
-.PP
 struct zip_file
 pointer is returned.
 Otherwise,
-\fBNULL\fR
+\fRNULL\fP
 is returned and the error code in
-\fBarchive\fR
+\fIarchive\fP
 is set to indicate the error.
 .SH "ERRORS"
-.RS
-.TP 22
-[ZIP_ER_NOPASSWD]
+.TP ZIP_ER_ENCRNOTSUPPXX
+[\fRZIP_ER_NOPASSWD\fP]
 No password was provided.
-.RE
 .PP
 The function
 zip_fopen_encrypted
 may also fail and set
-.Va zip_err
+zip_err
 for any of the errors specified for the routine
 zip_fopen(3).
 .PP
 The function
 zip_fopen_index_encrypted
 may also fail and set
-.Va zip_err
+zip_err
 for any of the errors specified for the routine
 zip_fopen_index(3).
 .SH "SEE ALSO"
@@ -108,7 +72,6 @@ zip_fread(3),
 zip_get_num_entries(3),
 zip_name_locate(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index b719ea5..5b5e4bd 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_fopen_encrypted.mdoc -- open encrypted file in zip archive for reading
-.\" Copyright (C) 2011 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2011-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 14, 2011
+.Dd July 22, 2012
 .Dt ZIP_FOPEN_ENCRYPTED 3
 .Os
 .Sh NAME
 libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
-.Ft struct zip_file *
-.Fn zip_fopen_encrypted "struct zip *archive" "const char *fname" "int flags" "const char *password"
-.Ft struct zip_file *
-.Fn zip_fopen_index_encrypted "struct zip *archive" "zip_uint64_t index" "int flags" "const char *password"
+.Ft zip_file_t *
+.Fn zip_fopen_encrypted "zip_t *archive" "const char *fname" "zip_flags_t flags" "const char *password"
+.Ft zip_file_t *
+.Fn zip_fopen_index_encrypted "zip_t *archive" "zip_uint64_t index" "zip_flags_t flags" "const char *password"
 .Sh DESCRIPTION
 The
 .Fn zip_fopen_encrypted
@@ -107,6 +107,6 @@ for any of the errors specified for the routine
 .Xr zip_name_locate 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index dce4a53..489c0e2 100644 (file)
@@ -1,53 +1,22 @@
-.\" zip_fread.mdoc \-- read from file
-.\" Copyright (C) 2003-2009 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_FREAD 3 "March 10, 2009" NiH
+.TH "ZIP_FREAD" "3" "March 10, 2009" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_fread \- read from file
+\fBzip_fread\fP
+\- read from file
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
-int
-zip_fread(struct zip_file *file, void *buf, zip_uint64_t nbytes);
+zip.h
+zip_int64_t
+zip_fread zip_file_t *file void *buf zip_uint64_t nbytes
 .SH "DESCRIPTION"
 The
 zip_fread
 function reads at most
-\fBnbytes\fR
+\fInbytes\fP
 bytes from
-\fBfile\fR
+\fIfile\fP
 into
-\fBbuf.\fR
+\fIbuf\fP.
 .SH "RETURN VALUES"
 If successful, the number of bytes actually read is returned.
 Otherwise, \-1 is returned.
@@ -56,7 +25,6 @@ libzip(3),
 zip_fclose(3),
 zip_fopen(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 694c143..e582ffa 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_fread.mdoc -- read from file
-.\" Copyright (C) 2003-2009 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2015 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -39,8 +39,8 @@
 libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
-.Ft int
-.Fn zip_fread "struct zip_file *file" "void *buf" "zip_uint64_t nbytes"
+.Ft zip_int64_t
+.Fn zip_fread "zip_file_t *file" "void *buf" "zip_uint64_t nbytes"
 .Sh DESCRIPTION
 The
 .Fn zip_fread
@@ -59,6 +59,6 @@ Otherwise, \-1 is returned.
 .Xr zip_fopen 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index e9bf825..ea4524c 100644 (file)
@@ -1,77 +1,64 @@
-.\" zip_get_archive_comment.mdoc \-- get zip archive comment
-.\" Copyright (C) 2006 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_GET_ARCHIVE_COMMENT 3 "April 23, 2006" NiH
+.TH "ZIP_GET_ARCHIVE_COMMENT" "3" "February 20, 2013" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_get_archive_comment \- get zip archive comment
+\fBzip_get_archive_comment\fP
+\- get zip archive comment
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 const char *
-zip_get_archive_comment(struct zip *archive, int *lenp, int flags);
+zip_get_archive_comment zip_t *archive int *lenp zip_flags_t flags
 .SH "DESCRIPTION"
 The
 zip_get_archive_comment
 function returns the comment for the entire zip archive.
+The name is in UTF-8 encoding unless
+\fRZIP_FL_ENC_RAW\fP
+was specified (see below).
 This pointer should not be modified or
-free(3)
-Ap d.
+free(3)'d,
+and becomes invalid when
+\fIarchive\fP
+is closed.
 If
-\fBlenp\fR
+\fIlenp\fP
 is not
-\fBNULL,\fR
+\fRNULL\fP,
 the integer to which it points will be set to the length of the
 comment.
 If
-\fBflags\fR
+\fIflags\fP
 is set to
-\fBZIP_FL_UNCHANGED,\fR
+\fRZIP_FL_UNCHANGED\fP,
 the original unchanged comment is returned.
+.PP
+Additionally, the following
+\fIflags\fP
+are supported:
+.TP ZIP_FL_ENC_STRICTXX
+\fRZIP_FL_ENC_RAW\fP
+Return the unmodified archive comment as it is in the ZIP archive.
+.TP ZIP_FL_ENC_STRICTXX
+\fRZIP_FL_ENC_GUESS\fP
+(Default.)
+Guess the encoding of the archive comment in the ZIP archive and convert it
+to UTF-8, if necessary.
+.TP ZIP_FL_ENC_STRICTXX
+\fRZIP_FL_ENC_STRICT\fP
+Follow the ZIP specification for file names and extend it to the
+archive comment, thus also expecting it in CP-437 encoding.
+Convert it to UTF-8.
+\fINote\fP:
+ASCII is a subset of both CP-437 and UTF-8.
 .SH "RETURN VALUES"
 Upon successful completion, a pointer to the comment is returned,
 or
-\fBNULL\fR
+\fRNULL\fP
 if there is no comment.
-.\" In case of an error,
-.\" \fBNULL\fR
-.\" is returned and the error code in
-.\" \fBarchive\fR
-.\" is set to indicate the error.
 .SH "SEE ALSO"
 libzip(3),
 zip_get_file_comment(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index dee3317..caf2f9c 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_get_archive_comment.mdoc -- get zip archive comment
-.\" Copyright (C) 2006 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd April 23, 2006
+.Dd February 20, 2013
 .Dt ZIP_GET_ARCHIVE_COMMENT 3
 .Os
 .Sh NAME
@@ -40,13 +40,19 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft const char *
-.Fn zip_get_archive_comment "struct zip *archive" "int *lenp" "int flags"
+.Fn zip_get_archive_comment "zip_t *archive" "int *lenp" "zip_flags_t flags"
 .Sh DESCRIPTION
 The
 .Fn zip_get_archive_comment
 function returns the comment for the entire zip archive.
+The name is in UTF-8 encoding unless
+.Dv ZIP_FL_ENC_RAW
+was specified (see below).
 This pointer should not be modified or
-.Xr free 3 Ap d .
+.Xr free 3 Ap d ,
+and becomes invalid when
+.Ar archive
+is closed.
 If
 .Ar lenp
 is not
@@ -58,6 +64,24 @@ If
 is set to
 .Dv ZIP_FL_UNCHANGED ,
 the original unchanged comment is returned.
+.Pp
+Additionally, the following
+.Ar flags
+are supported:
+.Bl -tag -width ZIP_FL_ENC_STRICTXX -offset indent
+.It Dv ZIP_FL_ENC_RAW
+Return the unmodified archive comment as it is in the ZIP archive.
+.It Dv ZIP_FL_ENC_GUESS
+(Default.)
+Guess the encoding of the archive comment in the ZIP archive and convert it
+to UTF-8, if necessary.
+.It Dv ZIP_FL_ENC_STRICT
+Follow the ZIP specification for file names and extend it to the
+archive comment, thus also expecting it in CP-437 encoding.
+Convert it to UTF-8.
+.El
+.Em Note :
+ASCII is a subset of both CP-437 and UTF-8.
 .Sh RETURN VALUES
 Upon successful completion, a pointer to the comment is returned,
 or
@@ -73,6 +97,6 @@ if there is no comment.
 .Xr zip_get_file_comment 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index e6522a5..f08d2e3 100644 (file)
@@ -1,78 +1,44 @@
-.\" zip_get_archive_flag.mdoc \-- get comment for file in zip
-.\" Copyright (C) 2008 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP files.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_GET_ARCHIVE_FLAG 3 "June 4, 2008" NiH
+.TH "ZIP_GET_ARCHIVE_FLAG" "3" "April 29, 2015" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_get_archive_flag \- get status flags for zip
+\fBzip_get_archive_flag\fP
+\- get status flags for zip
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_get_archive_flag(struct zip *archive, int flag, int flags);
+zip_get_archive_flag zip_t *archive zip_flags_t flag zip_flags_t flags
 .SH "DESCRIPTION"
 The
 zip_get_archive_flag
 function returns if the flag
-\fBflag\fR
+\fIflag\fP
 is set for the archive
-\fBarchive.\fR
+\fIarchive\fP.
 The archive flags might have been changed with
 zip_set_archive_flag;
 if
-\fBflags\fR
+\fIflags\fP
 is set to
-\fBZIP_FL_UNCHANGED,\fR
+\fRZIP_FL_UNCHANGED\fP,
 the original unchanged flags are tested.
 .PP
 Supported flags are:
-.RS
-.TP 21
-\fBZIP_AFL_TORRENT\fR
-The archive is torrent-zipped.
-.RE
+.TP XZIPXAFLXRDONLYXXX
+\fRZIP_AFL_RDONLY\fP
+The archive is read-only.
 .SH "RETURN VALUES"
 zip_get_archive_flag
 returns 1 if
-\fBflag\fR
+\fIflag\fP
 is set for
-\fBarchive,\fR
+\fIarchive\fP,
 0 if not,
 and \-1 if an error occurred.
 .SH "SEE ALSO"
 libzip(3),
 zip_set_archive_flag(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index b949093..0177402 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_get_archive_flag.mdoc -- get comment for file in zip
-.\" Copyright (C) 2008 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2008-2015 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP files.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd June 4, 2008
+.Dd April 29, 2015
 .Dt ZIP_GET_ARCHIVE_FLAG 3
 .Os
 .Sh NAME
@@ -40,7 +40,7 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_get_archive_flag "struct zip *archive" "int flag" "int flags"
+.Fn zip_get_archive_flag "zip_t *archive" "zip_flags_t flag" "zip_flags_t flags"
 .Sh DESCRIPTION
 The
 .Fn zip_get_archive_flag
@@ -57,9 +57,9 @@ is set to
 the original unchanged flags are tested.
 .Pp
 Supported flags are:
-.Bl -tag -width XZIPXAFLXTORRENTXXX
-.It Dv ZIP_AFL_TORRENT
-The archive is torrent-zipped.
+.Bl -tag -width XZIPXAFLXRDONLYXXX
+.It Dv ZIP_AFL_RDONLY
+The archive is read-only.
 .El
 .Sh RETURN VALUES
 .Fn zip_get_archive_flag
@@ -74,6 +74,6 @@ and \-1 if an error occurred.
 .Xr zip_set_archive_flag 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_get_error.man b/man/zip_get_error.man
new file mode 100644 (file)
index 0000000..17e297d
--- /dev/null
@@ -0,0 +1,23 @@
+.TH "ZIP_GET_ERROR" "3" "October 30, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_get_error\fP
+\- get zip error for archive
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_error_t *
+zip_get_error zip_t *archive
+.SH "DESCRIPTION"
+The
+zip_get_error
+function returns the zip error for the zip archive
+\fIarchive\fP.
+.SH "SEE ALSO"
+libzip(3),
+zip_error_code_system(3),
+zip_error_code_zip(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
similarity index 64%
rename from man/ziptorrent.mdoc
rename to man/zip_get_error.mdoc
index 79a7ef5..6dd56e3 100644 (file)
@@ -1,5 +1,5 @@
-.\" ziptorrent.mdoc -- torrentzip zip archives
-.\" Copyright (C) 2008 Dieter Baron and Thomas Klausner
+.\" zip_get_error.mdoc -- get zip_error for archive
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd July 24, 2008
-.Dt ZIPTORRENT 1
+.Dd October 30, 2014
+.Dt ZIP_GET_ERROR 3
 .Os
 .Sh NAME
-.Nm ziptorrent
-.Nd torrentzip zip archives
+.Nm zip_get_error
+.Nd get zip error for archive
+.Sh LIBRARY
+libzip (-lzip)
 .Sh SYNOPSIS
-.Nm
-.Op Fl hnVv
-.Ar archive Op Ar ...
+.In zip.h
+.Ft zip_error_t *
+.Fn zip_get_error "zip_t *archive"
 .Sh DESCRIPTION
-.Nm
-torrentzips
+The
+.Fn zip_get_error
+function returns the zip error for the zip archive
 .Ar archive .
-This is a restricted file format used for using bittorrent on zip
-files.
-Please see
-.Xr zip_set_archive_flag 3
-for details on what information gets lost through this process.
-.Pp
-Supported options:
-.Bl -tag -width MMM
-.It Fl h
-Display a short help message and exit.
-.It Fl n
-Don't actually change archives, just print what would be done.
-.It Fl V
-Display version information and exit.
-.It Fl v
-Be verbose: print which archives are already torrentzipped and which
-need to be rezipped.
-.El
-.Sh EXIT STATUS
-.Nm
-exits 0 on success and \*[Gt]1 if an error occurred.
 .Sh SEE ALSO
-.Xr zipcmp 1 ,
-.Xr zipmerge 1 ,
-.Xr libzip 3
+.Xr libzip 3 ,
+.Xr zip_error_code_system 3 ,
+.Xr zip_error_code_zip 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index aa6b762..206d947 100644 (file)
@@ -1,88 +1,27 @@
-.\" zip_get_file_comment.mdoc \-- get comment for file in zip
-.\" Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP files.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_GET_FILE_COMMENT 3 "March 10, 2009" NiH
+.TH "ZIP_GET_FILE_COMMENT" "3" "June 23, 2012" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_get_file_comment \- get comment for file in zip
+\fBzip_get_file_comment\fP
+\- get comment for file in zip
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 const char *
-zip_get_file_comment(struct zip *archive, zip_uint64_t index, int *lenp, int flags);
+zip_get_file_comment zip_t *archive zip_uint64_t index int *lenp int flags
 .SH "DESCRIPTION"
 The
 zip_get_file_comment
-function returns the comment for the file at position
-\fBindex\fR
-in the zip archive.
-This pointer should not be modified or
-free(3)
-Ap d.
-If
-\fBlenp\fR
-is not
-\fBNULL,\fR
-the integer to which it points will be set to the length of the
-comment.
-If
-\fBflags\fR
-is set to
-\fBZIP_FL_UNCHANGED,\fR
-the original unchanged comment is returned.
-.SH "RETURN VALUES"
-Upon successful completion, a pointer to the comment is returned,
-or
-\fBNULL\fR
-if there is no comment.
-In case of an error,
-\fBNULL\fR
-is returned and the error code in
-\fBarchive\fR
-is set to indicate the error.
-.SH "ERRORS"
-zip_get_file_comment
-fails if:
-.RS
-.TP 4
-[ZIP_ER_INVAL]
-\fBindex\fR
-is not a valid file index in
-\fBarchive.\fR
+function is the obsolete version of
+zip_file_get_comment(3).
+The only differences are the types of the
+\fIlenp\fP
+and
+\fIflags\fP
+arguments.
 .SH "SEE ALSO"
 libzip(3),
-zip_get_archive_comment(3)
+zip_file_get_comment(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 780db5f..4a54e8b 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_get_file_comment.mdoc -- get comment for file in zip
-.\" Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP files.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd March 10, 2009
+.Dd June 23, 2012
 .Dt ZIP_GET_FILE_COMMENT 3
 .Os
 .Sh NAME
@@ -40,49 +40,22 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft const char *
-.Fn zip_get_file_comment "struct zip *archive" "zip_uint64_t index" "int *lenp" "int flags"
+.Fn zip_get_file_comment "zip_t *archive" "zip_uint64_t index" "int *lenp" "int flags"
 .Sh DESCRIPTION
 The
 .Fn zip_get_file_comment
-function returns the comment for the file at position
-.Ar index
-in the zip archive.
-This pointer should not be modified or
-.Xr free 3 Ap d .
-If
+function is the obsolete version of
+.Xr zip_file_get_comment 3 .
+The only differences are the types of the
 .Ar lenp
-is not
-.Dv NULL ,
-the integer to which it points will be set to the length of the
-comment.
-If
+and
 .Ar flags
-is set to
-.Dv ZIP_FL_UNCHANGED ,
-the original unchanged comment is returned.
-.Sh RETURN VALUES
-Upon successful completion, a pointer to the comment is returned,
-or
-.Dv NULL
-if there is no comment.
-In case of an error,
-.Dv NULL
-is returned and the error code in
-.Ar archive
-is set to indicate the error.
-.Sh ERRORS
-.Fn zip_get_file_comment
-fails if:
-.Bl -tag -width Er
-.It Bq Er ZIP_ER_INVAL
-.Ar index
-is not a valid file index in
-.Ar archive .
+arguments.
 .Sh SEE ALSO
 .Xr libzip 3 ,
-.Xr zip_get_archive_comment 3
+.Xr zip_file_get_comment 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 66b7340..4cc6a45 100644 (file)
@@ -1,92 +1,84 @@
-.\" zip_get_name.mdoc \-- get name of file by index
-.\" Copyright (C) 2003, 2004, 2005 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_GET_NAME 3 "January 20, 2005" NiH
+.TH "ZIP_GET_NAME" "3" "February 20, 2013" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_get_name \- get name of file by index
+\fBzip_get_name\fP
+\- get name of file by index
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 const char *
-zip_get_name(struct zip *archive, int index, int flags);
+zip_get_name zip_t *archive zip_uint64_t index zip_flags_t flags
 .SH "DESCRIPTION"
 The
 zip_get_name
 function returns the name of the file at position
-\fBindex\fR
+\fIindex\fP
 in
-\fBarchive.\fR
+\fIarchive\fP.
+The name is in UTF-8 encoding unless
+\fRZIP_FL_ENC_RAW\fP
+was specified (see below).
+.PP
 If
-\fBflags\fR
+\fIflags\fP
 is set to
-\fBZIP_FL_UNCHANGED,\fR
+\fRZIP_FL_UNCHANGED\fP,
 the original unchanged filename is returned.
 The returned string must not be modified or freed, and becomes invalid when
-\fBarchive\fR
+\fIarchive\fP
 is closed.
+.PP
+Additionally, the following
+\fIflags\fP
+are supported:
+.TP ZIP_FL_ENC_STRICTXX
+\fRZIP_FL_ENC_RAW\fP
+Return the unmodified names as it is in the ZIP archive.
+.TP ZIP_FL_ENC_STRICTXX
+\fRZIP_FL_ENC_GUESS\fP
+(Default.)
+Guess the encoding of the name in the ZIP archive and convert it
+to UTF-8, if necessary.
+.TP ZIP_FL_ENC_STRICTXX
+\fRZIP_FL_ENC_STRICT\fP
+Follow the ZIP specification and expect CP-437 encoded names in
+the ZIP archive (except if they are explicitly marked as UTF-8).
+Convert it to UTF-8.
+\fINote\fP:
+ASCII is a subset of both CP-437 and UTF-8.
 .SH "RETURN VALUES"
 Upon successful completion, a pointer to the name is returned.
 Otherwise,
-\fBNULL\fR
+\fRNULL\fP
 and the error code in
-\fBarchive\fR
+\fIarchive\fP
 is set to indicate the error.
 .SH "ERRORS"
 zip_get_name
 fails if:
-.RS
-.TP 4
-[ZIP_ER_DELETED]
-\fBindex\fR
+.TP 17n
+[\fRZIP_ER_DELETED\fP]
+\fIindex\fP
 refers to a file that has been deleted
 (see
-zip_delete(3)
-).
-.TP 4
-[ZIP_ER_INVAL]
-\fBindex\fR
+zip_delete(3)).
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIindex\fP
 is not a valid file index in
-\fBarchive,\fR
+\fIarchive\fP,
 or
-\fBindex\fR
+\fIindex\fP
 points to an added file and
-\fBZIP_FL_UNCHANGED\fR
+\fRZIP_FL_UNCHANGED\fP
 is set.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
+Required memory could not be allocated.
 .SH "SEE ALSO"
 libzip(3),
 zip_name_locate(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 743f117..c194683 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_get_name.mdoc -- get name of file by index
-.\" Copyright (C) 2003, 2004, 2005 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd January 20, 2005
+.Dd February 20, 2013
 .Dt ZIP_GET_NAME 3
 .Os
 .Sh NAME
@@ -40,7 +40,7 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft const char *
-.Fn zip_get_name "struct zip *archive" "int index" "int flags"
+.Fn zip_get_name "zip_t *archive" "zip_uint64_t index" "zip_flags_t flags"
 .Sh DESCRIPTION
 The
 .Fn zip_get_name
@@ -48,6 +48,10 @@ function returns the name of the file at position
 .Ar index
 in
 .Ar archive .
+The name is in UTF-8 encoding unless
+.Dv ZIP_FL_ENC_RAW
+was specified (see below).
+.Pp
 If
 .Ar flags
 is set to
@@ -56,6 +60,24 @@ the original unchanged filename is returned.
 The returned string must not be modified or freed, and becomes invalid when
 .Ar archive
 is closed.
+.Pp
+Additionally, the following
+.Ar flags
+are supported:
+.Bl -tag -width ZIP_FL_ENC_STRICTXX -offset indent
+.It Dv ZIP_FL_ENC_RAW
+Return the unmodified names as it is in the ZIP archive.
+.It Dv ZIP_FL_ENC_GUESS
+(Default.)
+Guess the encoding of the name in the ZIP archive and convert it
+to UTF-8, if necessary.
+.It Dv ZIP_FL_ENC_STRICT
+Follow the ZIP specification and expect CP-437 encoded names in
+the ZIP archive (except if they are explicitly marked as UTF-8).
+Convert it to UTF-8.
+.El
+.Em Note :
+ASCII is a subset of both CP-437 and UTF-8.
 .Sh RETURN VALUES
 Upon successful completion, a pointer to the name is returned.
 Otherwise,
@@ -81,11 +103,14 @@ or
 points to an added file and
 .Dv ZIP_FL_UNCHANGED
 is set.
+.It Bq Er ZIP_ER_MEMORY
+Required memory could not be allocated.
+.El
 .Sh SEE ALSO
 .Xr libzip 3 ,
 .Xr zip_name_locate 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 1b151b8..aee5084 100644 (file)
@@ -1,67 +1,35 @@
-.\" zip_get_num_entries.mdoc \-- get number of files in archive
-.\" Copyright (C) 2011 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_GET_NUM_ENTRIES 3 "February 14, 2011" NiH
+.TH "ZIP_GET_NUM_ENTRIES" "3" "August 1, 2012" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_get_num_entries \- get number of files in archive
+\fBzip_get_num_entries\fP
+\- get number of files in archive
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
-zip_uint64_t
-zip_get_num_entries(struct zip *archive, int flags);
+zip.h
+zip_int64_t
+zip_get_num_entries zip_t *archive zip_flags_t flags
 .SH "DESCRIPTION"
 The
 zip_get_num_entries
 function returns the number of files in
-\fBarchive.\fR
+\fIarchive\fP.
 If
-\fBflags\fR
+\fIflags\fP
 is set to
-\fBZIP_FL_UNCHANGED,\fR
+\fRZIP_FL_UNCHANGED\fP,
 the original number of entries is returned.
 .SH "RETURN VALUES"
 zip_get_num_entries
 returns the number of files in the zip archive,
 or \-1 if
-\fBarchive\fR
+\fIarchive\fP
 is
-\fBNULL.\fR
+\fRNULL\fP.
 .SH "SEE ALSO"
 libzip(3),
 zip_fopen_index(3),
 zip_stat_index(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 104ac01..70185c5 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_get_num_entries.mdoc -- get number of files in archive
-.\" Copyright (C) 2011 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2011-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 14, 2011
+.Dd August 1, 2012
 .Dt ZIP_GET_NUM_ENTRIES 3
 .Os
 .Sh NAME
@@ -39,8 +39,8 @@
 libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
-.Ft zip_uint64_t
-.Fn zip_get_num_entries "struct zip *archive" "int flags"
+.Ft zip_int64_t
+.Fn zip_get_num_entries "zip_t *archive" "zip_flags_t flags"
 .Sh DESCRIPTION
 The
 .Fn zip_get_num_entries
@@ -64,6 +64,6 @@ is
 .Xr zip_stat_index 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 1c690b6..fab593c 100644 (file)
@@ -1,67 +1,35 @@
-.\" zip_get_num_files.mdoc \-- get number of files in archive
-.\" Copyright (C) 2003-2011 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_GET_NUM_FILES 3 "February 14, 2011" NiH
+.TH "ZIP_GET_NUM_FILES" "3" "February 14, 2011" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_get_num_files \- get number of files in archive
+\fBzip_get_num_files\fP
+\- get number of files in archive
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_get_num_files(struct zip *archive);
+zip_get_num_files zip_t *archive
 .SH "DESCRIPTION"
-.I This function is deprecated.
-.I Use
+\fIThis function is deprecated\fP.
+\fIUse\fP
 zip_get_num_entries(3)
-.I instead.
+\fIinstead\fP.
 .PP
 The
 zip_get_num_files
 function returns the number of files in
-\fBarchive.\fR
+\fIarchive\fP.
 .SH "RETURN VALUES"
 zip_get_num_files
 returns the number of files in the zip archive,
 or \-1 if
-\fBarchive\fR
+\fIarchive\fP
 is
-\fBNULL.\fR
+\fRNULL\fP.
 .SH "SEE ALSO"
 libzip(3),
 zip_fopen_index(3),
 zip_stat_index(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index b91df73..3940998 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_get_num_files.mdoc -- get number of files in archive
-.\" Copyright (C) 2003-2011 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -40,12 +40,12 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_get_num_files "struct zip *archive"
+.Fn zip_get_num_files "zip_t *archive"
 .Sh DESCRIPTION
-.Em This function is deprecated.
+.Em This function is deprecated .
 .Em Use
 .Xr zip_get_num_entries 3
-.Em instead.
+.Em instead .
 .Pp
 The
 .Fn zip_get_num_files
@@ -64,6 +64,6 @@ is
 .Xr zip_stat_index 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index e3702df..f1a3150 100644 (file)
@@ -1,89 +1,75 @@
-.\" zip_name_locate.mdoc \-- get index of file by name
-.\" Copyright (C) 2003, 2005 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_NAME_LOCATE 3 "October 4, 2006" NiH
+.TH "ZIP_NAME_LOCATE" "3" "July 21, 2012" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_name_locate \- get index of file by name
+\fBzip_name_locate\fP
+\- get index of file by name
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
-int
-zip_name_locate(struct zip *archive, const char *fname, int flags);
+zip.h
+zip_int64_t
+zip_name_locate zip_t *archive const char *fname zip_flags_t flags
 .SH "DESCRIPTION"
 The
 zip_name_locate
 function returns the index of the file named
-\fBfname\fR
+\fIfname\fP
 in
-\fBarchive.\fR
+\fIarchive\fP.
 If
-\fBarchive\fR
+\fIarchive\fP
 does not contain a file with that name, \-1 is returned.
 The
-.Fa flags
+flags
 are specified by
-.I or'ing
+\fIor\fP'ing
 the following values, or 0 for none of them.
-.RS
-.TP 15
-\fBZIP_FL_NOCASE\fR
+.TP ZIP_FL_NOCASE
+\fRZIP_FL_NOCASE\fP
 Ignore case distinctions.
-.TP 15
-\fBZIP_FL_NODIR\fR
+(Will only work well if the file names are ASCII.)
+.TP ZIP_FL_NOCASE
+\fRZIP_FL_NODIR\fP
 Ignore directory part of file name in archive.
-.RE
+.TP ZIP_FL_NOCASE
+\fRZIP_FL_ENC_RAW\fP
+Compare against the unmodified names as it is in the ZIP archive.
+.TP ZIP_FL_NOCASE
+\fRZIP_FL_ENC_GUESS\fP
+(Default.)
+Guess the encoding of the name in the ZIP archive and convert it
+to UTF-8, if necessary, before comparing.
+.TP ZIP_FL_NOCASE
+\fRZIP_FL_ENC_STRICT\fP
+Follow the ZIP specification and expect CP-437 encoded names in
+the ZIP archive (except if they are explicitly marked as UTF-8).
+Convert it to UTF-8 before comparing.
+\fINote\fP:
+ASCII is a subset of both CP-437 and UTF-8.
 .SH "RETURN VALUES"
 zip_name_locate
 returns the index of the file named
-\fBfname\fR
+\fIfname\fP
 or \-1, if
-\fBarchive\fR
+\fIarchive\fP
 does not contain an entry of that name.
 .SH "ERRORS"
-The
 zip_name_locate
-function fails and sets the error information to
-ZIP_ER_NOENT
-if no entry of the name
-\fBfname\fR
+fails if:
+.TP 17n
+[\fRZIP_ER_NOENT\fP]
+No entry of the name
+\fIfname\fP
 is found in the archive.
-If one of the arguments is invalid, the error information is set to
-ZIP_ER_INVAL.
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+One of the arguments is invalid.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
+Required memory could not be allocated.
 .SH "SEE ALSO"
 libzip(3),
 zip_get_name(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index eeac3ed..742a6ea 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_name_locate.mdoc -- get index of file by name
-.\" Copyright (C) 2003, 2005 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd October 4, 2006
+.Dd July 21, 2012
 .Dt ZIP_NAME_LOCATE 3
 .Os
 .Sh NAME
@@ -39,8 +39,8 @@
 libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
-.Ft int
-.Fn zip_name_locate "struct zip *archive" "const char *fname" "int flags"
+.Ft zip_int64_t
+.Fn zip_name_locate "zip_t *archive" "const char *fname" "zip_flags_t flags"
 .Sh DESCRIPTION
 The
 .Fn zip_name_locate
@@ -59,9 +59,22 @@ the following values, or 0 for none of them.
 .Bl -tag -offset indent -width ZIP_FL_NOCASE
 .It Dv ZIP_FL_NOCASE
 Ignore case distinctions.
+(Will only work well if the file names are ASCII.)
 .It Dv ZIP_FL_NODIR
 Ignore directory part of file name in archive.
+.It Dv ZIP_FL_ENC_RAW
+Compare against the unmodified names as it is in the ZIP archive.
+.It Dv ZIP_FL_ENC_GUESS
+(Default.)
+Guess the encoding of the name in the ZIP archive and convert it
+to UTF-8, if necessary, before comparing.
+.It Dv ZIP_FL_ENC_STRICT
+Follow the ZIP specification and expect CP-437 encoded names in
+the ZIP archive (except if they are explicitly marked as UTF-8).
+Convert it to UTF-8 before comparing.
 .El
+.Em Note :
+ASCII is a subset of both CP-437 and UTF-8.
 .Sh RETURN VALUES
 .Fn zip_name_locate
 returns the index of the file named
@@ -70,20 +83,23 @@ or \-1, if
 .Ar archive
 does not contain an entry of that name.
 .Sh ERRORS
-The
 .Fn zip_name_locate
-function fails and sets the error information to
-.Er ZIP_ER_NOENT
-if no entry of the name
+fails if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_NOENT
+No entry of the name
 .Ar fname
 is found in the archive.
-If one of the arguments is invalid, the error information is set to
-.Er ZIP_ER_INVAL .
+.It Bq Er ZIP_ER_INVAL
+One of the arguments is invalid.
+.It Bq Er ZIP_ER_MEMORY
+Required memory could not be allocated.
+.El
 .Sh SEE ALSO
 .Xr libzip 3 ,
 .Xr zip_get_name 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 0efd895..cd1b32f 100644 (file)
-.\" zip_open.mdoc \-- open zip archive
-.\" Copyright (C) 2003-2009 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_OPEN 3 "February 15, 2009" NiH
+.TH "ZIP_OPEN" "3" "November 9, 2014" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_open \- open zip archive
+\fBzip_open\fP,
+\fBzip_open_from_source\fP
+\- open zip archive
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
-struct zip *
-zip_open(const char *path, int flags, int *errorp);
+zip.h
+zip_t *
+zip_open const char *path int flags int *errorp
+zip_t *
+zip_open_from_source zip_source_t *zs int flags zip_error_t *ze
 .SH "DESCRIPTION"
-The zip archive specified by
-\fBpath\fR
-is opened and a pointer to a
-.PP
+The
+zip_open
+function opens the zip archive specified by
+\fIpath\fP
+and returns a pointer to a
 struct zip,
-used to manipulate the archive, is returned.
+used to manipulate the archive.
 The
-.Fa flags
+flags
 are specified by
-.I or'ing
+\fIor\fP'ing
 the following values, or 0 for none of them.
-.RS
-.TP 15
-\fBZIP_CREATE\fR
+.TP ZIP_CHECKCONS
+\fRZIP_CHECKCONS\fP
+Perform additional stricter consistency checks on the archive, and
+error if they fail.
+.TP ZIP_CHECKCONS
+\fRZIP_CREATE\fP
 Create the archive if it does not exist.
-.TP 15
-\fBZIP_EXCL\fR
+.TP ZIP_CHECKCONS
+\fRZIP_EXCL\fP
 Error if archive already exists.
-.TP 15
-\fBZIP_CHECKCONS\fR
-Perform additional consistency checks on the archive, and error if
-they fail.
-.RE
+.TP ZIP_CHECKCONS
+\fRZIP_TRUNCATE\fP
+If archive exists, ignore its current contents.
+In other words, handle it the same way as an empty archive.
+.TP ZIP_CHECKCONS
+\fRZIP_RDONLY\fP
+Open archive in read-only mode.
 .PP
 If an error occurs and
-\fBerrorp\fR
-is non-NULL, it will be set to the corresponding error code.
+\fIerrorp\fP
+is
+non-\fRNULL\fP,
+it will be set to the corresponding error code.
+.PP
+The
+zip_open_from_source
+function opens a zip archive encapsulated by the zip_source
+zs
+using the provided
+flags.
+In case of error, the zip_error
+ze
+is filled in.
 .SH "RETURN VALUES"
 Upon successful completion
 zip_open
-returns a
-.PP
+and
+zip_open_from_source
+return a
 struct zip
 pointer.
 Otherwise,
-\fBNULL\fR
+\fRNULL\fP
 is returned and
-\fB*errorp\fR
-is set to indicate the error.
+zip_open
+sets
+\fI*errorp\fP
+to indicate the error, while
+zip_open_from source
+sets
+\fIze\fP
+to indicate the error.
 .SH "ERRORS"
 The archive specified by
-\fBpath\fR
+\fIpath\fP
 is opened unless:
-.RS
-.TP 4
-[ZIP_ER_EXISTS]
+.TP 17n
+[\fRZIP_ER_EXISTS\fP]
 The file specified by
-\fBpath\fR
+\fIpath\fP
 exists and
-\fBZIP_EXCL\fR
+\fRZIP_EXCL\fP
 is set.
-.TP 4
-[ZIP_ER_INCONS]
+.TP 17n
+[\fRZIP_ER_INCONS\fP]
 Inconsistencies were found in the file specified by
-\fBpath\fR
-and
-\fBZIP_CHECKCONS\fR
-was specified.
-.TP 4
-[ZIP_ER_INVAL]
+\fIpath\fP.
+This error is often caused by specifying
+\fRZIP_CHECKCONS\fP
+but can also happen without it.
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
 The
-\fBpath\fR
+\fIpath\fP
 argument is
-\fBNULL.\fR
-.TP 4
-[ZIP_ER_MEMORY]
+\fRNULL\fP.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
 Required memory could not be allocated.
-.TP 4
-[ZIP_ER_NOENT]
+.TP 17n
+[\fRZIP_ER_NOENT\fP]
 The file specified by
-\fBpath\fR
+\fIpath\fP
 does not exist and
-\fBZIP_CREATE\fR
+\fRZIP_CREATE\fP
 is not set.
-.TP 4
-[ZIP_ER_NOZIP]
+.TP 17n
+[\fRZIP_ER_NOZIP\fP]
 The file specified by
-\fBpath\fR
+\fIpath\fP
 is not a zip archive.
-.TP 4
-[ZIP_ER_OPEN]
+.TP 17n
+[\fRZIP_ER_OPEN\fP]
 The file specified by
-\fBpath\fR
+\fIpath\fP
 could not be opened.
-.TP 4
-[ZIP_ER_READ]
+.TP 17n
+[\fRZIP_ER_READ\fP]
 A read error occurred; see
-.Va errno
+errno
 for details.
-.TP 4
-[ZIP_ER_SEEK]
+.TP 17n
+[\fRZIP_ER_SEEK\fP]
 The file specified by
-\fBpath\fR
+\fIpath\fP
 does not allow seeks.
-.RE
 .SH "SEE ALSO"
 libzip(3),
 zip_close(3),
 zip_error_to_str(3),
 zip_fdopen(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 1f1a556..c7df355 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_open.mdoc -- open zip archive
-.\" Copyright (C) 2003-2009 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 15, 2009
+.Dd November 9, 2014
 .Dt ZIP_OPEN 3
 .Os
 .Sh NAME
-.Nm zip_open
+.Nm zip_open ,
+.Nm zip_open_from_source
 .Nd open zip archive
 .Sh LIBRARY
 libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
-.Ft struct zip *
+.Ft zip_t *
 .Fn zip_open "const char *path" "int flags" "int *errorp"
+.Ft zip_t *
+.Fn zip_open_from_source "zip_source_t *zs" "int flags" "zip_error_t *ze"
 .Sh DESCRIPTION
-The zip archive specified by
+The
+.Fn zip_open
+function opens the zip archive specified by
 .Ar path
-is opened and a pointer to a
+and returns a pointer to a
 .Ft struct zip ,
-used to manipulate the archive, is returned.
+used to manipulate the archive.
 The
 .Fa flags
 are specified by
 .Em or Ns No 'ing
 the following values, or 0 for none of them.
 .Bl -tag -offset indent -width ZIP_CHECKCONS
+.It Dv ZIP_CHECKCONS
+Perform additional stricter consistency checks on the archive, and
+error if they fail.
 .It Dv ZIP_CREATE
 Create the archive if it does not exist.
 .It Dv ZIP_EXCL
 Error if archive already exists.
-.It Dv ZIP_CHECKCONS
-Perform additional consistency checks on the archive, and error if
-they fail.
+.It Dv ZIP_TRUNCATE
+If archive exists, ignore its current contents.
+In other words, handle it the same way as an empty archive.
+.It Dv ZIP_RDONLY
+Open archive in read-only mode.
 .El
 .Pp
 If an error occurs and
 .Ar errorp
-is non-NULL, it will be set to the corresponding error code.
+is
+.Pf non- Dv NULL ,
+it will be set to the corresponding error code.
+.Pp
+The
+.Fn zip_open_from_source
+function opens a zip archive encapsulated by the zip_source
+.Fa zs
+using the provided
+.Fa flags .
+In case of error, the zip_error
+.Fa ze
+is filled in.
 .Sh RETURN VALUES
 Upon successful completion
 .Fn zip_open
-returns a
+and
+.Fn zip_open_from_source
+return a
 .Ft struct zip
 pointer.
 Otherwise,
 .Dv NULL
 is returned and
+.Fn zip_open
+sets
 .Ar *errorp
-is set to indicate the error.
+to indicate the error, while
+.Fn zip_open_from source
+sets
+.Ar ze
+to indicate the error.
 .Sh ERRORS
 The archive specified by
 .Ar path
@@ -89,10 +119,10 @@ exists and
 is set.
 .It Bq Er ZIP_ER_INCONS
 Inconsistencies were found in the file specified by
-.Ar path
-and
+.Ar path .
+This error is often caused by specifying
 .Dv ZIP_CHECKCONS
-was specified.
+but can also happen without it.
 .It Bq Er ZIP_ER_INVAL
 The
 .Ar path
@@ -130,6 +160,6 @@ does not allow seeks.
 .Xr zip_fdopen 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 38c5a02..ce86d6f 100644 (file)
@@ -1,84 +1,24 @@
-.\" zip_rename.mdoc \-- rename file in zip archive
-.\" Copyright (C) 2003-2009 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_RENAME 3 "March 10, 2009" NiH
+.TH "ZIP_RENAME" "3" "June 23, 2012" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_rename \- rename file in zip archive
+\fBzip_rename\fP
+\- rename file in zip archive
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_rename(struct zip *archive, zip_uint64_t index, const char *name);
+zip_rename zip_t *archive zip_uint64_t index const char *name
 .SH "DESCRIPTION"
-The file at position
-\fBindex\fR
-in the zip archive
-\fBarchive\fR
-is renamed to
-\fBname.\fR
-.SH "RETURN VALUES"
-Upon successful completion 0 is returned.
-Otherwise, \-1 is returned and the error code in
-\fBarchive\fR
-is set to indicate the error.
-.SH "ERRORS"
 zip_rename
-fails if:
-.RS
-.TP 4
-[ZIP_ER_DELETED]
-The file to be renamed has been deleted from the archive.
-.TP 4
-[ZIP_ER_EXISTS]
-There is already a file called
-\fBname\fR
-in the archive.
-.TP 4
-[ZIP_ER_INVAL]
-\fBindex\fR
-is not a valid file index in
-\fBarchive,\fR
-\fBname is\fR
-\fBNULL\fR
-or the empty string.
-Also a file cannot be renamed to a directory or vice versa.
-Directories are denoted by a trailing slash.
-.RE
+is the obsolete version of
+zip_file_rename(3).
+It is the same as calling
+zip_file_rename(3)
+with an empty flags argument.
 .SH "SEE ALSO"
 libzip(3),
-zip_unchange(3)
+zip_file_rename(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 9c80a1b..e1810af 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_rename.mdoc -- rename file in zip archive
-.\" Copyright (C) 2003-2009 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd March 10, 2009
+.Dd June 23, 2012
 .Dt ZIP_RENAME 3
 .Os
 .Sh NAME
@@ -40,44 +40,19 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_rename "struct zip *archive" "zip_uint64_t index" "const char *name"
+.Fn zip_rename "zip_t *archive" "zip_uint64_t index" "const char *name"
 .Sh DESCRIPTION
-The file at position
-.Ar index
-in the zip archive
-.Ar archive
-is renamed to
-.Ar name .
-.Sh RETURN VALUES
-Upon successful completion 0 is returned.
-Otherwise, \-1 is returned and the error code in
-.Ar archive
-is set to indicate the error.
-.Sh ERRORS
 .Fn zip_rename
-fails if:
-.Bl -tag -width Er
-.It Bq Er ZIP_ER_DELETED
-The file to be renamed has been deleted from the archive.
-.It Bq Er ZIP_ER_EXISTS
-There is already a file called
-.Ar name
-in the archive.
-.It Bq Er ZIP_ER_INVAL
-.Ar index
-is not a valid file index in
-.Ar archive ,
-.Ar name is
-.Dv NULL
-or the empty string.
-Also a file cannot be renamed to a directory or vice versa.
-Directories are denoted by a trailing slash.
-.El
+is the obsolete version of
+.Xr zip_file_rename 3 .
+It is the same as calling
+.Xr zip_file_rename 3
+with an empty flags argument.
 .Sh SEE ALSO
 .Xr libzip 3 ,
-.Xr zip_unchange 3
+.Xr zip_file_rename 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index efa3e75..1a0c9f9 100644 (file)
@@ -1,81 +1,50 @@
-.\" zip_set_archive_comment.mdoc \-- set zip archive comment
-.\" Copyright (C) 2006-2007 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_SET_ARCHIVE_COMMENT 3 "October 26, 2007" NiH
+.TH "ZIP_SET_ARCHIVE_COMMENT" "3" "July 22, 2012" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_set_archive_comment \- set zip archive comment
+\fBzip_set_archive_comment\fP
+\- set zip archive comment
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_set_archive_comment(struct zip *archive); \
-"const char *comment" "int len"
+zip_set_archive_comment zip_t *archive const char *comment zip_uint16_t len
 .SH "DESCRIPTION"
 The
 zip_set_archive_comment
 function sets the comment for the entire zip archive.
 If
-\fBcomment\fR
+\fIcomment\fP
 is
-\fBNULL\fR
+\fRNULL\fP
 and
-\fBlen\fR
+\fIlen\fP
 is 0, the archive comment will be removed.
+\fIcomment\fP
+must be encoded in ASCII or UTF-8.
 .SH "RETURN VALUES"
 Upon successful completion 0 is returned.
 Otherwise, \-1 is returned and the error information in
-\fBarchive\fR
+\fIarchive\fP
 is set to indicate the error.
 .SH "ERRORS"
 zip_set_archive_comment
 fails if:
-.RS
-.TP 4
-[ZIP_ER_INVAL]
-\fBlen\fR
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIlen\fP
 is less than 0 or longer than the maximum comment length in a zip file
-(65535).
-.TP 4
-[ZIP_ER_MEMORY]
+(65535), or
+\fIcomment\fP
+is not a valid UTF-8 encoded string.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
 Required memory could not be allocated.
-.RE
 .SH "SEE ALSO"
 libzip(3),
 zip_get_archive_comment(3),
 zip_get_file_comment(3),
 zip_set_file_comment(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 1e1b602..74a7dbf 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_set_archive_comment.mdoc -- set zip archive comment
-.\" Copyright (C) 2006-2007 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd October 26, 2007
+.Dd July 22, 2012
 .Dt ZIP_SET_ARCHIVE_COMMENT 3
 .Os
 .Sh NAME
@@ -40,8 +40,8 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_set_archive_comment "struct zip *archive" \
-"const char *comment" "int len"
+.Fn zip_set_archive_comment "zip_t *archive" \
+"const char *comment" "zip_uint16_t len"
 .Sh DESCRIPTION
 The
 .Fn zip_set_archive_comment
@@ -53,6 +53,8 @@ is
 and
 .Ar len
 is 0, the archive comment will be removed.
+.Ar comment
+must be encoded in ASCII or UTF-8.
 .Sh RETURN VALUES
 Upon successful completion 0 is returned.
 Otherwise, \-1 is returned and the error information in
@@ -65,7 +67,9 @@ fails if:
 .It Bq Er ZIP_ER_INVAL
 .Ar len
 is less than 0 or longer than the maximum comment length in a zip file
-(65535).
+(65535), or
+.Ar comment
+is not a valid UTF-8 encoded string.
 .It Bq Er ZIP_ER_MEMORY
 Required memory could not be allocated.
 .El
@@ -76,6 +80,6 @@ Required memory could not be allocated.
 .Xr zip_set_file_comment 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index f06f24a..77ce84f 100644 (file)
@@ -1,65 +1,24 @@
-.\" zip_set_archive_flag.mdoc \-- set zip archive flag
-.\" Copyright (C) 2008 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_SET_ARCHIVE_FLAG 3 "June 4, 2008" NiH
+.TH "ZIP_SET_ARCHIVE_FLAG" "3" "April 29, 2015" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_set_archive_flag \- set zip archive flag
+\fBzip_set_archive_flag\fP
+\- set zip archive flag
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_set_archive_flag(struct zip *archive, int flag, int value);
+zip_set_archive_flag zip_t *archive zip_flags_t flag int value
 .SH "DESCRIPTION"
 The
 zip_set_archive_flag
 function sets the flag
-\fBflag\fR
+\fIflag\fP
 for the archive
-\fBarchive\fR
+\fIarchive\fP
 to the value
-\fBvalue.\fR
+\fIvalue\fP.
 .PP
-Supported flags are:
-.RS
-.TP 21
-\fBZIP_AFL_TORRENT\fR
-Create a torrent-zipped archive.
-This restricts the values that can be set from the application side.
-In particular, time stamps are not saved and the order of the files in
-the archive is alphabetical.
-No file comments or extended attributes are allowed and the archive
-comment can not be chosen.
-.RE
+Currently there are no supported flags.
 .SH "RETURN VALUES"
 Upon successful completion 0 is returned, and \-1 if an error
 occurred.
@@ -67,7 +26,6 @@ occurred.
 libzip(3),
 zip_get_archive_flag(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 2662623..20c0cee 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_set_archive_flag.mdoc -- set zip archive flag
-.\" Copyright (C) 2008 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2008-2015 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd June 4, 2008
+.Dd April 29, 2015
 .Dt ZIP_SET_ARCHIVE_FLAG 3
 .Os
 .Sh NAME
@@ -40,7 +40,7 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_set_archive_flag "struct zip *archive" "int flag" "int value"
+.Fn zip_set_archive_flag "zip_t *archive" "zip_flags_t flag" "int value"
 .Sh DESCRIPTION
 The
 .Fn zip_set_archive_flag
@@ -51,16 +51,7 @@ for the archive
 to the value
 .Ar value .
 .Pp
-Supported flags are:
-.Bl -tag -width XZIPXAFLXTORRENTXXX
-.It Dv ZIP_AFL_TORRENT
-Create a torrent-zipped archive.
-This restricts the values that can be set from the application side.
-In particular, time stamps are not saved and the order of the files in
-the archive is alphabetical.
-No file comments or extended attributes are allowed and the archive
-comment can not be chosen.
-.El
+Currently there are no supported flags.
 .Sh RETURN VALUES
 Upon successful completion 0 is returned, and \-1 if an error
 occurred.
@@ -69,6 +60,6 @@ occurred.
 .Xr zip_get_archive_flag 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 46a0943..f43c6f3 100644 (file)
@@ -1,52 +1,21 @@
-.\" zip_set_default_password.mdoc \-- set default password for zip
-.\" Copyright (C) 2011 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP files.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_SET_DEFAULT_PASSWORD 3 "January 3, 2011" NiH
+.TH "ZIP_SET_DEFAULT_PASSWORD" "3" "January 3, 2011" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_set_default_password \- set default password for encrypted files in zip
+\fBzip_set_default_password\fP
+\- set default password for encrypted files in zip
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_set_default_password(struct zip *archive, const char *password);
+zip_set_default_password zip_t *archive const char *password
 .SH "DESCRIPTION"
 The
 zip_set_default_password
 function sets the default password used when accessing encrypted files.
 If
-\fBpassword\fR
+\fIpassword\fP
 is
-\fBNULL,\fR
+\fRNULL\fP,
 the default password is unset.
 .PP
 If you prefer a different password for single files, use
@@ -58,22 +27,19 @@ zip archive.
 .SH "RETURN VALUES"
 Upon successful completion 0 is returned.
 Otherwise, \-1 is returned and the error information in
-\fBarchive\fR
+\fIarchive\fP
 is set to indicate the error.
 .SH "ERRORS"
 zip_set_default_password
 fails if:
-.RS
-.TP 4
-[ZIP_ER_MEMORY]
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
 Required memory could not be allocated.
-.RE
 .SH "SEE ALSO"
 libzip(3),
 zip_fopen(3),
 zip_fopen_encrypted(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index fdd3078..0e3e258 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_set_default_password.mdoc -- set default password for zip
-.\" Copyright (C) 2011 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2011-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP files.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -40,7 +40,7 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_set_default_password "struct zip *archive" "const char *password"
+.Fn zip_set_default_password "zip_t *archive" "const char *password"
 .Sh DESCRIPTION
 The
 .Fn zip_set_default_password
@@ -75,6 +75,6 @@ Required memory could not be allocated.
 .Xr zip_fopen_encrypted 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 41eed36..3d68a1c 100644 (file)
@@ -1,90 +1,33 @@
-.\" zip_set_file_comment.mdoc \-- set comment for file in zip
-.\" Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP files.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_SET_FILE_COMMENT 3 "March 10, 2009" NiH
+.TH "ZIP_SET_FILE_COMMENT" "3" "June 23, 2012" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_set_file_comment \- set comment for file in zip
+\fBzip_set_file_comment\fP
+\- set comment for file in zip
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_set_file_comment(struct zip *archive, zip_uint64_t index); \
-"const char *comment" "int len"
+zip_set_file_comment zip_t *archive zip_uint64_t index const char *comment int len
 .SH "DESCRIPTION"
 The
 zip_set_file_comment
-function sets the comment for the file at position
-\fBindex\fR
-in the zip archive to
-\fBcomment\fR
-of length
-\fBlen.\fR
-If
-\fBcomment\fR
-is
-\fBNULL\fR
-and
-\fBlen\fR
-is 0, the file comment will be removed.
-.SH "RETURN VALUES"
-Upon successful completion 0 is returned.
-Otherwise, \-1 is returned and the error information in
-\fBarchive\fR
-is set to indicate the error.
-.SH "ERRORS"
+function is the obsolete version of
+zip_file_set_comment(3).
+The only differences are the type of the
+\fIlen\fP
+argument and the additional
+\fIflags\fP
+argument.
 zip_set_file_comment
-fails if:
-.RS
-.TP 4
-[ZIP_ER_INVAL]
-\fBindex\fR
-is not a valid file index in
-\fBarchive,\fR
-or
-\fBlen\fR
-is less than 0 or longer than the maximum comment length in a zip file
-(65535).
-.TP 4
-[ZIP_ER_MEMORY]
-Required memory could not be allocated.
-.RE
+is the same as calling
+zip_file_set_comment(3)
+with an empty
+\fIflags\fP
+argument.
 .SH "SEE ALSO"
 libzip(3),
-zip_get_archive_comment(3),
-zip_get_file_comment(3),
-zip_set_archive_comment(3)
+zip_file_set_comment(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 068304f..3b866b9 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_set_file_comment.mdoc -- set comment for file in zip
-.\" Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP files.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd March 10, 2009
+.Dd June 23, 2012
 .Dt ZIP_SET_FILE_COMMENT 3
 .Os
 .Sh NAME
@@ -40,51 +40,29 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_set_file_comment "struct zip *archive" "zip_uint64_t index" \
+.Fn zip_set_file_comment "zip_t *archive" "zip_uint64_t index" \
 "const char *comment" "int len"
 .Sh DESCRIPTION
 The
 .Fn zip_set_file_comment
-function sets the comment for the file at position
-.Ar index
-in the zip archive to
-.Ar comment
-of length
-.Ar len .
-If
-.Ar comment
-is
-.Dv NULL
-and
+function is the obsolete version of
+.Xr zip_file_set_comment 3 .
+The only differences are the type of the
 .Ar len
-is 0, the file comment will be removed.
-.Sh RETURN VALUES
-Upon successful completion 0 is returned.
-Otherwise, \-1 is returned and the error information in
-.Ar archive
-is set to indicate the error.
-.Sh ERRORS
+argument and the additional
+.Ar flags
+argument.
 .Fn zip_set_file_comment
-fails if:
-.Bl -tag -width Er
-.It Bq Er ZIP_ER_INVAL
-.Ar index
-is not a valid file index in
-.Ar archive ,
-or
-.Ar len
-is less than 0 or longer than the maximum comment length in a zip file
-(65535).
-.It Bq Er ZIP_ER_MEMORY
-Required memory could not be allocated.
-.El
+is the same as calling
+.Xr zip_file_set_comment 3
+with an empty
+.Ar flags
+argument.
 .Sh SEE ALSO
 .Xr libzip 3 ,
-.Xr zip_get_archive_comment 3 ,
-.Xr zip_get_file_comment 3 ,
-.Xr zip_set_archive_comment 3
+.Xr zip_file_set_comment 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_set_file_compression.man b/man/zip_set_file_compression.man
new file mode 100644 (file)
index 0000000..4b99a41
--- /dev/null
@@ -0,0 +1,73 @@
+.TH "ZIP_SET_FILE_COMPRESSION" "3" "May 1, 2012" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_set_file_compression\fP
+\- set compression method for file in zip
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_set_file_compression zip_t *archive zip_uint64_t index zip_int32_t comp zip_uint32_t comp_flags
+.SH "DESCRIPTION"
+The
+zip_set_file_compression
+function sets the compression method for the file at position
+\fIindex\fP
+in the zip archive to
+\fIcomp\fP
+with the compression method specific
+\fIcomp_flags\fP.
+The
+\fIcomp\fP
+is the same as returned by
+zip_stat(3).
+For the
+\fIcomp\fP
+argument, currently only the following values are supported:
+.TP ZIP_CM_DEFLATE_XX
+\fRZIP_CM_DEFAULT\fP
+default compression; currently the same as
+\fRZIP_CM_DEFLATE\fP.
+.TP ZIP_CM_DEFLATE_XX
+\fRZIP_CM_STORE\fP
+Store the file uncompressed.
+.TP ZIP_CM_DEFLATE_XX
+\fRZIP_CM_DEFLATE\fP
+Deflate the file with the
+zlib(3)
+algorithm and default options
+.PP
+The
+\fIcomp_flags\fP
+argument is currently ignored.
+.PP
+The current compression method for a file in a zip archive can be
+determined using
+zip_stat(3).
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+\fIarchive\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_set_file_compression
+fails if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIindex\fP
+is not a valid file index in
+\fIarchive\fP,
+or the argument combination is invalid.
+.TP 17n
+[\fRZIP_ER_COMPNOTSUPP\fP]
+Unsupported compression method requested.
+.TP 17n
+[\fRZIP_ER_RDONLY\fP]
+Read-only zip file, no changes allowed.
+.SH "SEE ALSO"
+libzip(3),
+zip_stat(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_set_file_compression.mdoc b/man/zip_set_file_compression.mdoc
new file mode 100644 (file)
index 0000000..60b4bb4
--- /dev/null
@@ -0,0 +1,112 @@
+.\" zip_set_file_compression.mdoc -- set compression method and its flags
+.\" Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP files.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd May 1, 2012
+.Dt ZIP_SET_FILE_COMPRESSION 3
+.Os
+.Sh NAME
+.Nm zip_set_file_compression
+.Nd set compression method for file in zip
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_set_file_compression "zip_t *archive" "zip_uint64_t index" \
+"zip_int32_t comp" "zip_uint32_t comp_flags"
+.Sh DESCRIPTION
+The
+.Fn zip_set_file_compression
+function sets the compression method for the file at position
+.Ar index
+in the zip archive to
+.Ar comp
+with the compression method specific
+.Ar comp_flags .
+The
+.Ar comp
+is the same as returned by
+.Xr zip_stat 3 .
+For the
+.Ar comp
+argument, currently only the following values are supported:
+.Bl -tag -width ZIP_CM_DEFLATE_XX
+.It Dv ZIP_CM_DEFAULT
+default compression; currently the same as
+.Dv ZIP_CM_DEFLATE .
+.It Dv ZIP_CM_STORE
+Store the file uncompressed.
+.It Dv ZIP_CM_DEFLATE
+Deflate the file with the
+.Xr zlib 3
+algorithm and default options
+.El
+.Pp
+The
+.Ar comp_flags
+argument is currently ignored.
+.\" For the comp_flags argument, the lower 4 bits define the compression
+.\" level.
+.\" 0 is fastest compression, 15 is highest compression
+.\" .Dv ZIP_COMP_FL_DEFAULT
+.\" can be used to specify that the default shall be used.
+.\" Further compression method specific flags will be added over time.
+.Pp
+The current compression method for a file in a zip archive can be
+determined using
+.Xr zip_stat 3 .
+.Sh RETURN VALUES
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar archive
+is set to indicate the error.
+.Sh ERRORS
+.Fn zip_set_file_compression
+fails if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_INVAL
+.Ar index
+is not a valid file index in
+.Ar archive ,
+or the argument combination is invalid.
+.It Bq Er ZIP_ER_COMPNOTSUPP
+Unsupported compression method requested.
+.It Bq Er ZIP_ER_RDONLY
+Read-only zip file, no changes allowed.
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_stat 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source.man b/man/zip_source.man
new file mode 100644 (file)
index 0000000..9d9274a
--- /dev/null
@@ -0,0 +1,54 @@
+.TH "ZIP_SOURCE" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source\fP
+\- zip data source structure
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_source_t *zs;
+.SH "DESCRIPTION"
+A
+struct zip_source
+is a data source used by
+libzip(3)
+for adding or replacing file contents for a file in a zip archive.
+If the source supports seeking, it can also be used to open zip archives from.
+It is created by calling one of
+zip_source_buffer(3),
+zip_source_buffer_create(3),
+zip_source_file(3),
+zip_source_file_create(3),
+zip_source_filep(3),
+zip_source_filep_create(3),
+zip_source_function(3),
+zip_source_function_create(3),
+or
+zip_source_zip(3).
+zip_source_t
+is reference counted, and created with a reference count of 1.
+zip_open_from_source(3),
+zip_file_add(3),
+and
+zip_file_replace(3).
+will decrement the reference count of the
+zip_source_t
+when they are done using it, so
+zip_source_free(3)
+only needs to be called when these functions return an error.
+Use
+zip_source_keep(3)
+to increase the reference count, for example if you need the source after
+zip_close(3).
+.SH "SEE ALSO"
+libzip(3),
+zip_source_buffer(3),
+zip_source_file(3),
+zip_source_filep(3),
+zip_source_free(3),
+zip_source_function(3),
+zip_source_zip(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source.mdoc b/man/zip_source.mdoc
new file mode 100644 (file)
index 0000000..e59d5a2
--- /dev/null
@@ -0,0 +1,88 @@
+.\" zip_source.mdoc -- description of zip data source
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE 3
+.Os
+.Sh NAME
+.Nm zip_source
+.Nd zip data source structure
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Vt zip_source_t *zs ;
+.Sh DESCRIPTION
+A
+.Vt struct zip_source
+is a data source used by
+.Xr libzip 3
+for adding or replacing file contents for a file in a zip archive.
+If the source supports seeking, it can also be used to open zip archives from.
+It is created by calling one of
+.Xr zip_source_buffer 3 ,
+.Xr zip_source_buffer_create 3 ,
+.Xr zip_source_file 3 ,
+.Xr zip_source_file_create 3 ,
+.Xr zip_source_filep 3 ,
+.Xr zip_source_filep_create 3 ,
+.Xr zip_source_function 3 ,
+.Xr zip_source_function_create 3 ,
+or
+.Xr zip_source_zip 3 .
+.Vt zip_source_t
+is reference counted, and created with a reference count of 1.
+.Xr zip_open_from_source 3 ,
+.Xr zip_file_add 3 ,
+and
+.Xr zip_file_replace 3 .
+will decrement the reference count of the
+.Vt zip_source_t
+when they are done using it, so
+.Xr zip_source_free 3
+only needs to be called when these functions return an error.
+Use
+.Xr zip_source_keep 3
+to increase the reference count, for example if you need the source after
+.Xr zip_close 3 .
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source_buffer 3 ,
+.Xr zip_source_file 3 ,
+.Xr zip_source_filep 3 ,
+.Xr zip_source_free 3 ,
+.Xr zip_source_function 3 ,
+.Xr zip_source_zip 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_begin_write.man b/man/zip_source_begin_write.man
new file mode 100644 (file)
index 0000000..f055c44
--- /dev/null
@@ -0,0 +1,34 @@
+.TH "ZIP_SOURCE_BEGIN_WRITE" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_begin_write\fP
+\- prepare zip source for writing
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_source_begin_write zip_source_t *source
+.SH "DESCRIPTION"
+The function
+zip_source_begin_write
+prepares
+source
+for writing.
+Usually this involves creating temporary files or allocating buffers.
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+\fIsource\fP
+is set to indicate the error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3),
+zip_source_commit_write(3),
+zip_source_rollback_write(3),
+zip_source_seek_write(3),
+zip_source_tell_write(3),
+zip_source_write(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_begin_write.mdoc b/man/zip_source_begin_write.mdoc
new file mode 100644 (file)
index 0000000..ba78e0d
--- /dev/null
@@ -0,0 +1,68 @@
+.\" zip_source_begin_write.mdoc -- prepare zip source for writing
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_BEGIN_WRITE 3
+.Os
+.Sh NAME
+.Nm zip_source_begin_write
+.Nd prepare zip source for writing
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_source_begin_write "zip_source_t *source"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_begin_write
+prepares
+.Fa source
+for writing.
+Usually this involves creating temporary files or allocating buffers.
+.Sh RETURN VALUES
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar source
+is set to indicate the error.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_commit_write 3 ,
+.Xr zip_source_rollback_write 3 ,
+.Xr zip_source_seek_write 3 ,
+.Xr zip_source_tell_write 3 ,
+.Xr zip_source_write 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 6711841..6f810b8 100644 (file)
@@ -1,88 +1,62 @@
-.\" zip_source_buffer.mdoc \-- create zip data source from buffer
-.\" Copyright (C) 2004-2008 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_SOURCE_DATA 3 "August 1, 2008" NiH
+.TH "ZIP_SOURCE_BUFFER" "3" "October 17, 2014" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_source_buffer \- create zip data source from buffer
+\fBzip_source_buffer\fP
+\- create zip data source from buffer
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
-struct zip_source *
-zip_source_buffer(struct zip *archive, const void *data); \
-"zip_uint64_t len" "int freep"
+zip.h
+zip_source_t *
+zip_source_buffer zip_t *archive const void *data zip_uint64_t len int freep
+zip_source_t *
+zip_source_buffer_create const void *data zip_uint64_t len int freep zip_error_t *error
 .SH "DESCRIPTION"
-The function
+The functions
 zip_source_buffer
-creates a zip source from the buffer
-\fBdata\fR
+and
+zip_source_buffer_create
+create a zip source from the buffer
+\fIdata\fP
 of size
-\fBlen.\fR
+\fIlen\fP.
 If
-\fBfreep\fR
+\fIfreep\fP
 is non-zero, the buffer will be freed when it is no longer needed.
+\fIdata\fP
+must remain valid for the lifetime of the created source.
+.PP
+The source can be used to open a zip archive from.
 .SH "RETURN VALUES"
 Upon successful completion, the created source is returned.
 Otherwise,
-\fBNULL\fR
+\fRNULL\fP
 is returned and the error code in
-\fBarchive\fR
+\fIarchive\fP
+or
+\fIerror\fP
 is set to indicate the error.
 .SH "ERRORS"
 zip_source_buffer
-fails if:
-.RS
-.TP 4
-[ZIP_ER_INVAL]
-\fBlen\fR
+and
+zip_source_buffer_create
+fail if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIlen\fP
 is greater than zero and
-\fBdata\fR
+\fIdata\fP
 is
-\fBNULL.\fR
-.TP 4
-[ZIP_ER_MEMORY]
+\fRNULL\fP.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
 Required memory could not be allocated.
-.RE
 .SH "SEE ALSO"
 libzip(3),
 zip_add(3),
+zip_open_from_source(3),
 zip_replace(3),
-zip_source_file(3),
-zip_source_filep(3),
-zip_source_free(3),
-zip_source_function(3),
-zip_source_zip(3)
+zip_source(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 9185250..db865d7 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_source_buffer.mdoc -- create zip data source from buffer
-.\" Copyright (C) 2004-2008 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,8 +29,8 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd August 1, 2008
-.Dt ZIP_SOURCE_DATA 3
+.Dd October 17, 2014
+.Dt ZIP_SOURCE_BUFFER 3
 .Os
 .Sh NAME
 .Nm zip_source_buffer
 libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
-.Ft struct zip_source *
-.Fn zip_source_buffer "struct zip *archive" "const void *data" \
+.Ft zip_source_t *
+.Fn zip_source_buffer "zip_t *archive" "const void *data" \
 "zip_uint64_t len" "int freep"
+.Ft zip_source_t *
+.Fn zip_source_buffer_create "const void *data" \
+"zip_uint64_t len" "int freep" "zip_error_t *error"
 .Sh DESCRIPTION
-The function
+The functions
 .Fn zip_source_buffer
-creates a zip source from the buffer
+and
+.Fn zip_source_buffer_create
+create a zip source from the buffer
 .Ar data
 of size
 .Ar len .
 If
 .Ar freep
 is non-zero, the buffer will be freed when it is no longer needed.
+.Ar data
+must remain valid for the lifetime of the created source.
+.Pp
+The source can be used to open a zip archive from.
 .Sh RETURN VALUES
 Upon successful completion, the created source is returned.
 Otherwise,
 .Dv NULL
 is returned and the error code in
 .Ar archive
+or
+.Ar error
 is set to indicate the error.
 .Sh ERRORS
 .Fn zip_source_buffer
-fails if:
+and
+.Fn zip_source_buffer_create
+fail if:
 .Bl -tag -width Er
 .It Bq Er ZIP_ER_INVAL
 .Ar len
@@ -75,14 +88,11 @@ Required memory could not be allocated.
 .Sh SEE ALSO
 .Xr libzip 3 ,
 .Xr zip_add 3 ,
+.Xr zip_open_from_source 3 ,
 .Xr zip_replace 3 ,
-.Xr zip_source_file 3 ,
-.Xr zip_source_filep 3 ,
-.Xr zip_source_free 3 ,
-.Xr zip_source_function 3 ,
-.Xr zip_source_zip 3
+.Xr zip_source 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_close.man b/man/zip_source_close.man
new file mode 100644 (file)
index 0000000..1454d40
--- /dev/null
@@ -0,0 +1,30 @@
+.TH "ZIP_SOURCE_CLOSE" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_close\fP
+\- open zip_source (which was open for reading)
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_source_close zip_source_t *source
+.SH "DESCRIPTION"
+The function
+zip_source_close
+closes
+source,
+indicating that no more data will be read.
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+\fIsource\fP
+is set to indicate the error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3),
+zip_source_free(3),
+zip_source_open(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
similarity index 59%
rename from man/zip_set_file_extra.man
rename to man/zip_source_close.mdoc
index 7298c1a..0355d3e 100644 (file)
@@ -1,7 +1,7 @@
-.\" zip_set_file_extra.mdoc \-- set extra field for file in zip
-.\" Copyright (C) 2006-2011 Dieter Baron and Thomas Klausner
+.\" zip_source_close.mdoc -- close zip source (open for reading)
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
 .\"
-.\" This file is part of libzip, a library to manipulate ZIP files.
+.\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
 .\"
 .\" Redistribution and use in source and binary forms, with or without
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.TH ZIP_SET_FILE_EXTRA 3 "February 13, 2011" NiH
-.SH "NAME"
-zip_set_file_extra \- set extra field for file in zip
-.SH "LIBRARY"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_CLOSE 3
+.Os
+.Sh NAME
+.Nm zip_source_close
+.Nd open zip_source (which was open for reading)
+.Sh LIBRARY
 libzip (-lzip)
-.SH "SYNOPSIS"
-#include <zip.h>
-.PP
-int
-zip_set_file_extra(struct zip *archive, zip_uint64_t index); \
-"const char *extra" "int len"
-.SH "DESCRIPTION"
-The
-zip_set_file_extra
-function sets the extra field for the file at position
-\fBindex\fR
-in the zip archive to
-\fBextra\fR
-of length
-\fBlen.\fR
-If
-\fBextra\fR
-is
-\fBNULL\fR
-and
-\fBlen\fR
-is 0, the file extra field will be removed.
-.SH "RETURN VALUES"
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_source_close "zip_source_t *source"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_close
+closes
+.Fa source ,
+indicating that no more data will be read.
+.Sh RETURN VALUES
 Upon successful completion 0 is returned.
 Otherwise, \-1 is returned and the error information in
-\fBarchive\fR
+.Ar source
 is set to indicate the error.
-.SH "ERRORS"
-zip_set_file_extra
-fails if:
-.RS
-.TP 4
-[ZIP_ER_INVAL]
-\fBindex\fR
-is not a valid file index in
-\fBarchive,\fR
-or
-\fBlen\fR
-is less than 0 or longer than the maximum extra field length in a zip file
-(65535).
-.TP 4
-[ZIP_ER_MEMORY]
-Required memory could not be allocated.
-.RE
-.SH "SEE ALSO"
-libzip(3),
-zip_get_file_extra(3)
-.SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_free 3 ,
+.Xr zip_source_open 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-Thomas Klausner <tk@giga.or.at>
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_commit_write.man b/man/zip_source_commit_write.man
new file mode 100644 (file)
index 0000000..c3fd599
--- /dev/null
@@ -0,0 +1,33 @@
+.TH "ZIP_SOURCE_COMMIT_WRITE" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_commit_write\fP
+\- finalize changes to zip source
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_source_commit_write zip_source_t *source
+.SH "DESCRIPTION"
+The function
+zip_source_commit_write
+finishes writing data to
+source
+and replaces the original with the newly written data.
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+\fIsource\fP
+is set to indicate the error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3),
+zip_source_begin_write(3),
+zip_source_rollback_write(3),
+zip_source_seek_write(3),
+zip_source_tell_write(3),
+zip_source_write(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_commit_write.mdoc b/man/zip_source_commit_write.mdoc
new file mode 100644 (file)
index 0000000..0fe189a
--- /dev/null
@@ -0,0 +1,67 @@
+.\" zip_source_commit_write.mdoc -- finalize changes to zip source
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_COMMIT_WRITE 3
+.Os
+.Sh NAME
+.Nm zip_source_commit_write
+.Nd finalize changes to zip source
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_source_commit_write "zip_source_t *source"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_commit_write
+finishes writing data to
+.Fa source
+and replaces the original with the newly written data.
+.Sh RETURN VALUES
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar source
+is set to indicate the error.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_begin_write 3 ,
+.Xr zip_source_rollback_write 3 ,
+.Xr zip_source_seek_write 3 ,
+.Xr zip_source_tell_write 3 ,
+.Xr zip_source_write 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_error.man b/man/zip_source_error.man
new file mode 100644 (file)
index 0000000..e899f0f
--- /dev/null
@@ -0,0 +1,23 @@
+.TH "ZIP_SOURCE_ERROR" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_error\fP
+\- get zip error for data source
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_error_t *
+zip_source_error zip_t *source
+.SH "DESCRIPTION"
+The
+zip_source_error
+function returns the zip error for the data source
+\fIsource\fP.
+.SH "SEE ALSO"
+libzip(3),
+zip_error_code_system(3),
+zip_error_code_zip(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_error.mdoc b/man/zip_source_error.mdoc
new file mode 100644 (file)
index 0000000..54bf75b
--- /dev/null
@@ -0,0 +1,57 @@
+.\" zip_source_error.mdoc -- get zip_error for data source
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_ERROR 3
+.Os
+.Sh NAME
+.Nm zip_source_error
+.Nd get zip error for data source
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft zip_error_t *
+.Fn zip_source_error "zip_t *source"
+.Sh DESCRIPTION
+The
+.Fn zip_source_error
+function returns the zip error for the data source
+.Ar source .
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_error_code_system 3 ,
+.Xr zip_error_code_zip 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
index c3da2f5..a8dd089 100644 (file)
-.\" zip_source_file.mdoc \-- create data source from a file
-.\" Copyright (C) 2004-2008 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_SOURCE_FILE 3 "August 1, 2008" NiH
+.TH "ZIP_SOURCE_FILE" "3" "March 11, 2015" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_source_file \- create data source from a file
+\fBzip_source_file\fP
+\- create data source from a file
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-.PP
-struct zip_source *
-zip_source_file(struct zip *archive, const char *fname); \
-"zip_uint64_t start" "zip_int64_t len"
+zip_source_t *
+zip_source_file zip_t *archive const char *fname zip_uint64_t start zip_int64_t len
+zip_source_t *
+zip_source_file_create const char *fname zip_uint64_t start zip_int64_t len zip_error_t *error
 .SH "DESCRIPTION"
-The function
-zip_source_file
-creates a zip source from a file.
+The functions
 zip_source_file
-opens
-\fBfname\fR
-and reads
-\fBlen\fR
+and
+zip_source_file_create
+create a zip source from a file.
+They open
+\fIfname\fP
+and read
+\fIlen\fP
 bytes from offset
-\fBstart\fR
+\fIstart\fP
 from it.
 If
-\fBlen\fR
+\fIlen\fP
 is 0 or \-1, the whole file (starting from
-\fBstart )\fR
+\fIstart\fP)
 is used.
 .PP
-The fie is opened and read when the data from the source is used, usually by
-zip_close.
+If the file supports seek, the source can be used to open a zip archive from.
+.PP
+The file is opened and read when the data from the source is used, usually by
+zip_close
+or
+zip_open_from_source.
 .SH "RETURN VALUES"
 Upon successful completion, the created source is returned.
 Otherwise,
-\fBNULL\fR
+\fRNULL\fP
 is returned and the error code in
-\fBarchive\fR
+\fIarchive\fP
+or
+\fIerror\fP
 is set to indicate the error.
 .SH "ERRORS"
 zip_source_file
-fails if:
-.RS
-.TP 4
-[ZIP_ER_INVAL]
-\fBfname,\fR
-\fBstart,\fR
+and
+zip_source_file_create
+fail if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIfname\fP,
+\fIstart\fP,
 or
-\fBlen\fR
+\fIlen\fP
 are invalid.
-.TP 4
-[ZIP_ER_MEMORY]
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
 Required memory could not be allocated.
-.TP 4
-[ZIP_ER_OPEN]
+.TP 17n
+[\fRZIP_ER_OPEN\fP]
 Opening
-\fBfname\fR
+\fIfname\fP
 failed.
-.RE
 .SH "SEE ALSO"
 libzip(3),
 zip_add(3),
 zip_replace(3),
-zip_source_buffer(3),
-zip_source_filep(3),
-zip_source_free(3),
-zip_source_function(3),
-zip_source_zip(3)
+zip_source(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 823dfb9..363e1ee 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_source_file.mdoc -- create data source from a file
-.\" Copyright (C) 2004-2008 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2004-2015 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd August 1, 2008
+.Dd March 11, 2015
 .Dt ZIP_SOURCE_FILE 3
 .Os
 .Sh NAME
 .Sh LIBRARY
 libzip (-lzip)
 .Sh SYNOPSIS
-.Ft struct zip_source *
-.Fn zip_source_file "struct zip *archive" "const char *fname" \
+.Ft zip_source_t *
+.Fn zip_source_file "zip_t *archive" "const char *fname" \
 "zip_uint64_t start" "zip_int64_t len"
+.Ft zip_source_t *
+.Fn zip_source_file_create "const char *fname" \
+"zip_uint64_t start" "zip_int64_t len" "zip_error_t *error"
 .Sh DESCRIPTION
-The function
+The functions
 .Fn zip_source_file
-creates a zip source from a file.
-.Fn zip_source_file
-opens
+and
+.Fn zip_source_file_create
+create a zip source from a file.
+They open
 .Ar fname
-and reads
+and read
 .Ar len
 bytes from offset
 .Ar start
@@ -59,18 +63,26 @@ is 0 or \-1, the whole file (starting from
 .Ar start )
 is used.
 .Pp
-The fie is opened and read when the data from the source is used, usually by
-.Fn zip_close .
+If the file supports seek, the source can be used to open a zip archive from.
+.Pp
+The file is opened and read when the data from the source is used, usually by
+.Fn zip_close
+or
+.Fn zip_open_from_source .
 .Sh RETURN VALUES
 Upon successful completion, the created source is returned.
 Otherwise,
 .Dv NULL
 is returned and the error code in
 .Ar archive
+or
+.Ar error
 is set to indicate the error.
 .Sh ERRORS
 .Fn zip_source_file
-fails if:
+and
+.Fn zip_source_file_create
+fail if:
 .Bl -tag -width Er
 .It Bq Er ZIP_ER_INVAL
 .Ar fname ,
@@ -89,13 +101,9 @@ failed.
 .Xr libzip 3 ,
 .Xr zip_add 3 ,
 .Xr zip_replace 3 ,
-.Xr zip_source_buffer 3 ,
-.Xr zip_source_filep 3 ,
-.Xr zip_source_free 3 ,
-.Xr zip_source_function 3 ,
-.Xr zip_source_zip 3
+.Xr zip_source 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index e376cde..cb5bbb3 100644 (file)
@@ -1,93 +1,61 @@
-.\" zip_source_filep.mdoc \-- create data source from a file stream
-.\" Copyright (C) 2004-2008 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_SOURCE_FILEP 3 "August 1, 2008" NiH
+.TH "ZIP_SOURCE_FILEP" "3" "November 18, 2014" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_source_filep \- create data source from FILE *
+\fBzip_source_filep\fP
+\- create data source from FILE *
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-.PP
-struct zip_source *
-zip_source_filep(struct zip *archive, FILE *file); \
-"zip_uint64_t start" "zip_int64_t len"
+zip_source_t *
+zip_source_filep zip_t *archive FILE *file zip_uint64_t start zip_int64_t len
+zip_source_t *
+zip_source_filep FILE *file zip_uint64_t start zip_int64_t len zip_error_t *error
 .SH "DESCRIPTION"
-The function
-zip_source_filep
-creates a zip source from a file stream.
+The functions
 zip_source_filep
-reads
-\fBlen\fR
+and
+zip_source_filep_create
+create a zip source from a file stream.
+They read
+\fIlen\fP
 bytes from offset
-\fBstart\fR
+\fIstart\fP
 from the open file stream
-\fBfile.\fR
+\fIfile\fP.
 If
-\fBlen\fR
+\fIlen\fP
 is 0 or \-1, the whole file (starting from
-\fBstart )\fR
+\fIstart\fP)
 is used.
+.PP
+If the file stream supports seeking, the source can be used to open a read-only zip archive from.
 .SH "RETURN VALUES"
 Upon successful completion, the created source is returned.
 Otherwise,
-\fBNULL\fR
+\fRNULL\fP
 is returned and the error code in
-\fBarchive\fR
+\fIarchive\fP
+or
+\fIerror\fP
 is set to indicate the error.
 .SH "ERRORS"
 zip_source_filep
 fails if:
-.RS
-.TP 4
-[ZIP_ER_INVAL]
-\fBfile,\fR
-\fBstart,\fR
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIfile\fP,
+\fIstart\fP,
 or
-\fBlen\fR
+\fIlen\fP
 are invalid.
-.TP 4
-[ZIP_ER_MEMORY]
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
 Required memory could not be allocated.
-.RE
 .SH "SEE ALSO"
 libzip(3),
 zip_add(3),
 zip_replace(3),
-zip_source_buffer(3),
-zip_source_file(3),
-zip_source_free(3),
-zip_source_function(3),
-zip_source_zip(3)
+zip_source(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 16d9d5a..0db99e1 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_source_filep.mdoc -- create data source from a file stream
-.\" Copyright (C) 2004-2008 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd August 1, 2008
+.Dd November 18, 2014
 .Dt ZIP_SOURCE_FILEP 3
 .Os
 .Sh NAME
 .Sh LIBRARY
 libzip (-lzip)
 .Sh SYNOPSIS
-.Ft struct zip_source *
-.Fn zip_source_filep "struct zip *archive" "FILE *file" \
+.Ft zip_source_t *
+.Fn zip_source_filep "zip_t *archive" "FILE *file" \
 "zip_uint64_t start" "zip_int64_t len"
+.Ft zip_source_t *
+.Fn zip_source_filep "FILE *file" \
+"zip_uint64_t start" "zip_int64_t len" "zip_error_t *error"
 .Sh DESCRIPTION
-The function
+The functions
 .Fn zip_source_filep
-creates a zip source from a file stream.
-.Fn zip_source_filep
-reads
+and
+.Fn zip_source_filep_create
+create a zip source from a file stream.
+They read
 .Ar len
 bytes from offset
 .Ar start
@@ -57,12 +61,16 @@ If
 is 0 or \-1, the whole file (starting from
 .Ar start )
 is used.
+.Pp
+If the file stream supports seeking, the source can be used to open a read-only zip archive from.
 .Sh RETURN VALUES
 Upon successful completion, the created source is returned.
 Otherwise,
 .Dv NULL
 is returned and the error code in
 .Ar archive
+or
+.Ar error
 is set to indicate the error.
 .Sh ERRORS
 .Fn zip_source_filep
@@ -81,13 +89,9 @@ Required memory could not be allocated.
 .Xr libzip 3 ,
 .Xr zip_add 3 ,
 .Xr zip_replace 3 ,
-.Xr zip_source_buffer 3 ,
-.Xr zip_source_file 3 ,
-.Xr zip_source_free 3 ,
-.Xr zip_source_function 3 ,
-.Xr zip_source_zip 3
+.Xr zip_source 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index e1e10f3..aad7711 100644 (file)
@@ -1,72 +1,39 @@
-.\" zip_source_free.mdoc \-- free zip data source
-.\" Copyright (C) 2004, 2005, 2006 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_SOURCE_FREE 3 "April 23, 2006" NiH
+.TH "ZIP_SOURCE_FREE" "3" "November 18, 2014" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_source_free \- free zip data source
+\fBzip_source_free\fP
+\- free zip data source
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 void
-zip_source_free(struct zip_source *source);
+zip_source_free zip_source_t *source
 .SH "DESCRIPTION"
 The function
 zip_source_free
-frees the zip data source
-\fBsource.\fR
+decrements the reference count of
+\fIsource\fP
+and frees it if the reference count drops to 0.
 If
-\fBsource\fR
+\fIsource\fP
 is
-\fBNULL,\fR
+\fRNULL\fP,
 it does nothing.
 .PP
-.I NOTE :
+\fINOTE\fP:
 This function should not be called on a
-\fBsource\fR
+\fIsource\fP
 after it was used successfully in a
-zip_add(3)
+zip_open_from_source(3),
+zip_add(3),
 or
 zip_replace(3)
 call.
 .SH "SEE ALSO"
 libzip(3),
-zip_source_buffer(3),
-zip_source_file(3),
-zip_source_filep(3),
-zip_source_function(3),
-zip_source_zip(3)
+zip_source(3),
+zip_source_keep(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index f631a2f..b7ea990 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_source_free.mdoc -- free zip data source
-.\" Copyright (C) 2004, 2005, 2006 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd April 23, 2006
+.Dd November 18, 2014
 .Dt ZIP_SOURCE_FREE 3
 .Os
 .Sh NAME
@@ -40,12 +40,13 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft void
-.Fn zip_source_free "struct zip_source *source"
+.Fn zip_source_free "zip_source_t *source"
 .Sh DESCRIPTION
 The function
 .Fn zip_source_free
-frees the zip data source
-.Ar source .
+decrements the reference count of
+.Ar source
+and frees it if the reference count drops to 0.
 If
 .Ar source
 is
@@ -56,19 +57,17 @@ it does nothing.
 This function should not be called on a
 .Ar source
 after it was used successfully in a
-.Xr zip_add 3
+.Xr zip_open_from_source 3 ,
+.Xr zip_add 3 ,
 or
 .Xr zip_replace 3
 call.
 .Sh SEE ALSO
 .Xr libzip 3 ,
-.Xr zip_source_buffer 3 ,
-.Xr zip_source_file 3 ,
-.Xr zip_source_filep 3 ,
-.Xr zip_source_function 3 ,
-.Xr zip_source_zip 3
+.Xr zip_source 3 ,
+.Xr zip_source_keep 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 1b7a19b..33624ba 100644 (file)
-.\" zip_source_function.mdoc \-- create data source from function
-.\" Copyright (C) 2004-2009 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_SOURCE_FUNCTION 3 "March 30, 2009" NiH
+.TH "ZIP_SOURCE_FUNCTION" "3" "November 13, 2014" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_source_function \- create data source from function
+\fBzip_source_function\fP
+\- create data source from function
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
-struct zip_source *
-zip_source_function(struct zip *archive, zip_source_callback fn, void *userdata);
+zip.h
+zip_source_t *
+zip_source_function zip_t *archive zip_source_callback fn void *userdata
+zip_source_t *
+zip_source_function_create zip_source_callback fn void *userdata zip_error_t *error
 .SH "DESCRIPTION"
-The function
+The functions
 zip_source_function
+and
+zip_source_function_create
 creates a zip source from the user-provided function
-\fBfn,\fR
+\fIfn\fP,
 which must be of the following type:
-.Bd \-literal
-typedef zip_int64_t (*zip_source_callback)(void *state,
-    void *data, zip_uint64_t len, enum zip_source_cmd cmd);
-.Ed
+.PP
+typedef zip_int64_t
+\fR(*\fPzip_source_callback\fR)\fP
+void *userdata void *data zip_uint64_t len zip_source_cmd_t cmd
+.PP
+\fIarchive\fP
+or
+\fIerror\fP
+are used for reporting errors and can be
+\fRNULL\fP.
 .PP
 When called by the library, the first argument is the
-\fBuserdata\fR
-argument supplied to
-zip_source_function.
+\fIuserdata\fP
+argument supplied to the function.
 The next two arguments are a buffer
-\fBdata\fR
+\fIdata\fP
 of size
-\fBlen\fR
-when data is expected to be returned, or else
-\fBNULL\fR
+\fIlen\fP
+when data is passed in or expected to be returned, or else
+\fRNULL\fP
 and 0.
 The last argument,
-\fBcmd,\fR
-specifies which action the function should perform:
-.RS
-.TP 21
-\fBZIP_SOURCE_OPEN\fR
-Prepare for reading.
-Return 0 on success, \-1 on error.
-.TP 21
-\fBZIP_SOURCE_READ\fR
-Read data into the buffer
-\fBdata\fR
-of size
-\fBlen.\fR
-Return the number of bytes placed into
-\fBdata\fR
-on success, \-1 on error.
-.TP 21
-\fBZIP_SOURCE_CLOSE\fR
+\fIcmd\fP,
+specifies which action the function should perform.
+.PP
+Depending on the uses, there are three useful sets of commands to be supported by a
+zip_source_callback:
+.TP seekable-read-sourceXX
+read source
+Providing streamed data (for file data added to archives).
+Must support
+\fRZIP_SOURCE_OPEN\fP,
+\fRZIP_SOURCE_READ\fP,
+\fRZIP_SOURCE_CLOSE\fP,
+\fRZIP_SOURCE_STAT\fP,
+and
+\fRZIP_SOURCE_ERROR\fP.
+.TP seekable-read-sourceXX
+seekable read source
+Same as previous, but from a source allowing reading from arbitrary
+offsets (also for read-only zip archive).
+Must additionally support
+\fRZIP_SOURCE_SEEK\fP,
+\fRZIP_SOURCE_TELL\fP,
+and
+\fRZIP_SOURCE_SUPPORTS\fP.
+.TP seekable-read-sourceXX
+read/write source
+Same as previous, but additionally allowing writing (also for writable
+zip archives).
+Must additionally support
+\fRZIP_SOURCE_BEGIN_WRITE\fP,
+\fRZIP_SOURCE_COMMIT_WRITE\fP,
+\fRZIP_SOURCE_ROLLBACK_WRITE\fP,
+\fRZIP_SOURCE_SEEK_WRITE\fP,
+\fRZIP_SOURCE_TELL_WRITE\fP,
+and
+\fRZIP_SOURCE_REMOVE\fP.
+.SS "\fRZIP_SOURCE_BEGIN_WRITE\fP"
+Prepare the source for writing.
+Use this to create any temporary file(s).
+.SS "\fRZIP_SOURCE_CLOSE\fP"
 Reading is done.
-Return 0.
-.TP 21
-\fBZIP_SOURCE_STAT\fR
-Get meta information for the input data.
-\fBdata\fR
-points to an initialized
-.Vt struct zip_stat,
-which should be filled in.
-(See
-zip_stat_init(3). )
-Information only available after the source has been read (e.g. size)
-can be omitted in an earlier call.
-Return sizeof(struct zip_stat) on success, \-1 on error.
-.TP 21
-\fBZIP_SOURCE_ERROR\fR
+.SS "\fRZIP_SOURCE_COMMIT_WRITE\fP"
+Finish writing to the source.
+Replace the original data with the newly written data.
+Clean up temporary files or internal buffers.
+Subsequently opening and reading from the source should return the
+newly written data.
+.SS "\fRZIP_SOURCE_ERROR\fP"
 Get error information.
-\fBdata\fR
+\fIdata\fP
 points to an array of two ints, which should be filled with the libzip
 error code and the corresponding system error code for the error that
 occurred.
 See
 zip_errors(3)
 for details on the error codes.
-Return return(2 * sizeof(int)).
-.TP 21
-\fBZIP_SOURCE_FREE\fR
-Clean up and free all resources.
-Return 0.
-.RE
+If the source stores error information in a zip_error_t, use
+zip_error_to_data(3)
+and return its return value.
+Otherwise, return 2 * sizeof(int).
+.SS "\fRZIP_SOURCE_FREE\fP"
+Clean up and free all resources, including
+\fIstate\fP.
+The callback function will not be called again.
+.SS "\fRZIP_SOURCE_OPEN\fP"
+Prepare for reading.
+.SS "\fRZIP_SOURCE_READ\fP"
+Read data into the buffer
+\fIdata\fP
+of size
+\fIlen\fP.
+Return the number of bytes placed into
+\fIdata\fP
+on success.
+.SS "\fRZIP_SOURCE_REMOVE\fP"
+Remove the underlying file.
+This is called if a zip archive is empty when closed.
+.SS "\fRZIP_SOURCE_ROLLBACK_WRITE\fP"
+Abort writing to the source.
+Discard written data.
+Clean up temporary files or internal buffers.
+Subsequently opening and reading from the source should return the
+original data.
+.SS "\fRZIP_SOURCE_SEEK\fP"
+Specify position to read next byte from, like
+fseek(3).
+Use
+ZIP_SOURCE_GET_ARGS(3)
+to decode the arguments into the following struct:
+.nf
+struct zip_source_args_seek {
+    zip_int64_t offset;
+    int whence;
+};
+.fi
 .PP
+If the size of the source's data is known, use
+zip_source_seek_compute_offset(3)
+to validate the arguments and compute the new offset.
+.SS "\fRZIP_SOURCE_SEEK_WRITE\fP"
+Specify position to write next byte to, like
+fseek(3).
+See
+\fRZIP_SOURCE_SEEK\fP
+for details.
+.SS "\fRZIP_SOURCE_STAT\fP"
+Get meta information for the input data.
+\fIdata\fP
+points to an allocated
+struct zip_stat,
+which should be initialized using
+zip_stat_init(3)
+and then filled in.
+Information only available after the source has been read (e.g. size)
+can be omitted in an earlier call.
+Return sizeof(struct zip_stat) on success.
+\fINOTE\fP:
+zip_source_function
+may be called with this argument even after being called with
+\fRZIP_SOURCE_CLOSE\fP.
+.SS "\fRZIP_SOURCE_SUPPORTS\fP"
+Return bitmap specifying which commands are supported.
+Use
+zip_source_make_command_bitmap(3).
+If this command is not implemented, the source is assumed to be a
+read source without seek support.
+.SS "\fRZIP_SOURCE_TELL\fP"
+Return the current read offset in the source, like
+ftell(3).
+.SS "\fRZIP_SOURCE_TELL_WRITE\fP"
+Return the current write offset in the source, like
+ftell(3).
+.SS "\fRZIP_SOURCE_WRITE\fP"
+Write data to the source.
+Return number of bytes written.
+.SS "Return Values"
+Commands should return \-1 on error.
+\fRZIP_SOURCE_ERROR\fP
+will be called to retrieve the error code.
+On success, commands return 0, unless specified otherwise in the
+description above.
+.SS "Calling Conventions"
 The library will always issue
-\fBZIP_SOURCE_OPEN\fR
+\fRZIP_SOURCE_OPEN\fP
 before issuing
-\fBZIP_SOURCE_READ.\fR
+\fRZIP_SOURCE_READ\fP,
+\fRZIP_SOURCE_SEEK\fP,
+or
+\fRZIP_SOURCE_TELL\fP.
 When it no longer wishes to read from this source, it will issue
-\fBZIP_SOURCE_CLOSE.\fR
+\fRZIP_SOURCE_CLOSE\fP.
 If the library wishes to read the data again, it will issue
-\fBZIP_SOURCE_OPEN\fR
+\fRZIP_SOURCE_OPEN\fP
 a second time.
 If the function is unable to provide the data again, it should
 return \-1.
 .PP
-\fBZIP_SOURCE_STAT\fR
+\fRZIP_SOURCE_BEGIN_WRITE\fP
+will be called before
+\fRZIP_SOURCE_WRITE\fP,
+\fRZIP_SOURCE_SEEK_WRITE\fP,
+or
+\fRZIP_SOURCE_TELL_WRITE\fP.
+When writing is complete, either
+\fRZIP_SOURCE_COMMIT_WRITE\fP
+or
+\fRZIP_SOURCE_ROLLBACK_WRITE\fP
+will be called.
+.PP
+\fRZIP_SOURCE_STAT\fP
 can be issued at any time.
-\fBZIP_SOURCE_ERROR\fR
+.PP
+\fRZIP_SOURCE_ERROR\fP
 will only be issued in response to the function
 returning \-1.
-\fBZIP_SOURCE_FREE\fR
+.PP
+\fRZIP_SOURCE_FREE\fP
 will be the last command issued;
 if
-\fBZIP_SOURCE_OPEN\fR
+\fRZIP_SOURCE_OPEN\fP
 was called and succeeded,
-\fBZIP_SOURCE_CLOSE\fR
+\fRZIP_SOURCE_CLOSE\fP
 will be called before
-\fBZIP_SOURCE_FREE.\fR
+\fRZIP_SOURCE_FREE\fP,
+and similarly for
+\fRZIP_SOURCE_BEGIN_WRITE\fP
+and
+\fRZIP_SOURCE_COMMIT_WRITE\fP
+or
+\fRZIP_SOURCE_ROLLBACK_WRITE\fP.
 .SH "RETURN VALUES"
 Upon successful completion, the created source is returned.
 Otherwise,
-\fBNULL\fR
+\fRNULL\fP
 is returned and the error code in
-\fBarchive\fR
-is set to indicate the error.
+\fIarchive\fP
+or
+\fIerror\fP
+is set to indicate the error (unless
+it is
+\fRNULL\fP).
 .SH "ERRORS"
 zip_source_function
 fails if:
-.RS
-.TP 4
-[ZIP_ER_MEMORY]
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
 Required memory could not be allocated.
-.RE
 .SH "SEE ALSO"
 libzip(3),
 zip_add(3),
 zip_replace(3),
-zip_source_buffer(3),
-zip_source_file(3),
-zip_source_filep(3),
-zip_source_free(3),
-zip_source_zip(3),
+zip_source(3),
 zip_stat_init(3)
 .SH "AUTHORS"
-
 Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 5fbfef8..ae8b865 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_source_function.mdoc -- create data source from function
-.\" Copyright (C) 2004-2009 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd March 30, 2009
+.Dd November 13, 2014
 .Dt ZIP_SOURCE_FUNCTION 3
 .Os
 .Sh NAME
 libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
-.Ft struct zip_source *
-.Fn zip_source_function "struct zip *archive" "zip_source_callback fn" "void *userdata"
+.Ft zip_source_t *
+.Fn zip_source_function "zip_t *archive" "zip_source_callback fn" "void *userdata"
+.Ft zip_source_t *
+.Fn zip_source_function_create "zip_source_callback fn" "void *userdata" "zip_error_t *error"
 .Sh DESCRIPTION
-The function
+The functions
 .Fn zip_source_function
+and
+.Fn zip_source_function_create
 creates a zip source from the user-provided function
 .Ar fn ,
 which must be of the following type:
-.Bd -literal
-typedef zip_int64_t (*zip_source_callback)(void *state,
-    void *data, zip_uint64_t len, enum zip_source_cmd cmd);
-.Ed
+.Pp
+.Ft typedef zip_int64_t
+.Fo \fR(*\fPzip_source_callback\fR)\fP
+.Fa "void *userdata" "void *data" "zip_uint64_t len" "zip_source_cmd_t cmd"
+.Fc
+.Pp
+.Ar archive
+or
+.Ar error
+are used for reporting errors and can be
+.Dv NULL .
 .Pp
 When called by the library, the first argument is the
 .Ar userdata
-argument supplied to
-.Fn zip_source_function .
+argument supplied to the function.
 The next two arguments are a buffer
 .Ar data
 of size
 .Ar len
-when data is expected to be returned, or else
+when data is passed in or expected to be returned, or else
 .Dv NULL
 and 0.
 The last argument,
 .Ar cmd ,
-specifies which action the function should perform:
-.Bl -tag -width XZIPXSOURCEXCLOSEXX -offset indent
-.It Dv ZIP_SOURCE_OPEN
+specifies which action the function should perform.
+.Pp
+Depending on the uses, there are three useful sets of commands to be supported by a
+.Fn zip_source_callback :
+.Bl -tag -width seekable-read-sourceXX
+.It read source
+Providing streamed data (for file data added to archives).
+Must support
+.Dv ZIP_SOURCE_OPEN ,
+.Dv ZIP_SOURCE_READ ,
+.Dv ZIP_SOURCE_CLOSE ,
+.Dv ZIP_SOURCE_STAT ,
+and
+.Dv ZIP_SOURCE_ERROR .
+.It seekable read source
+Same as previous, but from a source allowing reading from arbitrary
+offsets (also for read-only zip archive).
+Must additionally support
+.Dv ZIP_SOURCE_SEEK ,
+.Dv ZIP_SOURCE_TELL ,
+and
+.Dv ZIP_SOURCE_SUPPORTS .
+.It read/write source
+Same as previous, but additionally allowing writing (also for writable
+zip archives).
+Must additionally support
+.Dv ZIP_SOURCE_BEGIN_WRITE ,
+.Dv ZIP_SOURCE_COMMIT_WRITE ,
+.Dv ZIP_SOURCE_ROLLBACK_WRITE ,
+.Dv ZIP_SOURCE_SEEK_WRITE ,
+.Dv ZIP_SOURCE_TELL_WRITE ,
+and
+.Dv ZIP_SOURCE_REMOVE .
+.El
+.Ss Dv ZIP_SOURCE_BEGIN_WRITE
+Prepare the source for writing.
+Use this to create any temporary file(s).
+.Ss Dv ZIP_SOURCE_CLOSE
+Reading is done.
+.Ss Dv ZIP_SOURCE_COMMIT_WRITE
+Finish writing to the source.
+Replace the original data with the newly written data.
+Clean up temporary files or internal buffers.
+Subsequently opening and reading from the source should return the
+newly written data.
+.Ss Dv ZIP_SOURCE_ERROR
+Get error information.
+.Ar data
+points to an array of two ints, which should be filled with the libzip
+error code and the corresponding system error code for the error that
+occurred.
+See
+.Xr zip_errors 3
+for details on the error codes.
+If the source stores error information in a zip_error_t, use
+.Xr zip_error_to_data 3
+and return its return value.
+Otherwise, return 2 * sizeof(int).
+.Ss Dv ZIP_SOURCE_FREE
+Clean up and free all resources, including
+.Ar state .
+The callback function will not be called again.
+.Ss Dv ZIP_SOURCE_OPEN
 Prepare for reading.
-Return 0 on success, \-1 on error.
-.It Dv ZIP_SOURCE_READ
+.Ss Dv ZIP_SOURCE_READ
 Read data into the buffer
 .Ar data
 of size
 .Ar len .
 Return the number of bytes placed into
 .Ar data
-on success, \-1 on error.
-.It Dv ZIP_SOURCE_CLOSE
-Reading is done.
-Return 0.
-.It Dv ZIP_SOURCE_STAT
+on success.
+.Ss Dv ZIP_SOURCE_REMOVE
+Remove the underlying file.
+This is called if a zip archive is empty when closed.
+.Ss Dv ZIP_SOURCE_ROLLBACK_WRITE
+Abort writing to the source.
+Discard written data.
+Clean up temporary files or internal buffers.
+Subsequently opening and reading from the source should return the
+original data.
+.Ss Dv ZIP_SOURCE_SEEK
+Specify position to read next byte from, like
+.Xr fseek 3 .
+Use
+.Xr ZIP_SOURCE_GET_ARGS 3
+to decode the arguments into the following struct:
+.Bd -literal
+struct zip_source_args_seek {
+    zip_int64_t offset;
+    int whence;
+};
+.Ed
+.Pp
+If the size of the source's data is known, use
+.Xr zip_source_seek_compute_offset 3
+to validate the arguments and compute the new offset.
+.Ss Dv ZIP_SOURCE_SEEK_WRITE
+Specify position to write next byte to, like
+.Xr fseek 3 .
+See
+.Dv ZIP_SOURCE_SEEK
+for details.
+.Ss Dv ZIP_SOURCE_STAT
 Get meta information for the input data.
 .Ar data
-points to an initialized
+points to an allocated
 .Vt struct zip_stat ,
-which should be filled in.
-(See
-.Xr zip_stat_init 3 . )
+which should be initialized using
+.Xr zip_stat_init 3
+and then filled in.
 Information only available after the source has been read (e.g. size)
 can be omitted in an earlier call.
-Return sizeof(struct zip_stat) on success, \-1 on error.
-.It Dv ZIP_SOURCE_ERROR
-Get error information.
-.Ar data
-points to an array of two ints, which should be filled with the libzip
-error code and the corresponding system error code for the error that
-occurred.
-See
-.Xr zip_errors 3
-for details on the error codes.
-Return return(2 * sizeof(int)).
-.It Dv ZIP_SOURCE_FREE
-Clean up and free all resources.
-Return 0.
-.El
-.Pp
+Return sizeof(struct zip_stat) on success.
+.Em NOTE :
+.Fn zip_source_function
+may be called with this argument even after being called with
+.Dv ZIP_SOURCE_CLOSE .
+.Ss Dv ZIP_SOURCE_SUPPORTS
+Return bitmap specifying which commands are supported.
+Use
+.Xr zip_source_make_command_bitmap 3 .
+If this command is not implemented, the source is assumed to be a
+read source without seek support.
+.Ss Dv ZIP_SOURCE_TELL
+Return the current read offset in the source, like
+.Xr ftell 3 .
+.Ss Dv ZIP_SOURCE_TELL_WRITE
+Return the current write offset in the source, like
+.Xr ftell 3 .
+.Ss Dv ZIP_SOURCE_WRITE
+Write data to the source.
+Return number of bytes written.
+.Ss Return Values
+Commands should return \-1 on error.
+.Dv ZIP_SOURCE_ERROR
+will be called to retrieve the error code.
+On success, commands return 0, unless specified otherwise in the
+description above.
+.Ss Calling Conventions
 The library will always issue
 .Dv ZIP_SOURCE_OPEN
 before issuing
-.Dv ZIP_SOURCE_READ .
+.Dv ZIP_SOURCE_READ ,
+.Dv ZIP_SOURCE_SEEK ,
+or
+.Dv ZIP_SOURCE_TELL .
 When it no longer wishes to read from this source, it will issue
 .Dv ZIP_SOURCE_CLOSE .
 If the library wishes to read the data again, it will issue
@@ -119,11 +230,26 @@ a second time.
 If the function is unable to provide the data again, it should
 return \-1.
 .Pp
+.Dv ZIP_SOURCE_BEGIN_WRITE
+will be called before
+.Dv ZIP_SOURCE_WRITE ,
+.Dv ZIP_SOURCE_SEEK_WRITE ,
+or
+.Dv ZIP_SOURCE_TELL_WRITE .
+When writing is complete, either
+.Dv ZIP_SOURCE_COMMIT_WRITE
+or
+.Dv ZIP_SOURCE_ROLLBACK_WRITE
+will be called.
+.Dv
+.Pp
 .Dv ZIP_SOURCE_STAT
 can be issued at any time.
+.Pp
 .Dv ZIP_SOURCE_ERROR
 will only be issued in response to the function
 returning \-1.
+.Pp
 .Dv ZIP_SOURCE_FREE
 will be the last command issued;
 if
@@ -131,14 +257,24 @@ if
 was called and succeeded,
 .Dv ZIP_SOURCE_CLOSE
 will be called before
-.Dv ZIP_SOURCE_FREE .
+.Dv ZIP_SOURCE_FREE ,
+and similarly for
+.Dv ZIP_SOURCE_BEGIN_WRITE
+and
+.Dv ZIP_SOURCE_COMMIT_WRITE
+or
+.Dv ZIP_SOURCE_ROLLBACK_WRITE .
 .Sh RETURN VALUES
 Upon successful completion, the created source is returned.
 Otherwise,
 .Dv NULL
 is returned and the error code in
 .Ar archive
-is set to indicate the error.
+or
+.Ar error
+is set to indicate the error (unless
+it is
+.Dv NULL ) .
 .Sh ERRORS
 .Fn zip_source_function
 fails if:
@@ -150,14 +286,10 @@ Required memory could not be allocated.
 .Xr libzip 3 ,
 .Xr zip_add 3 ,
 .Xr zip_replace 3 ,
-.Xr zip_source_buffer 3 ,
-.Xr zip_source_file 3 ,
-.Xr zip_source_filep 3 ,
-.Xr zip_source_free 3 ,
-.Xr zip_source_zip 3 ,
+.Xr zip_source 3 ,
 .Xr zip_stat_init 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@nih.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_is_deleted.man b/man/zip_source_is_deleted.man
new file mode 100644 (file)
index 0000000..bd05bd9
--- /dev/null
@@ -0,0 +1,25 @@
+.TH "ZIP_SOURCE_IS_DELETED" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_is_deleted\fP
+\- check if zip_source is deleted
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_source_is_deleted zip_source_t *source
+.SH "DESCRIPTION"
+The function
+zip_source_is_deleted
+returns whether the zip_source was deleted.
+This can for example happen when all entries are removed from a zip archive.
+.SH "RETURN VALUES"
+zip_source_is_deleted
+returns 1 if the zip_source is deleted and 0 otherwise.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_is_deleted.mdoc b/man/zip_source_is_deleted.mdoc
new file mode 100644 (file)
index 0000000..0399b9a
--- /dev/null
@@ -0,0 +1,59 @@
+.\" zip_source_is_deleted.mdoc -- check if zip source is deleted
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_IS_DELETED 3
+.Os
+.Sh NAME
+.Nm zip_source_is_deleted
+.Nd check if zip_source is deleted
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_source_is_deleted "zip_source_t *source"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_is_deleted
+returns whether the zip_source was deleted.
+This can for example happen when all entries are removed from a zip archive.
+.Sh RETURN VALUES
+.Fn zip_source_is_deleted
+returns 1 if the zip_source is deleted and 0 otherwise.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_keep.man b/man/zip_source_keep.man
new file mode 100644 (file)
index 0000000..4f15fe2
--- /dev/null
@@ -0,0 +1,23 @@
+.TH "ZIP_SOURCE_KEEP" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_keep\fP
+\- increment reference count of zip data source
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+void
+zip_source_keep zip_source_t *source
+.SH "DESCRIPTION"
+The function
+zip_source_keep
+increments the reference count of
+\fIsource\fP.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3),
+zip_source_free(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_keep.mdoc b/man/zip_source_keep.mdoc
new file mode 100644 (file)
index 0000000..f7a2a3c
--- /dev/null
@@ -0,0 +1,57 @@
+.\" zip_source_keep.mdoc -- increment reference count of zip data source
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_KEEP 3
+.Os
+.Sh NAME
+.Nm zip_source_keep
+.Nd increment reference count of zip data source
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft void
+.Fn zip_source_keep "zip_source_t *source"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_keep
+increments the reference count of
+.Ar source .
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_free 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_make_command_bitmap.man b/man/zip_source_make_command_bitmap.man
new file mode 100644 (file)
index 0000000..9862da7
--- /dev/null
@@ -0,0 +1,25 @@
+.TH "ZIP_SOURCE_MAKE_COMMAND_BITMAP" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_make_command_bitmap\fP
+\- create bitmap of supported source operations
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_int64_t
+zip_source_make_command_bitmap zip_source_cmd_t command ...
+.SH "DESCRIPTION"
+The
+zip_source_make_command_bitmap
+function returns a bitmap of source commands suitable as return value
+for
+\fRZIP_SOURCE_SUPPORTS\fP.
+It includes all the commands from the argument list, which must be
+terminated by \-1.
+.SH "SEE ALSO"
+libzip(3),
+zip_source_function(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_make_command_bitmap.mdoc b/man/zip_source_make_command_bitmap.mdoc
new file mode 100644 (file)
index 0000000..6ec9fd6
--- /dev/null
@@ -0,0 +1,59 @@
+.\" zip_source_make_command_bitmap -- create bitmap of supported source operations
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_MAKE_COMMAND_BITMAP 3
+.Os
+.Sh NAME
+.Nm zip_source_make_command_bitmap
+.Nd create bitmap of supported source operations
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft zip_int64_t
+.Fn zip_source_make_command_bitmap "zip_source_cmd_t command" "..."
+.Sh DESCRIPTION
+The
+.Fn zip_source_make_command_bitmap
+function returns a bitmap of source commands suitable as return value
+for
+.Dv ZIP_SOURCE_SUPPORTS .
+It includes all the commands from the argument list, which must be
+terminated by \-1.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source_function 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_open.man b/man/zip_source_open.man
new file mode 100644 (file)
index 0000000..f9b7fa5
--- /dev/null
@@ -0,0 +1,33 @@
+.TH "ZIP_SOURCE_OPEN" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_open\fP
+\- open zip_source for reading
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_source_open zip_source_t *source
+.SH "DESCRIPTION"
+The function
+zip_source_open
+opens
+source
+for reading.
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+\fIsource\fP
+is set to indicate the error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3),
+zip_source_begin_write(3),
+zip_source_close(3),
+zip_source_read(3),
+zip_source_seek(3),
+zip_source_tell(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_open.mdoc b/man/zip_source_open.mdoc
new file mode 100644 (file)
index 0000000..4bd5c60
--- /dev/null
@@ -0,0 +1,67 @@
+.\" zip_source_open.mdoc -- open zip source for reading
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_OPEN 3
+.Os
+.Sh NAME
+.Nm zip_source_open
+.Nd open zip_source for reading
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_source_open "zip_source_t *source"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_open
+opens
+.Fa source
+for reading.
+.Sh RETURN VALUES
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar source
+is set to indicate the error.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_begin_write 3 ,
+.Xr zip_source_close 3 ,
+.Xr zip_source_read 3 ,
+.Xr zip_source_seek 3 ,
+.Xr zip_source_tell 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_read.man b/man/zip_source_read.man
new file mode 100644 (file)
index 0000000..924e1ab
--- /dev/null
@@ -0,0 +1,40 @@
+.TH "ZIP_SOURCE_READ" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_read\fP
+\- read data from zip source
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_int64_t
+zip_source_read zip_source_t *source void *data zip_uint64_t len
+.SH "DESCRIPTION"
+The function
+zip_source_read
+reads up to
+\fIlen\fP
+bytes of data from
+\fIsource\fP
+at the current read offset into the buffer
+\fIdata\fP.
+.PP
+The zip source
+\fIsource\fP
+has to be opened for reading by calling
+zip_source_open(3)
+first.
+.SH "RETURN VALUES"
+Upon successful completion the number of bytes read is returned.
+Otherwise, \-1 is returned and the error information in
+\fIsource\fP
+is set to indicate the error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3),
+zip_source_seek(3),
+zip_source_tell(3),
+zip_source_write(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_read.mdoc b/man/zip_source_read.mdoc
new file mode 100644 (file)
index 0000000..c9a29b9
--- /dev/null
@@ -0,0 +1,74 @@
+.\" zip_source_read.mdoc -- read data from zip source
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_READ 3
+.Os
+.Sh NAME
+.Nm zip_source_read
+.Nd read data from zip source
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft zip_int64_t
+.Fn zip_source_read "zip_source_t *source" "void *data" "zip_uint64_t len"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_read
+reads up to
+.Ar len
+bytes of data from
+.Ar source
+at the current read offset into the buffer
+.Ar data .
+.Pp
+The zip source
+.Ar source
+has to be opened for reading by calling
+.Xr zip_source_open 3
+first.
+.Sh RETURN VALUES
+Upon successful completion the number of bytes read is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar source
+is set to indicate the error.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_seek 3 ,
+.Xr zip_source_tell 3 ,
+.Xr zip_source_write 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_rollback_write.man b/man/zip_source_rollback_write.man
new file mode 100644 (file)
index 0000000..368ec58
--- /dev/null
@@ -0,0 +1,36 @@
+.TH "ZIP_SOURCE_ROLLBACK_WRITE" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_rollback_write\fP
+\- undo changes to zip source
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_source_rollback_write zip_source_t *source
+.SH "DESCRIPTION"
+The function
+zip_source_rollback_write
+reverts changes written to
+source,
+restoring the data before
+zip_source_begin_write(3)
+was called.
+Usually this removes temporary files or frees buffers.
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+\fIsource\fP
+is set to indicate the error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3),
+zip_source_begin_write(3),
+zip_source_commit_write(3),
+zip_source_seek_write(3),
+zip_source_tell_write(3),
+zip_source_write(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_rollback_write.mdoc b/man/zip_source_rollback_write.mdoc
new file mode 100644 (file)
index 0000000..47079ca
--- /dev/null
@@ -0,0 +1,70 @@
+.\" zip_source_rollback_write.mdoc -- undo changes to zip source
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_ROLLBACK_WRITE 3
+.Os
+.Sh NAME
+.Nm zip_source_rollback_write
+.Nd undo changes to zip source
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_source_rollback_write "zip_source_t *source"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_rollback_write
+reverts changes written to
+.Fa source ,
+restoring the data before 
+.Xr zip_source_begin_write 3
+was called.
+Usually this removes temporary files or frees buffers.
+.Sh RETURN VALUES
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar source
+is set to indicate the error.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_begin_write 3 ,
+.Xr zip_source_commit_write 3 ,
+.Xr zip_source_seek_write 3 ,
+.Xr zip_source_tell_write 3 ,
+.Xr zip_source_write 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_seek.man b/man/zip_source_seek.man
new file mode 100644 (file)
index 0000000..8aa0e26
--- /dev/null
@@ -0,0 +1,45 @@
+.TH "ZIP_SOURCE_SEEK" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_seek\fP
+\- set read offset in zip source
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_source_seek zip_source_t *source zip_int64_t offset int whence
+.SH "DESCRIPTION"
+The function
+zip_source_seek
+sets the current read offset for
+source.
+Just like in
+fseek(3),
+depending on the
+\fIwhence\fP
+argument, the
+\fIoffset\fP
+is counted relative from:
+.TP SEEK_CURXX
+\fRSEEK_SET\fP
+start of file
+.TP SEEK_CURXX
+\fRSEEK_CUR\fP
+current read offset in file
+.TP SEEK_CURXX
+\fRSEEK_END\fP
+end of file
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+\fIsource\fP
+is set to indicate the error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3),
+zip_source_read(3),
+zip_source_tell(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_seek.mdoc b/man/zip_source_seek.mdoc
new file mode 100644 (file)
index 0000000..f6c3881
--- /dev/null
@@ -0,0 +1,78 @@
+.\" zip_source_seek.mdoc -- set read offset in source
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_SEEK 3
+.Os
+.Sh NAME
+.Nm zip_source_seek
+.Nd set read offset in zip source
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_source_seek "zip_source_t *source" "zip_int64_t offset" "int whence"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_seek
+sets the current read offset for
+.Fa source .
+Just like in
+.Xr fseek 3 ,
+depending on the
+.Ar whence
+argument, the
+.Ar offset
+is counted relative from:
+.Bl -tag -width SEEK_CURXX -offset indent
+.It Dv SEEK_SET
+start of file
+.It Dv SEEK_CUR
+current read offset in file
+.It Dv SEEK_END
+end of file
+.El
+.Sh RETURN VALUES
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar source
+is set to indicate the error.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_read 3 ,
+.Xr zip_source_tell 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_seek_compute_offset.man b/man/zip_source_seek_compute_offset.man
new file mode 100644 (file)
index 0000000..4aeca6b
--- /dev/null
@@ -0,0 +1,43 @@
+.TH "ZIP_SOURCE_SEEK_COMPUTE_OFFSET" "1" "November 13, 2014" "NiH" "LOCAL"
+.SH "NAME"
+\fBzip_source_seek_compute_offset\fP
+\- validate arguments and compute offset
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_int64_t
+zip_source_seek_compute_offset zip_uint64_t offset zip_uint64_t length void *data zip_uint64_t data_length zip_error_t *error
+.SH "DESCRIPTION"
+Use this function to compute the offset for a
+\fRZIP_SOURCE_SEEK\fP
+or
+\fRZIP_SOURCE_SEEK_WRITE\fP
+command.
+\fIdata\fP
+and
+\fIdata_length\fP
+are the arguments to the source callback,
+\fIoffset\fP
+is the current offset and
+\fIlength\fP
+is the length of the source data or, for
+\fRZIP_SOURCE_SEEK_WRITE\fP,
+the amount of data written.
+.SH "RETURN VALUES"
+On success, it returns the new offset, on error it returns \-1 and
+sets
+\fIerror\fP.
+.SH "ERRORS"
+zip_source_seek_compute_offset
+fails if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+One of the arguments is invalid or the seek would place the offset
+outside the data.
+.SH "SEE ALSO"
+zip_source_function(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_seek_compute_offset.mdoc b/man/zip_source_seek_compute_offset.mdoc
new file mode 100644 (file)
index 0000000..66e5c32
--- /dev/null
@@ -0,0 +1,78 @@
+.\" zip_source_seek_compute_offset.mdoc - validate arguments and compute offset
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 13, 2014
+.Dt ZIP_SOURCE_SEEK_COMPUTE_OFFSET
+.Os
+.Sh NAME
+.Nm zip_source_seek_compute_offset
+.Nd validate arguments and compute offset
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft zip_int64_t
+.Fn zip_source_seek_compute_offset "zip_uint64_t offset" "zip_uint64_t length" "void *data" "zip_uint64_t data_length" "zip_error_t *error"
+.Sh DESCRIPTION
+Use this function to compute the offset for a
+.Dv ZIP_SOURCE_SEEK
+or
+.Dv ZIP_SOURCE_SEEK_WRITE
+command.
+.Ar data
+and
+.Ar data_length
+are the arguments to the source callback,
+.Ar offset
+is the current offset and
+.Ar length
+is the length of the source data or, for
+.Dv ZIP_SOURCE_SEEK_WRITE ,
+the amount of data written.
+.Sh RETURN VALUES
+On success, it returns the new offset, on error it returns \-1 and
+sets
+.Ar error .
+.Sh ERRORS
+.Fn zip_source_seek_compute_offset
+fails if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_INVAL
+One of the arguments is invalid or the seek would place the offset
+outside the data.
+.El
+.Sh SEE ALSO
+.Xr zip_source_function 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_seek_write.man b/man/zip_source_seek_write.man
new file mode 100644 (file)
index 0000000..0df0483
--- /dev/null
@@ -0,0 +1,48 @@
+.TH "ZIP_SOURCE_SEEK_WRITE" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_seek_write\fP
+\- set write offset in zip source
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_source_seek_write zip_source_t *source zip_int64_t offset int whence
+.SH "DESCRIPTION"
+The function
+zip_source_seek_write
+sets the current write offset for
+source.
+Just like in
+fseek(3),
+depending on the
+\fIwhence\fP
+argument, the
+\fIoffset\fP
+is counted relative from:
+.TP SEEK_CURXX
+\fRSEEK_SET\fP
+start of file
+.TP SEEK_CURXX
+\fRSEEK_CUR\fP
+current write offset in file
+.TP SEEK_CURXX
+\fRSEEK_END\fP
+end of file
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+\fIsource\fP
+is set to indicate the error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3),
+zip_source_begin_write(3),
+zip_source_commit_write(3),
+zip_source_rollback_write(3),
+zip_source_tell_write(3),
+zip_source_write(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_seek_write.mdoc b/man/zip_source_seek_write.mdoc
new file mode 100644 (file)
index 0000000..720f75a
--- /dev/null
@@ -0,0 +1,81 @@
+.\" zip_source_seek_write.mdoc -- set write offset in source
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_SEEK_WRITE 3
+.Os
+.Sh NAME
+.Nm zip_source_seek_write
+.Nd set write offset in zip source
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_source_seek_write "zip_source_t *source" "zip_int64_t offset" "int whence"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_seek_write
+sets the current write offset for
+.Fa source .
+Just like in
+.Xr fseek 3 ,
+depending on the
+.Ar whence
+argument, the
+.Ar offset
+is counted relative from:
+.Bl -tag -width SEEK_CURXX -offset indent
+.It Dv SEEK_SET
+start of file
+.It Dv SEEK_CUR
+current write offset in file
+.It Dv SEEK_END
+end of file
+.El
+.Sh RETURN VALUES
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar source
+is set to indicate the error.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_begin_write 3 ,
+.Xr zip_source_commit_write 3 ,
+.Xr zip_source_rollback_write 3 ,
+.Xr zip_source_tell_write 3 ,
+.Xr zip_source_write 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_stat.man b/man/zip_source_stat.man
new file mode 100644 (file)
index 0000000..057c897
--- /dev/null
@@ -0,0 +1,95 @@
+.TH "ZIP_SOURCE_STAT" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_stat\fP
+\- get information about zip_source
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+int
+zip_source_stat zip_source_t *source zip_stat_t *sb
+.SH "DESCRIPTION"
+The
+zip_source_stat
+function obtains information about the zip source
+\fIsource\fP
+.PP
+The
+\fIsb\fP
+argument is a pointer to a
+struct zip_source_stat
+(shown below), into which information about the zip source is placed.
+.nf
+struct zip_source_stat {
+    zip_uint64_t valid;                 /* which fields have valid values */
+    const char *name;                   /* name of the file */
+    zip_uint64_t index;                 /* index within archive */
+    zip_uint64_t size;                  /* size of file (uncompressed) */
+    zip_uint64_t comp_size;             /* size of file (compressed) */
+    time_t mtime;                       /* modification time */
+    zip_uint32_t crc;                   /* crc of file data */
+    zip_uint16_t comp_method;           /* compression method used */
+    zip_uint16_t encryption_method;     /* encryption method used */
+    zip_uint32_t flags;                 /* reserved for future use */
+};
+.fi
+The structure pointed to by
+\fIsb\fP
+must be initialized with
+zip_stat_init 3
+before calling
+zip_source_stat.
+.PP
+The
+\fIvalid\fP
+field of the structure specifies which other fields are valid.
+Check if the flag defined by the following defines are in
+\fIvalid\fP
+before accessing the fields:
+.TP ZIP_SOURCE_STAT_ENCRYPTION_METHODXX
+\fRZIP_SOURCE_STAT_NAME\fP
+\fIname\fP
+.TP ZIP_SOURCE_STAT_ENCRYPTION_METHODXX
+\fRZIP_SOURCE_STAT_INDEX\fP
+\fIindex\fP
+.TP ZIP_SOURCE_STAT_ENCRYPTION_METHODXX
+\fRZIP_SOURCE_STAT_SIZE\fP
+\fIsize\fP
+.TP ZIP_SOURCE_STAT_ENCRYPTION_METHODXX
+\fRZIP_SOURCE_STAT_COMP_SIZE\fP
+\fIcomp_size\fP
+.TP ZIP_SOURCE_STAT_ENCRYPTION_METHODXX
+\fRZIP_SOURCE_STAT_MTIME\fP
+\fImtime\fP
+.TP ZIP_SOURCE_STAT_ENCRYPTION_METHODXX
+\fRZIP_SOURCE_STAT_CRC\fP
+\fIcrc\fP
+.TP ZIP_SOURCE_STAT_ENCRYPTION_METHODXX
+\fRZIP_SOURCE_STAT_COMP_METHOD\fP
+\fIcomp_method\fP
+.TP ZIP_SOURCE_STAT_ENCRYPTION_METHODXX
+\fRZIP_SOURCE_STAT_ENCRYPTION_METHOD\fP
+\fIencryption_method\fP
+.TP ZIP_SOURCE_STAT_ENCRYPTION_METHODXX
+\fRZIP_SOURCE_STAT_FLAGS\fP
+\fIflags\fP
+.PP
+\fINOTE\fP:
+Some fields may only be filled out after all data has been read from
+the source, for example the
+\fIcrc\fP
+or
+\fIsize\fP
+fields.
+.SH "RETURN VALUES"
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+\fIsource\fP
+is set to indicate the error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_stat.mdoc b/man/zip_source_stat.mdoc
new file mode 100644 (file)
index 0000000..cb68b73
--- /dev/null
@@ -0,0 +1,122 @@
+.\" zip_source_stat.mdoc -- get information about zip source
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_STAT 3
+.Os
+.Sh NAME
+.Nm zip_source_stat
+.Nd get information about zip_source
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft int
+.Fn zip_source_stat "zip_source_t *source" "zip_stat_t *sb"
+.Sh DESCRIPTION
+The
+.Fn zip_source_stat
+function obtains information about the zip source
+.Ar source
+.Pp
+The
+.Ar sb
+argument is a pointer to a
+.Ft struct zip_source_stat
+(shown below), into which information about the zip source is placed.
+.Bd -literal
+struct zip_source_stat {
+    zip_uint64_t valid;                 /* which fields have valid values */
+    const char *name;                   /* name of the file */
+    zip_uint64_t index;                 /* index within archive */
+    zip_uint64_t size;                  /* size of file (uncompressed) */
+    zip_uint64_t comp_size;             /* size of file (compressed) */
+    time_t mtime;                       /* modification time */
+    zip_uint32_t crc;                   /* crc of file data */
+    zip_uint16_t comp_method;           /* compression method used */
+    zip_uint16_t encryption_method;     /* encryption method used */
+    zip_uint32_t flags;                 /* reserved for future use */
+};
+.Ed
+The structure pointed to by
+.Ar sb
+must be initialized with
+.Fn zip_stat_init 3
+before calling
+.Fn zip_source_stat .
+.Pp
+The
+.Ar valid
+field of the structure specifies which other fields are valid.
+Check if the flag defined by the following defines are in
+.Ar valid
+before accessing the fields:
+.Bl -tag -width ZIP_SOURCE_STAT_ENCRYPTION_METHODXX -compact -offset indent
+.It Dv ZIP_SOURCE_STAT_NAME
+.Ar name
+.It Dv ZIP_SOURCE_STAT_INDEX
+.Ar index
+.It Dv ZIP_SOURCE_STAT_SIZE
+.Ar size
+.It Dv ZIP_SOURCE_STAT_COMP_SIZE
+.Ar comp_size
+.It Dv ZIP_SOURCE_STAT_MTIME
+.Ar mtime
+.It Dv ZIP_SOURCE_STAT_CRC
+.Ar crc
+.It Dv ZIP_SOURCE_STAT_COMP_METHOD
+.Ar comp_method
+.It Dv ZIP_SOURCE_STAT_ENCRYPTION_METHOD
+.Ar encryption_method
+.It Dv ZIP_SOURCE_STAT_FLAGS
+.Ar flags
+.El
+.Pp
+.Em NOTE :
+Some fields may only be filled out after all data has been read from
+the source, for example the
+.Ar crc
+or
+.Ar size
+fields.
+.Sh RETURN VALUES
+Upon successful completion 0 is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar source
+is set to indicate the error.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_tell.man b/man/zip_source_tell.man
new file mode 100644 (file)
index 0000000..8b25e8b
--- /dev/null
@@ -0,0 +1,37 @@
+.TH "ZIP_SOURCE_TELL" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_tell\fP
+\- report current read offset in zip source
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_int64_t
+zip_source_tell zip_source_t *source
+.SH "DESCRIPTION"
+The function
+zip_source_tell
+returns the current read offset
+for
+source.
+The return value can be passed to
+zip_source_seek(3)
+with
+\fIwhence\fP
+set to
+\fRSEEK_SET\fP
+to return to the same location in the source.
+.SH "RETURN VALUES"
+Upon successful completion the current read offset is returned.
+Otherwise, \-1 is returned and the error information in
+\fIsource\fP
+is set to indicate the error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3),
+zip_source_read(3),
+zip_source_tell(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_tell.mdoc b/man/zip_source_tell.mdoc
new file mode 100644 (file)
index 0000000..b26122c
--- /dev/null
@@ -0,0 +1,71 @@
+.\" zip_source_tell.mdoc -- report current read offset in source
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_TELL 3
+.Os
+.Sh NAME
+.Nm zip_source_tell
+.Nd report current read offset in zip source
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft zip_int64_t
+.Fn zip_source_tell "zip_source_t *source"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_tell
+returns the current read offset
+for
+.Fa source .
+The return value can be passed to
+.Xr zip_source_seek 3
+with
+.Ar whence
+set to
+.Dv SEEK_SET
+to return to the same location in the source.
+.Sh RETURN VALUES
+Upon successful completion the current read offset is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar source
+is set to indicate the error.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_read 3 ,
+.Xr zip_source_tell 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_tell_write.man b/man/zip_source_tell_write.man
new file mode 100644 (file)
index 0000000..95433d0
--- /dev/null
@@ -0,0 +1,40 @@
+.TH "ZIP_SOURCE_TELL_WRITE" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_tell_write\fP
+\- report current write offset in zip source
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_int64_t
+zip_source_tell_write zip_source_t *source
+.SH "DESCRIPTION"
+The function
+zip_source_tell_write
+returns the current write offset
+for
+source.
+The return value can be passed to
+zip_source_seek_write(3)
+with
+\fIwhence\fP
+set to
+\fRSEEK_SET\fP
+to return to the same location in the source.
+.SH "RETURN VALUES"
+Upon successful completion the current write offset is returned.
+Otherwise, \-1 is returned and the error information in
+\fIsource\fP
+is set to indicate the error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3),
+zip_source_begin_write(3),
+zip_source_commit_write(3),
+zip_source_rollback_write(3),
+zip_source_tell_write(3),
+zip_source_write(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_tell_write.mdoc b/man/zip_source_tell_write.mdoc
new file mode 100644 (file)
index 0000000..0bc6783
--- /dev/null
@@ -0,0 +1,74 @@
+.\" zip_source_tell_write.mdoc -- report current write offset in source
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_TELL_WRITE 3
+.Os
+.Sh NAME
+.Nm zip_source_tell_write
+.Nd report current write offset in zip source
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft zip_int64_t
+.Fn zip_source_tell_write "zip_source_t *source"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_tell_write
+returns the current write offset
+for
+.Fa source .
+The return value can be passed to
+.Xr zip_source_seek_write 3
+with
+.Ar whence
+set to
+.Dv SEEK_SET
+to return to the same location in the source.
+.Sh RETURN VALUES
+Upon successful completion the current write offset is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar source
+is set to indicate the error.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_begin_write 3 ,
+.Xr zip_source_commit_write 3 ,
+.Xr zip_source_rollback_write 3 ,
+.Xr zip_source_tell_write 3 ,
+.Xr zip_source_write 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_win32a.man b/man/zip_source_win32a.man
new file mode 100644 (file)
index 0000000..69857a4
--- /dev/null
@@ -0,0 +1,77 @@
+.TH "ZIP_SOURCE_WIN32A" "3" "March 11, 2015" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_win32a\fP,
+\fBzip_source_win32a_create\fP
+\- create data source from a Windows ANSI file name
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip_source_t *
+zip_source_win32a zip_t *archive const char *fname zip_uint64_t start zip_int64_t len
+zip_source_t *
+zip_source_win32a_create const char *fname zip_uint64_t start zip_int64_t len zip_error_t *error
+.SH "DESCRIPTION"
+The functions
+zip_source_win32a
+and
+zip_source_win32a_create
+create a zip source on Windows using a Windows ANSI name.
+They open
+\fIfname\fP
+and read
+\fIlen\fP
+bytes from offset
+\fIstart\fP
+from it.
+If
+\fIlen\fP
+is 0 or \-1, the whole file (starting from
+\fIstart\fP)
+is used.
+.PP
+If the file supports seek, the source can be used to open a zip archive from.
+.PP
+The file is opened and read when the data from the source is used, usually by
+zip_close
+or
+zip_open_from_source.
+.SH "RETURN VALUES"
+Upon successful completion, the created source is returned.
+Otherwise,
+\fRNULL\fP
+is returned and the error code in
+\fIarchive\fP
+or
+\fIerror\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_source_win32a
+and
+zip_source_win32a_create
+fail if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIfname\fP,
+\fIstart\fP,
+or
+\fIlen\fP
+are invalid.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
+Required memory could not be allocated.
+.TP 17n
+[\fRZIP_ER_OPEN\fP]
+Opening
+\fIfname\fP
+failed.
+.SH "SEE ALSO"
+libzip(3),
+zip_add(3),
+zip_replace(3),
+zip_source(3),
+zip_source_win32handle(3),
+zip_source_win32w(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_win32a.mdoc b/man/zip_source_win32a.mdoc
new file mode 100644 (file)
index 0000000..32e4214
--- /dev/null
@@ -0,0 +1,112 @@
+.\" zip_source_win32a.mdoc -- create data source using a win32 ANSI name
+.\" Copyright (C) 2015 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd March 11, 2015
+.Dt ZIP_SOURCE_WIN32A 3
+.Os
+.Sh NAME
+.Nm zip_source_win32a ,
+.Nm zip_source_win32a_create
+.Nd create data source from a Windows ANSI file name
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.Ft zip_source_t *
+.Fn zip_source_win32a "zip_t *archive" "const char *fname" \
+"zip_uint64_t start" "zip_int64_t len"
+.Ft zip_source_t *
+.Fn zip_source_win32a_create "const char *fname" \
+"zip_uint64_t start" "zip_int64_t len" "zip_error_t *error"
+.Sh DESCRIPTION
+The functions
+.Fn zip_source_win32a
+and
+.Fn zip_source_win32a_create
+create a zip source on Windows using a Windows ANSI name.
+They open
+.Ar fname
+and read
+.Ar len
+bytes from offset
+.Ar start
+from it.
+If
+.Ar len
+is 0 or \-1, the whole file (starting from
+.Ar start )
+is used.
+.Pp
+If the file supports seek, the source can be used to open a zip archive from.
+.Pp
+The file is opened and read when the data from the source is used, usually by
+.Fn zip_close
+or
+.Fn zip_open_from_source .
+.Sh RETURN VALUES
+Upon successful completion, the created source is returned.
+Otherwise,
+.Dv NULL
+is returned and the error code in
+.Ar archive
+or
+.Ar error
+is set to indicate the error.
+.Sh ERRORS
+.Fn zip_source_win32a
+and
+.Fn zip_source_win32a_create
+fail if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_INVAL
+.Ar fname ,
+.Ar start ,
+or
+.Ar len
+are invalid.
+.It Bq Er ZIP_ER_MEMORY
+Required memory could not be allocated.
+.It Bq Er ZIP_ER_OPEN
+Opening
+.Ar fname
+failed.
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_add 3 ,
+.Xr zip_replace 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_win32handle 3 ,
+.Xr zip_source_win32w 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_win32handle.man b/man/zip_source_win32handle.man
new file mode 100644 (file)
index 0000000..fdf2028
--- /dev/null
@@ -0,0 +1,77 @@
+.TH "ZIP_SOURCE_WIN32HANDLE" "3" "March 11, 2015" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_win32handle\fP,
+\fBzip_source_win32handle_create\fP
+\- create data source from a Windows file handle
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip_source_t *
+zip_source_win32handle zip_t *archive HANDLE h zip_uint64_t start zip_int64_t len
+zip_source_t *
+zip_source_win32handle_create HANDLE h zip_uint64_t start zip_int64_t len zip_error_t *error
+.SH "DESCRIPTION"
+The functions
+zip_source_win32handle
+and
+zip_source_win32handle_create
+create a zip source from a Windows file handle.
+They open
+\fIfname\fP
+and read
+\fIlen\fP
+bytes from offset
+\fIstart\fP
+from it.
+If
+\fIlen\fP
+is 0 or \-1, the whole file (starting from
+\fIstart\fP)
+is used.
+.PP
+If the file supports seek, the source can be used to open a zip archive from.
+.PP
+The file is opened and read when the data from the source is used, usually by
+zip_close
+or
+zip_open_from_source.
+.SH "RETURN VALUES"
+Upon successful completion, the created source is returned.
+Otherwise,
+\fRNULL\fP
+is returned and the error code in
+\fIarchive\fP
+or
+\fIerror\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_source_w32handle
+and
+zip_source_w32handle_create
+fail if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIfname\fP,
+\fIstart\fP,
+or
+\fIlen\fP
+are invalid.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
+Required memory could not be allocated.
+.TP 17n
+[\fRZIP_ER_OPEN\fP]
+Opening
+\fIfname\fP
+failed.
+.SH "SEE ALSO"
+libzip(3),
+zip_add(3),
+zip_replace(3),
+zip_source(3),
+zip_source_win32a(3),
+zip_source_win32w(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_win32handle.mdoc b/man/zip_source_win32handle.mdoc
new file mode 100644 (file)
index 0000000..dc93c88
--- /dev/null
@@ -0,0 +1,112 @@
+.\" zip_source_handle.mdoc -- create data source from a Windows file handle
+.\" Copyright (C) 2015 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd March 11, 2015
+.Dt ZIP_SOURCE_WIN32HANDLE 3
+.Os
+.Sh NAME
+.Nm zip_source_win32handle ,
+.Nm zip_source_win32handle_create
+.Nd create data source from a Windows file handle
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.Ft zip_source_t *
+.Fn zip_source_win32handle "zip_t *archive" "HANDLE h" \
+"zip_uint64_t start" "zip_int64_t len"
+.Ft zip_source_t *
+.Fn zip_source_win32handle_create "HANDLE h" \
+"zip_uint64_t start" "zip_int64_t len" "zip_error_t *error"
+.Sh DESCRIPTION
+The functions
+.Fn zip_source_win32handle
+and
+.Fn zip_source_win32handle_create
+create a zip source from a Windows file handle.
+They open
+.Ar fname
+and read
+.Ar len
+bytes from offset
+.Ar start
+from it.
+If
+.Ar len
+is 0 or \-1, the whole file (starting from
+.Ar start )
+is used.
+.Pp
+If the file supports seek, the source can be used to open a zip archive from.
+.Pp
+The file is opened and read when the data from the source is used, usually by
+.Fn zip_close
+or
+.Fn zip_open_from_source .
+.Sh RETURN VALUES
+Upon successful completion, the created source is returned.
+Otherwise,
+.Dv NULL
+is returned and the error code in
+.Ar archive
+or
+.Ar error
+is set to indicate the error.
+.Sh ERRORS
+.Fn zip_source_w32handle
+and
+.Fn zip_source_w32handle_create
+fail if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_INVAL
+.Ar fname ,
+.Ar start ,
+or
+.Ar len
+are invalid.
+.It Bq Er ZIP_ER_MEMORY
+Required memory could not be allocated.
+.It Bq Er ZIP_ER_OPEN
+Opening
+.Ar fname
+failed.
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_add 3 ,
+.Xr zip_replace 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_win32a 3 ,
+.Xr zip_source_win32w 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_win32w.man b/man/zip_source_win32w.man
new file mode 100644 (file)
index 0000000..38026ee
--- /dev/null
@@ -0,0 +1,77 @@
+.TH "ZIP_SOURCE_WIN32W" "3" "March 11, 2015" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_win32w\fP,
+\fBzip_source_win32w_create\fP
+\- create data source from a Windows Unicode file name
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip_source_t *
+zip_source_win32w zip_t *archive const char *fname zip_uint64_t start zip_int64_t len
+zip_source_t *
+zip_source_win32w_create const char *fname zip_uint64_t start zip_int64_t len zip_error_t *error
+.SH "DESCRIPTION"
+The functions
+zip_source_win32w
+and
+zip_source_win32w_create
+create a zip source on Windows using a Windows Unicode name.
+They open
+\fIfname\fP
+and read
+\fIlen\fP
+bytes from offset
+\fIstart\fP
+from it.
+If
+\fIlen\fP
+is 0 or \-1, the whole file (starting from
+\fIstart\fP)
+is used.
+.PP
+If the file supports seek, the source can be used to open a zip archive from.
+.PP
+The file is opened and read when the data from the source is used, usually by
+zip_close
+or
+zip_open_from_source.
+.SH "RETURN VALUES"
+Upon successful completion, the created source is returned.
+Otherwise,
+\fRNULL\fP
+is returned and the error code in
+\fIarchive\fP
+or
+\fIerror\fP
+is set to indicate the error.
+.SH "ERRORS"
+zip_source_win32w
+and
+zip_source_win32w_create
+fail if:
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIfname\fP,
+\fIstart\fP,
+or
+\fIlen\fP
+are invalid.
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
+Required memory could not be allocated.
+.TP 17n
+[\fRZIP_ER_OPEN\fP]
+Opening
+\fIfname\fP
+failed.
+.SH "SEE ALSO"
+libzip(3),
+zip_add(3),
+zip_replace(3),
+zip_source(3),
+zip_source_win32a(3),
+zip_source_win32handle(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_win32w.mdoc b/man/zip_source_win32w.mdoc
new file mode 100644 (file)
index 0000000..9fe4121
--- /dev/null
@@ -0,0 +1,112 @@
+.\" zip_source_win32w.mdoc -- create data source using a win32 Unicode name
+.\" Copyright (C) 2015 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd March 11, 2015
+.Dt ZIP_SOURCE_WIN32W 3
+.Os
+.Sh NAME
+.Nm zip_source_win32w ,
+.Nm zip_source_win32w_create
+.Nd create data source from a Windows Unicode file name
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.Ft zip_source_t *
+.Fn zip_source_win32w "zip_t *archive" "const char *fname" \
+"zip_uint64_t start" "zip_int64_t len"
+.Ft zip_source_t *
+.Fn zip_source_win32w_create "const char *fname" \
+"zip_uint64_t start" "zip_int64_t len" "zip_error_t *error"
+.Sh DESCRIPTION
+The functions
+.Fn zip_source_win32w
+and
+.Fn zip_source_win32w_create
+create a zip source on Windows using a Windows Unicode name.
+They open
+.Ar fname
+and read
+.Ar len
+bytes from offset
+.Ar start
+from it.
+If
+.Ar len
+is 0 or \-1, the whole file (starting from
+.Ar start )
+is used.
+.Pp
+If the file supports seek, the source can be used to open a zip archive from.
+.Pp
+The file is opened and read when the data from the source is used, usually by
+.Fn zip_close
+or
+.Fn zip_open_from_source .
+.Sh RETURN VALUES
+Upon successful completion, the created source is returned.
+Otherwise,
+.Dv NULL
+is returned and the error code in
+.Ar archive
+or
+.Ar error
+is set to indicate the error.
+.Sh ERRORS
+.Fn zip_source_win32w
+and
+.Fn zip_source_win32w_create
+fail if:
+.Bl -tag -width Er
+.It Bq Er ZIP_ER_INVAL
+.Ar fname ,
+.Ar start ,
+or
+.Ar len
+are invalid.
+.It Bq Er ZIP_ER_MEMORY
+Required memory could not be allocated.
+.It Bq Er ZIP_ER_OPEN
+Opening
+.Ar fname
+failed.
+.El
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_add 3 ,
+.Xr zip_replace 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_win32a 3 ,
+.Xr zip_source_win32handle 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/man/zip_source_write.man b/man/zip_source_write.man
new file mode 100644 (file)
index 0000000..f44c204
--- /dev/null
@@ -0,0 +1,43 @@
+.TH "ZIP_SOURCE_WRITE" "3" "November 18, 2014" "NiH" "Library Functions Manual"
+.SH "NAME"
+\fBzip_source_write\fP
+\- write data to zip source
+.SH "LIBRARY"
+libzip (-lzip)
+.SH "SYNOPSIS"
+zip.h
+zip_int64_t
+zip_source_write zip_source_t *source const void *data zip_uint64_t len
+.SH "DESCRIPTION"
+The function
+zip_source_write
+writes
+\fIlen\fP
+bytes from the buffer
+\fIdata\fP
+to the zip source
+\fIsource\fP
+at the current write offset.
+.PP
+The zip source
+\fIsource\fP
+has to be prepared for writing by calling
+zip_source_begin_write(3)
+first.
+.SH "RETURN VALUES"
+Upon successful completion the number of bytes written is returned.
+Otherwise, \-1 is returned and the error information in
+\fIsource\fP
+is set to indicate the error.
+.SH "SEE ALSO"
+libzip(3),
+zip_source(3),
+zip_source_begin_write(3),
+zip_source_commit_write(3),
+zip_source_rollback_write(3),
+zip_source_seek_write(3),
+zip_source_tell_write(3)
+.SH "AUTHORS"
+Dieter Baron <dillo@nih.at>
+and
+Thomas Klausner <tk@giga.or.at>
diff --git a/man/zip_source_write.mdoc b/man/zip_source_write.mdoc
new file mode 100644 (file)
index 0000000..b7e7962
--- /dev/null
@@ -0,0 +1,77 @@
+.\" zip_source_write.mdoc -- write data to zip source
+.\" Copyright (C) 2014 Dieter Baron and Thomas Klausner
+.\"
+.\" This file is part of libzip, a library to manipulate ZIP archives.
+.\" The authors can be contacted at <libzip@nih.at>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\" 3. The names of the authors may not be used to endorse or promote
+.\"    products derived from this software without specific prior
+.\"    written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 18, 2014
+.Dt ZIP_SOURCE_WRITE 3
+.Os
+.Sh NAME
+.Nm zip_source_write
+.Nd write data to zip source
+.Sh LIBRARY
+libzip (-lzip)
+.Sh SYNOPSIS
+.In zip.h
+.Ft zip_int64_t
+.Fn zip_source_write "zip_source_t *source" "const void *data" "zip_uint64_t len"
+.Sh DESCRIPTION
+The function
+.Fn zip_source_write
+writes
+.Ar len
+bytes from the buffer
+.Ar data
+to the zip source
+.Ar source
+at the current write offset.
+.Pp
+The zip source
+.Ar source
+has to be prepared for writing by calling
+.Xr zip_source_begin_write 3
+first.
+.Sh RETURN VALUES
+Upon successful completion the number of bytes written is returned.
+Otherwise, \-1 is returned and the error information in
+.Ar source
+is set to indicate the error.
+.Sh SEE ALSO
+.Xr libzip 3 ,
+.Xr zip_source 3 ,
+.Xr zip_source_begin_write 3 ,
+.Xr zip_source_commit_write 3 ,
+.Xr zip_source_rollback_write 3 ,
+.Xr zip_source_seek_write 3 ,
+.Xr zip_source_tell_write 3
+.Sh AUTHORS
+.An -nosplit
+.An Dieter Baron Aq Mt dillo@nih.at
+and
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 5e484b4..525057c 100644 (file)
-.\" zip_source_zip.mdoc \-- create data source from zip file
-.\" Copyright (C) 2004, 2005, 2008 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_SOURCE_ZIP 3 "June 4, 2008" NiH
+.TH "ZIP_SOURCE_ZIP" "3" "August 2, 2014" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_source_zip \- create data source from zip file
+\fBzip_source_zip\fP
+\- create data source from zip file
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
-struct zip_source *
-zip_source_zip(struct zip *archive, struct zip *srcarchive); \
-"zip_uint64_t srcidx" "int flags" "zip_uint64_t start" "zip_int64_t len"
+zip.h
+zip_source_t *
+zip_source_zip zip_t *archive zip_t *srcarchive zip_uint64_t srcidx zip_flags_t flags zip_uint64_t start zip_int64_t len
 .SH "DESCRIPTION"
 The function
 zip_source_zip
 creates a zip source from a file in a zip archive.
 The
-\fBsrcarchive\fR
+\fIsrcarchive\fP
 argument is the (open) zip archive containing the source zip file
 at index
-\fBsrcidx.\fR
-\fBlen\fR
+\fIsrcidx\fP.
+\fIlen\fP
 bytes from offset
-\fBstart\fR
+\fIstart\fP
 will be used in the zip_source.
 If
-\fBlen\fR
+\fIlen\fP
 is 0 or \-1, the rest of the file, starting from
-\fBstart,\fR
+\fIstart\fP,
 is used.
 If
-\fBstart\fR
+\fIstart\fP
 is zero and
-\fBlen\fR
+\fIlen\fP
 is \-1, the whole file will be copied without decompressing it.
 .PP
 Supported flags are:
-.RS
-.TP 23
-\fBZIP_FL_UNCHANGED\fR
+.TP XZIPXFLXRECOMPRESSXXX
+\fRZIP_FL_UNCHANGED\fP
 Try to get the original data without any changes that may have been
 made to
-\fBsrcarchive\fR
+\fIsrcarchive\fP
 after opening it.
-.TP 23
-\fBZIP_FL_RECOMPRESS\fR
+.TP XZIPXFLXRECOMPRESSXXX
+\fRZIP_FL_RECOMPRESS\fP
 When adding the data from
-\fBsrcarchive,\fR
+\fIsrcarchive\fP,
 re-compress it using the current settings instead of copying the
 compressed data.
-.RE
 .SH "RETURN VALUES"
 Upon successful completion, the created source is returned.
 Otherwise,
-\fBNULL\fR
+\fRNULL\fP
 is returned and the error code in
-\fBarchive\fR
+\fIarchive\fP
 is set to indicate the error.
 .SH "ERRORS"
 zip_source_zip
 fails if:
-.RS
-.TP 4
-[ZIP_ER_CHANGED]
+.TP 17n
+[\fRZIP_ER_CHANGED\fP]
 Unchanged data was requested, but it is not available.
-.TP 4
-[ZIP_ER_INVAL]
-\fBsrcarchive,\fR
-\fBsrcidx,\fR
-\fBstart,\fR
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIsrcarchive\fP,
+\fIsrcidx\fP,
+\fIstart\fP,
 or
-\fBlen\fR
+\fIlen\fP
 are invalid.
-.TP 4
-[ZIP_ER_MEMORY]
+.TP 17n
+[\fRZIP_ER_MEMORY\fP]
 Required memory could not be allocated.
-.RE
 Additionally, it can return all error codes from
 zip_stat_index
 and
@@ -113,13 +77,8 @@ zip_fopen_index.
 libzip(3),
 zip_add(3),
 zip_replace(3),
-zip_source_buffer(3),
-zip_source_file(3),
-zip_source_filep(3),
-zip_source_free(3),
-zip_source_function(3)
+zip_source(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 8169a0c..ce03220 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_source_zip.mdoc -- create data source from zip file
-.\" Copyright (C) 2004, 2005, 2008 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd June 4, 2008
+.Dd August 2, 2014
 .Dt ZIP_SOURCE_ZIP 3
 .Os
 .Sh NAME
@@ -39,9 +39,9 @@
 libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
-.Ft struct zip_source *
-.Fn zip_source_zip "struct zip *archive" "struct zip *srcarchive" \
-"zip_uint64_t srcidx" "int flags" "zip_uint64_t start" "zip_int64_t len"
+.Ft zip_source_t *
+.Fn zip_source_zip "zip_t *archive" "zip_t *srcarchive" \
+"zip_uint64_t srcidx" "zip_flags_t flags" "zip_uint64_t start" "zip_int64_t len"
 .Sh DESCRIPTION
 The function
 .Fn zip_source_zip
@@ -110,13 +110,9 @@ and
 .Xr libzip 3 ,
 .Xr zip_add 3 ,
 .Xr zip_replace 3 ,
-.Xr zip_source_buffer 3 ,
-.Xr zip_source_file 3 ,
-.Xr zip_source_filep 3 ,
-.Xr zip_source_free 3 ,
-.Xr zip_source_function 3
+.Xr zip_source 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index ff5cf99..e4a3f6b 100644 (file)
@@ -1,79 +1,46 @@
-.\" zip_stat.mdoc \-- get information about file
-.\" Copyright (C) 2003-2011 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_STAT 3 "February 14, 2011" NiH
+.TH "ZIP_STAT" "3" "July 22, 2012" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_stat , \- .Nm zip_stat_index
-get information about file
+\fBzip_stat\fP,
+\fBzip_stat_index\fP
+\- get information about file
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_stat(struct zip *archive, const char *fname, int flags, struct zip_stat *sb);
-.PP
+zip_stat zip_t *archive const char *fname zip_flags_t flags zip_stat_t *sb
 int
-zip_stat_index(struct zip *archive, int index, int flags, struct zip_stat *sb);
+zip_stat_index zip_t *archive int index zip_flags_t flags zip_stat_t *sb
 .SH "DESCRIPTION"
 The
 zip_stat
 function obtains information about the file named
-\fBfname\fR
+\fIfname\fP
 in
-\fBarchive.\fR
+\fIarchive\fP.
 The
-\fBflags\fR
+\fIflags\fP
 argument specifies how the name lookup should be done.
 Its values are described in
 zip_name_locate(3).
 Also,
-\fBZIP_FL_UNCHANGED\fR
+\fRZIP_FL_UNCHANGED\fP
 may be
-.I or'ed
+\fIor\fP'ed
 to it to request information about the original file in the archive,
 ignoring any changes made.
 .PP
 The
 zip_stat_index
 function obtains information about the file at position
-\fBindex.\fR
+\fIindex\fP.
 .PP
 The
-\fBsb\fR
+\fIsb\fP
 argument is a pointer to a
-.PP
 struct zip_stat
 (shown below), into which information about the file is placed.
-.Bd \-literal
+.nf
 struct zip_stat {
     zip_uint64_t valid;                 /* which fields have valid values */
     const char *name;                   /* name of the file */
@@ -86,53 +53,51 @@ struct zip_stat {
     zip_uint16_t encryption_method;     /* encryption method used */
     zip_uint32_t flags;                 /* reserved for future use */
 };
-.Ed
+.fi
 The structure pointed to by
-\fBsb\fR
+\fIsb\fP
 must be allocated before calling
 zip_stat
 or
 zip_stat_index.
 .PP
 The
-\fBvalid\fR
+\fIvalid\fP
 field of the structure specifies which other fields are valid.
 Check if the flag defined by the following defines are in
-\fBvalid\fR
+\fIvalid\fP
 before accessing the fields:
-.RS
-.TP 30
-ZIP_STAT_NAME
-\fBname\fR
-.TP 30
-ZIP_STAT_INDEX
-\fBindex\fR
-.TP 30
-ZIP_STAT_SIZE
-\fBsize\fR
-.TP 30
-ZIP_STAT_COMP_SIZE
-\fBcomp_size\fR
-.TP 30
-ZIP_STAT_MTIME
-\fBmtime\fR
-.TP 30
-ZIP_STAT_CRC
-\fBcrc\fR
-.TP 30
-ZIP_STAT_COMP_METHOD
-\fBcomp_method\fR
-.TP 30
-ZIP_STAT_ENCRYPTION_METHOD
-\fBencryption_method\fR
-.TP 30
-ZIP_STAT_FLAGS
-\fBflags\fR
-.RE
+.TP ZIP_STAT_ENCRYPTION_METHODXX
+\fRZIP_STAT_NAME\fP
+\fIname\fP
+.TP ZIP_STAT_ENCRYPTION_METHODXX
+\fRZIP_STAT_INDEX\fP
+\fIindex\fP
+.TP ZIP_STAT_ENCRYPTION_METHODXX
+\fRZIP_STAT_SIZE\fP
+\fIsize\fP
+.TP ZIP_STAT_ENCRYPTION_METHODXX
+\fRZIP_STAT_COMP_SIZE\fP
+\fIcomp_size\fP
+.TP ZIP_STAT_ENCRYPTION_METHODXX
+\fRZIP_STAT_MTIME\fP
+\fImtime\fP
+.TP ZIP_STAT_ENCRYPTION_METHODXX
+\fRZIP_STAT_CRC\fP
+\fIcrc\fP
+.TP ZIP_STAT_ENCRYPTION_METHODXX
+\fRZIP_STAT_COMP_METHOD\fP
+\fIcomp_method\fP
+.TP ZIP_STAT_ENCRYPTION_METHODXX
+\fRZIP_STAT_ENCRYPTION_METHOD\fP
+\fIencryption_method\fP
+.TP ZIP_STAT_ENCRYPTION_METHODXX
+\fRZIP_STAT_FLAGS\fP
+\fIflags\fP
 .SH "RETURN VALUES"
 Upon successful completion 0 is returned.
 Otherwise, \-1 is returned and the error information in
-\fBarchive\fR
+\fIarchive\fP
 is set to indicate the error.
 .SH "ERRORS"
 The function
@@ -143,22 +108,21 @@ zip_name_locate(3).
 The function
 zip_stat_index
 fails and sets the error information to
-ZIP_ER_INVAL
+\fRZIP_ER_INVAL\fP
 if
-\fBindex\fR
+\fIindex\fP
 is invalid.
 If
-\fBZIP_FL_UNCHANGED\fR
+\fRZIP_FL_UNCHANGED\fP
 is not set and no information can be obtained from the source
 callback, the error information is set to
-ZIP_ER_CHANGED.
+\fRZIP_ER_CHANGED\fP.
 .SH "SEE ALSO"
 libzip(3),
 zip_get_num_entries(3),
 zip_name_locate(3),
 zip_stat_init(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 3d4db87..3858bf6 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_stat.mdoc -- get information about file
-.\" Copyright (C) 2003-2011 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 14, 2011
+.Dd July 22, 2012
 .Dt ZIP_STAT 3
 .Os
 .Sh NAME
@@ -41,9 +41,9 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_stat "struct zip *archive" "const char *fname" "int flags" "struct zip_stat *sb"
+.Fn zip_stat "zip_t *archive" "const char *fname" "zip_flags_t flags" "zip_stat_t *sb"
 .Ft int
-.Fn zip_stat_index "struct zip *archive" "int index" "int flags" "struct zip_stat *sb"
+.Fn zip_stat_index "zip_t *archive" "int index" "zip_flags_t flags" "zip_stat_t *sb"
 .Sh DESCRIPTION
 The
 .Fn zip_stat
@@ -101,23 +101,23 @@ Check if the flag defined by the following defines are in
 .Ar valid
 before accessing the fields:
 .Bl -tag -width ZIP_STAT_ENCRYPTION_METHODXX -compact -offset indent
-.It ZIP_STAT_NAME
+.It Dv ZIP_STAT_NAME
 .Ar name
-.It ZIP_STAT_INDEX
+.It Dv ZIP_STAT_INDEX
 .Ar index
-.It ZIP_STAT_SIZE
+.It Dv ZIP_STAT_SIZE
 .Ar size
-.It ZIP_STAT_COMP_SIZE
+.It Dv ZIP_STAT_COMP_SIZE
 .Ar comp_size
-.It ZIP_STAT_MTIME
+.It Dv ZIP_STAT_MTIME
 .Ar mtime
-.It ZIP_STAT_CRC
+.It Dv ZIP_STAT_CRC
 .Ar crc
-.It ZIP_STAT_COMP_METHOD
+.It Dv ZIP_STAT_COMP_METHOD
 .Ar comp_method
-.It ZIP_STAT_ENCRYPTION_METHOD
+.It Dv ZIP_STAT_ENCRYPTION_METHOD
 .Ar encryption_method
-.It ZIP_STAT_FLAGS
+.It Dv ZIP_STAT_FLAGS
 .Ar flags
 .El
 .Sh RETURN VALUES
@@ -150,6 +150,6 @@ callback, the error information is set to
 .Xr zip_stat_init 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 4eccda5..22246e5 100644 (file)
@@ -1,44 +1,13 @@
-.\" zip_stat_init.mdoc \-- init zip_stat structure
-.\" Copyright (C) 2006-2008 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_STAT_INIT 3 "November 10, 2008" NiH
+.TH "ZIP_STAT_INIT" "3" "September 22, 2013" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_stat_init \- initialize zip_stat structure
+\fBzip_stat_init\fP
+\- initialize zip_stat structure
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 void
-zip_stat_init(struct zip_stat *sb);
+zip_stat_init zip_stat_t *sb
 .SH "DESCRIPTION"
 The
 zip_stat_init
@@ -48,18 +17,23 @@ zip_stat(3),
 but this function should be used to initialize it to
 make sure none are missed.
 The structure pointed to by
-\fBsb\fR
+\fIsb\fP
 must be allocated before calling
 zip_stat_init.
+.PP
+This function should be used by functions provided to
+zip_source_function(3)
+when returning
+\fRZIP_SOURCE_STAT\fP
+information to make sure all fields are initialized.
 .SH "RETURN VALUES"
 If
-\fBsb\fR
+\fIsb\fP
 is valid, the function is always successful.
 .SH "SEE ALSO"
 libzip(3),
 zip_stat(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 6ad7134..f6e26d6 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_stat_init.mdoc -- init zip_stat structure
-.\" Copyright (C) 2006-2008 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd November 10, 2008
+.Dd September 22, 2013
 .Dt ZIP_STAT_INIT 3
 .Os
 .Sh NAME
@@ -40,7 +40,7 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft void
-.Fn zip_stat_init "struct zip_stat *sb"
+.Fn zip_stat_init "zip_stat_t *sb"
 .Sh DESCRIPTION
 The
 .Fn zip_stat_init
@@ -53,6 +53,12 @@ The structure pointed to by
 .Ar sb
 must be allocated before calling
 .Fn zip_stat_init .
+.Pp
+This function should be used by functions provided to
+.Xr zip_source_function 3
+when returning
+.Dv ZIP_SOURCE_STAT
+information to make sure all fields are initialized.
 .Sh RETURN VALUES
 If
 .Ar sb
@@ -62,6 +68,6 @@ is valid, the function is always successful.
 .Xr zip_stat 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 3db8e41..6e1f25f 100644 (file)
@@ -1,72 +1,38 @@
-.\" zip_unchange.mdoc \-- undo changes to file in zip archive
-.\" Copyright (C) 2003, 2005, 2006 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_UNCHANGE 3 "April 23, 2006" NiH
+.TH "ZIP_UNCHANGE" "3" "April 23, 2006" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_unchange \- undo changes to file in zip archive
+\fBzip_unchange\fP
+\- undo changes to file in zip archive
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_unchange(struct zip *archive, int index);
+zip_unchange zip_t *archive int index
 .SH "DESCRIPTION"
 Changes to the file at position
-\fBindex\fR
+\fIindex\fP
 are reverted.
 .SH "RETURN VALUES"
 Upon successful completion 0 is returned.
 Otherwise, \-1 is returned and the error code in
-\fBarchive\fR
+\fIarchive\fP
 is set to indicate the error.
 .SH "ERRORS"
 zip_unchange
 fails if:
-.RS
-.TP 4
-[ZIP_ER_EXISTS]
+.TP 17n
+[\fRZIP_ER_EXISTS\fP]
 Unchanging the name would result in a duplicate name in the archive.
-.TP 4
-[ZIP_ER_INVAL]
-\fBindex\fR
+.TP 17n
+[\fRZIP_ER_INVAL\fP]
+\fIindex\fP
 is not a valid file index in
-\fBzip.\fR
-.RE
+\fIzip\fP.
 .SH "SEE ALSO"
 libzip(3),
 zip_unchange_all(3),
 zip_unchange_archive(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 4eed1b2..3a28824 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_unchange.mdoc -- undo changes to file in zip archive
-.\" Copyright (C) 2003, 2005, 2006 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -40,7 +40,7 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_unchange "struct zip *archive" "int index"
+.Fn zip_unchange "zip_t *archive" "int index"
 .Sh DESCRIPTION
 Changes to the file at position
 .Ar index
@@ -67,6 +67,6 @@ is not a valid file index in
 .Xr zip_unchange_archive 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 44ed043..190ea72 100644 (file)
@@ -1,59 +1,27 @@
-.\" zip_unchange_all.mdoc \-- undo changes to all files in zip archive
-.\" Copyright (C) 2003, 2005, 2006 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_UNCHANGE_ALL 3 "April 23, 2006" NiH
+.TH "ZIP_UNCHANGE_ALL" "3" "April 23, 2006" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_unchange_all \- undo all changes in a zip archive
+\fBzip_unchange_all\fP
+\- undo all changes in a zip archive
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_unchange_all(struct zip *archive);
+zip_unchange_all zip_t *archive
 .SH "DESCRIPTION"
 All changes to files and global information in
-\fBarchive\fR
+\fIarchive\fP
 are reverted.
 .SH "RETURN VALUES"
 Upon successful completion 0 is returned.
 Otherwise, \-1 is returned and the error code in
-\fBarchive\fR
+\fIarchive\fP
 is set to indicate the error.
 .SH "SEE ALSO"
 libzip(3),
 zip_unchange(3),
 zip_unchange_archive(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index efab2e8..103e60f 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_unchange_all.mdoc -- undo changes to all files in zip archive
-.\" Copyright (C) 2003, 2005, 2006 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -40,7 +40,7 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_unchange_all "struct zip *archive"
+.Fn zip_unchange_all "zip_t *archive"
 .Sh DESCRIPTION
 All changes to files and global information in
 .Ar archive
@@ -56,6 +56,6 @@ is set to indicate the error.
 .Xr zip_unchange_archive 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 772ae0e..97a763b 100644 (file)
@@ -1,59 +1,27 @@
-.\" zip_unchange_archive.mdoc \-- undo changes to all files in zip archive
-.\" Copyright (C) 2006-2008 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIP_UNCHANGE_ARCHIVE 3 "May 14, 2008" NiH
+.TH "ZIP_UNCHANGE_ARCHIVE" "3" "May 14, 2008" "NiH" "Library Functions Manual"
 .SH "NAME"
-zip_unchange_archive \- undo global changes to zip archive
+\fBzip_unchange_archive\fP
+\- undo global changes to zip archive
 .SH "LIBRARY"
 libzip (-lzip)
 .SH "SYNOPSIS"
-#include <zip.h>
-.PP
+zip.h
 int
-zip_unchange_archive(struct zip *archive);
+zip_unchange_archive zip_t *archive
 .SH "DESCRIPTION"
 Revert all global changes to the archive
-\fBarchive.\fR
+\fIarchive\fP.
 This reverts changes to the archive comment and global flags.
 .SH "RETURN VALUES"
 Upon successful completion 0 is returned.
 Otherwise, \-1 is returned and the error code in
-\fBarchive\fR
+\fIarchive\fP
 is set to indicate the error.
 .SH "SEE ALSO"
 libzip(3),
 zip_unchange(3),
 zip_unchange_all(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 753448a..d9ad9dc 100644 (file)
@@ -1,5 +1,5 @@
 .\" zip_unchange_archive.mdoc -- undo changes to all files in zip archive
-.\" Copyright (C) 2006-2008 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2006-2014 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -40,7 +40,7 @@ libzip (-lzip)
 .Sh SYNOPSIS
 .In zip.h
 .Ft int
-.Fn zip_unchange_archive "struct zip *archive"
+.Fn zip_unchange_archive "zip_t *archive"
 .Sh DESCRIPTION
 Revert all global changes to the archive
 .Ar archive .
@@ -56,6 +56,6 @@ is set to indicate the error.
 .Xr zip_unchange_all 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index ee3e09d..46ca08d 100644 (file)
@@ -1,83 +1,57 @@
-.\" zipcmp.mdoc \-- compare zip archives
-.\" Copyright (C) 2003, 2005, 2008 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIPCMP 1 "June 4, 2008" NiH
+.TH "ZIPCMP" "1" "April 29, 2015" "NiH" "General Commands Manual"
 .SH "NAME"
-zipcmp \- compare contents of zip archives
+\fBzipcmp\fP
+\- compare contents of zip archives
 .SH "SYNOPSIS"
-.B zipcmp
-[\fB-hiqVv\fR]
-\fBzip1 zip2\fR
+\fBzipcmp\fP
+[\fB-hipqtVv\fP]
+\fIarchive1 archive2\fP
 .SH "DESCRIPTION"
-.B zipcmp
-compares the zip archives
-\fBzip1\fR
+\fBzipcmp\fP
+compares the zip archives or directories
+\fIarchive1\fP
 and
-\fBzip2\fR
+\fIarchive2\fP
 and checks if they contain the same files, comparing their names,
 uncompressed sizes, and CRCs.
 File order and compressed size differences are ignored.
 .PP
 Supported options:
-.RS
-.TP 5
-\fB-h\fR
+.TP MMM
+\fB-h\fP
 Display a short help message and exit.
-.TP 5
-\fB-i\fR
+.TP MMM
+\fB-i\fP
 Compare names ignoring case distinctions.
-.TP 5
-\fB-q\fR
+.TP MMM
+\fB-p\fP
+Enable paranoid checks.
+Compares extra fields and other meta data.
+(Automatically disabled if one of the archives is a directory.)
+.TP MMM
+\fB-q\fP
 Quiet mode.
 Compare
-\fB-v\fR.
-.TP 5
-\fB-v\fR
+\fB-v\fP.
+.TP MMM
+\fB-t\fP
+Test zip files by comparing the contents to their checksums.
+.TP MMM
+\fB-V\fP
+Display version information and exit.
+.TP MMM
+\fB-v\fP
 Verbose mode.
 Print details about differences to stdout.
 (This is the default.)
-.TP 5
-\fB-V\fR
-Display version information and exit.
-.RE
 .SH "EXIT STATUS"
-.B zipcmp
-exits 0 if the two zip archives contain the same files, 1 if they differ,
-and \*[Gt]1 if an error occurred.
+\fBzipcmp\fP
+exits 0 if the two archives contain the same files, 1 if they differ,
+and >1 if an error occurred.
 .SH "SEE ALSO"
 zipmerge(1),
-ziptorrent(1),
 libzip(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index c95673b..5f60c2a 100644 (file)
@@ -1,5 +1,5 @@
 .\" zipcmp.mdoc -- compare zip archives
-.\" Copyright (C) 2003, 2005, 2008 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2003-2015 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd June 4, 2008
+.Dd April 29, 2015
 .Dt ZIPCMP 1
 .Os
 .Sh NAME
 .Nd compare contents of zip archives
 .Sh SYNOPSIS
 .Nm
-.Op Fl hiqVv
-.Ar zip1 zip2
+.Op Fl hipqtVv
+.Ar archive1 archive2
 .Sh DESCRIPTION
 .Nm
-compares the zip archives
-.Ar zip1
+compares the zip archives or directories
+.Ar archive1
 and
-.Ar zip2
+.Ar archive2
 and checks if they contain the same files, comparing their names,
 uncompressed sizes, and CRCs.
 File order and compressed size differences are ignored.
@@ -55,27 +55,32 @@ Supported options:
 Display a short help message and exit.
 .It Fl i
 Compare names ignoring case distinctions.
+.It Fl p
+Enable paranoid checks.
+Compares extra fields and other meta data.
+(Automatically disabled if one of the archives is a directory.)
 .It Fl q
 Quiet mode.
 Compare
 .Fl v .
+.It Fl t
+Test zip files by comparing the contents to their checksums.
+.It Fl V
+Display version information and exit.
 .It Fl v
 Verbose mode.
 Print details about differences to stdout.
 (This is the default.)
-.It Fl V
-Display version information and exit.
 .El
 .Sh EXIT STATUS
 .Nm
-exits 0 if the two zip archives contain the same files, 1 if they differ,
+exits 0 if the two archives contain the same files, 1 if they differ,
 and \*[Gt]1 if an error occurred.
 .Sh SEE ALSO
 .Xr zipmerge 1 ,
-.Xr ziptorrent 1 ,
 .Xr libzip 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
index 20fdd42..b1b3e2c 100644 (file)
@@ -1,90 +1,56 @@
-.\" zipmerge.mdoc \-- merge zip archives
-.\" Copyright (C) 2004, 2005, 2008 Dieter Baron and Thomas Klausner
-.\"
-.\" This file is part of libzip, a library to manipulate ZIP archives.
-.\" The authors can be contacted at <libzip@nih.at>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in
-.\"    the documentation and/or other materials provided with the
-.\"    distribution.
-.\" 3. The names of the authors may not be used to endorse or promote
-.\"    products derived from this software without specific prior
-.\"    written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.TH ZIPMERGE 1 "June 4, 2008" NiH
+.TH "ZIPMERGE" "1" "April 29, 2015" "NiH" "General Commands Manual"
 .SH "NAME"
-zipmerge \- merge zip archives
+\fBzipmerge\fP
+\- merge zip archives
 .SH "SYNOPSIS"
-.B zipmerge
-[\fB-DhIiSsV\fR]
-\fBtarget-zip\fR
-\fBsource-zip Op \fBsource-zip ...\fR\fR
+\fBzipmerge\fP
+[\fB-DhIiSsV\fP]
+\fItarget-zip\fP
+\fIsource-zip\fP [\fIsource-zip ...\fP]
 .SH "DESCRIPTION"
-.B zipmerge
+\fBzipmerge\fP
 merges the source zip archives
-\fBsource-zip\fR
+\fIsource-zip\fP
 into the target zip archive
-\fBtarget-zip.\fR
+\fItarget-zip\fP.
 By default, files in the source zip archives overwrite
 existing files of the same name in the target zip archive.
 .PP
 Supported options:
-.RS
-.TP 5
-\fB-D\fR
+.TP MMM
+\fB-D\fP
 Ignore directory components in file name comparisons.
-.TP 5
-\fB-h\fR
+.TP MMM
+\fB-h\fP
 Display a short help message and exit.
-.TP 5
-\fB-I\fR
+.TP MMM
+\fB-I\fP
 Ignore case in file name comparisons
-.TP 5
-\fB-i\fR
+.TP MMM
+\fB-i\fP
 Ask before overwriting files.
 See also
-\fB-s\fR.
-.TP 5
-\fB-S\fR
+\fB-s\fP.
+.TP MMM
+\fB-S\fP
 Do not overwrite files that have the same size and
 CRC32 in both the source and target archives.
-.TP 5
-\fB-s\fR
+.TP MMM
+\fB-s\fP
 When
-\fB-i\fR
+\fB-i\fP
 is given, do not before overwriting files that have the same size
 and CRC32.
-.TP 5
-\fB-V\fR
+.TP MMM
+\fB-V\fP
 Display version information and exit.
-.RE
 .SH "EXIT STATUS"
-.B zipmerge
-exits 0 on success and \*[Gt]1 if an error occurred.
+\fBzipmerge\fP
+exits 0 on success and >1 if an error occurred.
 .SH "SEE ALSO"
 zipcmp(1),
-ziptorrent(1),
 libzip(3)
 .SH "AUTHORS"
-
-Dieter Baron <dillo@giga.or.at>
+Dieter Baron <dillo@nih.at>
 and
 Thomas Klausner <tk@giga.or.at>
index 3fbf0ac..60d002d 100644 (file)
@@ -1,5 +1,5 @@
 .\" zipmerge.mdoc -- merge zip archives
-.\" Copyright (C) 2004, 2005, 2008 Dieter Baron and Thomas Klausner
+.\" Copyright (C) 2004-2015 Dieter Baron and Thomas Klausner
 .\"
 .\" This file is part of libzip, a library to manipulate ZIP archives.
 .\" The authors can be contacted at <libzip@nih.at>
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd June 4, 2008
+.Dd April 29, 2015
 .Dt ZIPMERGE 1
 .Os
 .Sh NAME
@@ -77,10 +77,9 @@ Display version information and exit.
 exits 0 on success and \*[Gt]1 if an error occurred.
 .Sh SEE ALSO
 .Xr zipcmp 1 ,
-.Xr ziptorrent 1 ,
 .Xr libzip 3
 .Sh AUTHORS
 .An -nosplit
-.An Dieter Baron Aq dillo@giga.or.at
+.An Dieter Baron Aq Mt dillo@nih.at
 and
-.An Thomas Klausner Aq tk@giga.or.at
+.An Thomas Klausner Aq Mt tk@giga.or.at
diff --git a/missing b/missing
index 28055d2..db98974 100755 (executable)
--- a/missing
+++ b/missing
@@ -1,11 +1,10 @@
 #! /bin/sh
-# Common stub for a few missing GNU programs while installing.
+# Common wrapper for a few potentially missing GNU programs.
 
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2013-10-28.13; # UTC
 
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
-# 2008, 2009 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -26,69 +25,40 @@ scriptversion=2009-04-28.21; # UTC
 # the same distribution terms that you use for the rest of that program.
 
 if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
+  echo 1>&2 "Try '$0 --help' for more information"
   exit 1
 fi
 
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
+case $1 in
 
-msg="missing on your system"
+  --is-lightweight)
+    # Used by our autoconf macros to check whether the available missing
+    # script is modern enough.
+    exit 0
+    ;;
 
-case $1 in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
+  --run)
+    # Back-compat with the calling convention used by older automake.
+    shift
+    ;;
 
   -h|--h|--he|--hel|--help)
     echo "\
 $0 [OPTION]... PROGRAM [ARGUMENT]...
 
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
 
 Options:
   -h, --help      display this help and exit
   -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
 
 Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  autom4te     touch the output file, or create a stub one
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  tar          try tar, gnutar, gtar, then tar without non-portable flags
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
+  bison     yacc      flex         lex       help2man
 
-Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
-\`g' are ignored when checking the name.
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
 
 Send bug reports to <bug-automake@gnu.org>."
     exit $?
@@ -100,272 +70,141 @@ Send bug reports to <bug-automake@gnu.org>."
     ;;
 
   -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
+    echo 1>&2 "$0: unknown '$1' option"
+    echo 1>&2 "Try '$0 --help' for more information"
     exit 1
     ;;
 
 esac
 
-# normalize program name to check for.
-program=`echo "$1" | sed '
-  s/^gnu-//; t
-  s/^gnu//; t
-  s/^g//; t'`
-
-# Now exit if we have it, but it failed.  Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).  This is about non-GNU programs, so use $1 not
-# $program.
-case $1 in
-  lex*|yacc*)
-    # Not GNU programs, they don't have --version.
-    ;;
-
-  tar*)
-    if test -n "$run"; then
-       echo 1>&2 "ERROR: \`tar' requires --run"
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       exit 1
-    fi
-    ;;
-
-  *)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       # Could not run --version or --help.  This is probably someone
-       # running `$TOOL --version' or `$TOOL --help' to check whether
-       # $TOOL exists and not knowing $TOOL uses missing.
-       exit 1
-    fi
-    ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $program in
-  aclocal*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case $f in
-      *:*) touch_files="$touch_files "`echo "$f" |
-                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-          sed 's/\.am$/.in/' |
-          while read f; do touch "$f"; done
-    ;;
-
-  autom4te*)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-       touch $file
-    else
-       test -z "$file" || exec >$file
-       echo "#! /bin/sh"
-       echo "# Created by GNU Automake missing as a replacement of"
-       echo "#  $ $@"
-       echo "exit 0"
-       chmod +x $file
-       exit 1
-    fi
-    ;;
-
-  bison*|yacc*)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-       case $LASTARG in
-       *.y)
-           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-           if test -f "$SRCFILE"; then
-                cp "$SRCFILE" y.tab.c
-           fi
-           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-           if test -f "$SRCFILE"; then
-                cp "$SRCFILE" y.tab.h
-           fi
-         ;;
-       esac
-    fi
-    if test ! -f y.tab.h; then
-       echo >y.tab.h
-    fi
-    if test ! -f y.tab.c; then
-       echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex*|flex*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-       case $LASTARG in
-       *.l)
-           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-           if test -f "$SRCFILE"; then
-                cp "$SRCFILE" lex.yy.c
-           fi
-         ;;
-       esac
-    fi
-    if test ! -f lex.yy.c; then
-       echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-        you modified a dependency of a manual page.  You may need the
-        \`Help2man' package in order for those modifications to take
-        effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-       touch $file
-    else
-       test -z "$file" || exec >$file
-       echo ".ab help2man is required to generate this page"
-       exit $?
-    fi
-    ;;
-
-  makeinfo*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -z "$file"; then
-      # ... or it is the one specified with @setfilename ...
-      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '
-       /^@setfilename/{
-         s/.* \([^ ]*\) *$/\1/
-         p
-         q
-       }' $infile`
-      # ... or it is derived from the source name (dir/f.texi becomes f.info)
-      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
-    fi
-    # If the file does not exist, the user really needs makeinfo;
-    # let's fail without touching anything.
-    test -f $file || exit 1
-    touch $file
-    ;;
-
-  tar*)
-    shift
-
-    # We have already tried tar in the generic part.
-    # Look for gnutar/gtar before invocation to avoid ugly error
-    # messages.
-    if (gnutar --version > /dev/null 2>&1); then
-       gnutar "$@" && exit 0
-    fi
-    if (gtar --version > /dev/null 2>&1); then
-       gtar "$@" && exit 0
-    fi
-    firstarg="$1"
-    if shift; then
-       case $firstarg in
-       *o*)
-           firstarg=`echo "$firstarg" | sed s/o//`
-           tar "$firstarg" "$@" && exit 0
-           ;;
-       esac
-       case $firstarg in
-       *h*)
-           firstarg=`echo "$firstarg" | sed s/h//`
-           tar "$firstarg" "$@" && exit 0
-           ;;
-       esac
-    fi
-
-    echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
-         You may want to install GNU tar or Free paxutils, or check the
-         command line arguments."
-    exit 1
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch.  This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+  msg="probably too old"
+elif test $st -eq 127; then
+  # Program was missing.
+  msg="missing on your system"
+else
+  # Program was found and executed, but failed.  Give up.
+  exit $st
+fi
 
-exit 0
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+  case $1 in
+    aclocal|automake)
+      echo "The '$1' program is part of the GNU Automake package:"
+      echo "<$gnu_software_URL/automake>"
+      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/autoconf>"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+    autoconf|autom4te|autoheader)
+      echo "The '$1' program is part of the GNU Autoconf package:"
+      echo "<$gnu_software_URL/autoconf/>"
+      echo "It also requires GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+  esac
+}
+
+give_advice ()
+{
+  # Normalize program name to check for.
+  normalized_program=`echo "$1" | sed '
+    s/^gnu-//; t
+    s/^gnu//; t
+    s/^g//; t'`
+
+  printf '%s\n' "'$1' is $msg."
+
+  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+  case $normalized_program in
+    autoconf*)
+      echo "You should only need it if you modified 'configure.ac',"
+      echo "or m4 files included by it."
+      program_details 'autoconf'
+      ;;
+    autoheader*)
+      echo "You should only need it if you modified 'acconfig.h' or"
+      echo "$configure_deps."
+      program_details 'autoheader'
+      ;;
+    automake*)
+      echo "You should only need it if you modified 'Makefile.am' or"
+      echo "$configure_deps."
+      program_details 'automake'
+      ;;
+    aclocal*)
+      echo "You should only need it if you modified 'acinclude.m4' or"
+      echo "$configure_deps."
+      program_details 'aclocal'
+      ;;
+   autom4te*)
+      echo "You might have modified some maintainer files that require"
+      echo "the 'autom4te' program to be rebuilt."
+      program_details 'autom4te'
+      ;;
+    bison*|yacc*)
+      echo "You should only need it if you modified a '.y' file."
+      echo "You may want to install the GNU Bison package:"
+      echo "<$gnu_software_URL/bison/>"
+      ;;
+    lex*|flex*)
+      echo "You should only need it if you modified a '.l' file."
+      echo "You may want to install the Fast Lexical Analyzer package:"
+      echo "<$flex_URL>"
+      ;;
+    help2man*)
+      echo "You should only need it if you modified a dependency" \
+           "of a man page."
+      echo "You may want to install the GNU Help2man package:"
+      echo "<$gnu_software_URL/help2man/>"
+    ;;
+    makeinfo*)
+      echo "You should only need it if you modified a '.texi' file, or"
+      echo "any other file indirectly affecting the aspect of the manual."
+      echo "You might want to install the Texinfo package:"
+      echo "<$gnu_software_URL/texinfo/>"
+      echo "The spurious makeinfo call might also be the consequence of"
+      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+      echo "want to install GNU make:"
+      echo "<$gnu_software_URL/make/>"
+      ;;
+    *)
+      echo "You might have modified some files without having the proper"
+      echo "tools for further handling them.  Check the 'README' file, it"
+      echo "often tells you about the needed prerequisites for installing"
+      echo "this package.  You may also peek at any GNU archive site, in"
+      echo "case some other package contains this missing '$1' program."
+      ;;
+  esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+                       -e '2,$s/^/         /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
 
 # Local variables:
 # eval: (add-hook 'write-file-hooks 'time-stamp)
diff --git a/mkinstalldirs b/mkinstalldirs
deleted file mode 100755 (executable)
index 4191a45..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-#! /bin/sh
-# mkinstalldirs --- make directory hierarchy
-
-scriptversion=2009-04-28.21; # UTC
-
-# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
-# Created: 1993-05-16
-# Public domain.
-#
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-nl='
-'
-IFS=" ""       $nl"
-errstatus=0
-dirmode=
-
-usage="\
-Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
-
-Create each directory DIR (with mode MODE, if specified), including all
-leading file name components.
-
-Report bugs to <bug-automake@gnu.org>."
-
-# process command line arguments
-while test $# -gt 0 ; do
-  case $1 in
-    -h | --help | --h*)         # -h for help
-      echo "$usage"
-      exit $?
-      ;;
-    -m)                         # -m PERM arg
-      shift
-      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
-      dirmode=$1
-      shift
-      ;;
-    --version)
-      echo "$0 $scriptversion"
-      exit $?
-      ;;
-    --)                         # stop option processing
-      shift
-      break
-      ;;
-    -*)                         # unknown option
-      echo "$usage" 1>&2
-      exit 1
-      ;;
-    *)                          # first non-opt arg
-      break
-      ;;
-  esac
-done
-
-for file
-do
-  if test -d "$file"; then
-    shift
-  else
-    break
-  fi
-done
-
-case $# in
-  0) exit 0 ;;
-esac
-
-# Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and
-# mkdir -p a/c at the same time, both will detect that a is missing,
-# one will create a, then the other will try to create a and die with
-# a "File exists" error.  This is a problem when calling mkinstalldirs
-# from a parallel make.  We use --version in the probe to restrict
-# ourselves to GNU mkdir, which is thread-safe.
-case $dirmode in
-  '')
-    if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
-      echo "mkdir -p -- $*"
-      exec mkdir -p -- "$@"
-    else
-      # On NextStep and OpenStep, the `mkdir' command does not
-      # recognize any option.  It will interpret all options as
-      # directories to create, and then abort because `.' already
-      # exists.
-      test -d ./-p && rmdir ./-p
-      test -d ./--version && rmdir ./--version
-    fi
-    ;;
-  *)
-    if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
-       test ! -d ./--version; then
-      echo "mkdir -m $dirmode -p -- $*"
-      exec mkdir -m "$dirmode" -p -- "$@"
-    else
-      # Clean up after NextStep and OpenStep mkdir.
-      for d in ./-m ./-p ./--version "./$dirmode";
-      do
-        test -d $d && rmdir $d
-      done
-    fi
-    ;;
-esac
-
-for file
-do
-  case $file in
-    /*) pathcomp=/ ;;
-    *)  pathcomp= ;;
-  esac
-  oIFS=$IFS
-  IFS=/
-  set fnord $file
-  shift
-  IFS=$oIFS
-
-  for d
-  do
-    test "x$d" = x && continue
-
-    pathcomp=$pathcomp$d
-    case $pathcomp in
-      -*) pathcomp=./$pathcomp ;;
-    esac
-
-    if test ! -d "$pathcomp"; then
-      echo "mkdir $pathcomp"
-
-      mkdir "$pathcomp" || lasterr=$?
-
-      if test ! -d "$pathcomp"; then
-       errstatus=$lasterr
-      else
-       if test ! -z "$dirmode"; then
-         echo "chmod $dirmode $pathcomp"
-         lasterr=
-         chmod "$dirmode" "$pathcomp" || lasterr=$?
-
-         if test ! -z "$lasterr"; then
-           errstatus=$lasterr
-         fi
-       fi
-      fi
-    fi
-
-    pathcomp=$pathcomp/
-  done
-done
-
-exit $errstatus
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
index bf62886..cfd22dd 100644 (file)
 ENABLE_TESTING()
 
+CHECK_FUNCTION_EXISTS(getopt HAVE_GETOPT)
+IF(NOT HAVE_GETOPT)
+  SET(SRC_EXTRA_FILES ../src/getopt.c)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_CURRENT_SOURCE_DIR}/../src)
+ENDIF(NOT HAVE_GETOPT)
+
 SET(STANDALONE_TEST_PROGRAMS
-  add_from_buffer
-  add_from_file
   add_from_filep
-  add_from_zip
-  encrypt
-  fread
-  get_comment
-  name_locate
-  set_comment_all
-  set_comment_localonly
-  set_comment_removeglobal
-  set_comment_revert
+  fopen_unchanged
+#  fread
 )
 
 SET(HELPER_TEST_PROGRAMS
+#  modify
+#  tryopen
+)
+
+SET(GETOPT_USERS
+  fread
   tryopen
 )
 
+SET(HOLE_USERS
+  hole
+  modify
+)
+
 SET(EXTRA_TESTS
-  open_new_but_exists.test
-  open_new_ok.test
-  open_nonarchive.test
-  open_nosuchfile.test
-  open_ok.test
+       add_dir.test
+       add_from_buffer.test
+       add_from_file.test
+       add_from_file_duplicate.test
+       add_from_file_twice_duplicate.test
+       add_from_filep.test
+       add_from_stdin.test
+       add_from_zip_closed.test
+       add_from_zip_deflated.test
+       add_from_zip_partial_deflated.test
+       add_from_zip_partial_stored.test
+       add_from_zip_stored.test
+       add_stored.test
+       add_stored_in_memory.test
+       delete_add_same.test
+       delete_invalid.test
+       delete_last.test
+       delete_multiple_last.test
+       delete_multiple_partial.test
+       delete_renamed_rename.test
+       encrypt.test
+       extra_add.test
+       extra_add_multiple.test
+       extra_count.test
+       extra_count_by_id.test
+       extra_count_ignore_zip64.test
+       extra_delete.test
+       extra_delete_by_id.test
+       extra_get.test
+       extra_get_by_id.test
+       extra_set.test
+       extra_set_modify_c.test
+       extra_set_modify_l.test
+       file_comment_encmismatch.test
+       fopen_unchanged.test
+       fread.test
+       get_comment.test
+       name_locate.test
+       open_cons_extrabytes.test
+       open_empty.test
+       open_empty_2.test
+       open_extrabytes.test
+       open_filename_empty.test
+       open_incons.test
+       open_many_ok.test
+       open_new_but_exists.test
+       open_new_ok.test
+       open_nonarchive.test
+       open_nosuchfile.test
+       open_ok.test
+       open_too_short.test
+       open_truncate.test
+       open_zip64_ok.test
+       rename_ascii.test
+       rename_cp437.test
+       rename_deleted.test
+       rename_fail.test
+       rename_ok.test
+       rename_utf8.test
+       rename_utf8_encmismatch.test
+       set_comment_all.test
+       set_comment_localonly.test
+       set_comment_removeglobal.test
+       set_comment_revert.test
+       set_compression_deflate_to_deflate.test
+       set_compression_deflate_to_store.test
+       set_compression_store_to_deflate.test
+       set_compression_store_to_store.test
+       set_compression_unknown.test
+       stat_index_cp437_guess.test
+       stat_index_cp437_raw.test
+       stat_index_cp437_strict.test
+       stat_index_fileorder.test
+       stat_index_streamed.test
+       stat_index_streamed_zip64.test
+       stat_index_utf8_guess.test
+       stat_index_utf8_raw.test
+       stat_index_utf8_strict.test
+       stat_index_utf8_unmarked_strict.test
+       stat_index_zip64.test
+       utf-8-standardization.test
+       zip64_creation.test
+       zip64_stored_creation.test
 )
 
 SET(ENV{srcdir} ${CMAKE_CURRENT_SOURCE_DIR})
@@ -39,9 +126,21 @@ FOREACH(PROGRAM ${HELPER_TEST_PROGRAMS})
   TARGET_LINK_LIBRARIES(${PROGRAM} zip)
 ENDFOREACH(PROGRAM ${HELPER_TEST_PROGRAMS})
 
+FOREACH(PROGRAM ${GETOPT_USERS})
+  ADD_EXECUTABLE(${PROGRAM} ${PROGRAM}.c ${SRC_EXTRA_FILES})
+  TARGET_LINK_LIBRARIES(${PROGRAM} zip)
+ENDFOREACH(PROGRAM ${GETOPT_USERS})
+FOREACH(PROGRAM ${HOLE_USERS})
+  ADD_EXECUTABLE(${PROGRAM} ${PROGRAM}.c ${SRC_EXTRA_FILES} source_hole.c)
+  TARGET_LINK_LIBRARIES(${PROGRAM} zip)
+ENDFOREACH(PROGRAM ${HOLE_USERS})
+
+ADD_TEST(fread ${CMAKE_CURRENT_SOURCE_DIR}/runtest ${CMAKE_CURRENT_SOURCE_DIR}/fread)
+
 FOREACH(CASE ${EXTRA_TESTS})
   ADD_TEST(${CASE} ${CMAKE_CURRENT_SOURCE_DIR}/runtest ${CMAKE_CURRENT_SOURCE_DIR}/${CASE})
 ENDFOREACH(CASE ${EXTRA_TESTS})
 
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../lib
+       ${CMAKE_CURRENT_SOURCE_DIR}/../src
        ${CMAKE_CURRENT_BINARY_DIR}/..)
index 0f9ef05..06aea69 100644 (file)
+AUTOMAKE_OPTIONS=      parallel-tests
+
+noinst_SCRIPTS=                runtest
+
 noinst_PROGRAMS= \
-       add_dir \
-       add_from_buffer \
-       add_from_file \
        add_from_filep \
-       add_from_zip \
-       encrypt \
+       fopen_unchanged \
        fread \
-       get_comment \
-       name_locate \
-       set_comment_all \
-       set_comment_localonly \
-       set_comment_removeglobal \
-       set_comment_revert \
+       hole \
+       modify \
        tryopen
 
-EXTRA_PROGRAMS=deltest ziptest
+modify_SOURCES= \
+       modify.c \
+       source_hole.c
+
+hole_SOURCES= \
+       hole.c \
+       source_hole.c
 
 EXTRA_DIST= \
        CMakeLists.txt \
-       runtest \
+       NiHTest.pm \
+       runtest.in \
        ${TESTS} \
+       bigstored.zh \
+       bigzero-zip.zip \
+       bogus.zip \
        broken.zip \
+       cm-default.zip \
        encrypt.zip \
-       manyfiles.zip \
+       encrypt_plus_extra.zip \
+       encrypt_plus_extra_modified_c.zip \
+       encrypt_plus_extra_modified_l.zip \
+       filename_duplicate.zip \
+       filename_duplicate_empty.zip \
+       filename_empty.zip \
+       fileorder.zip \
+       firstsecond.zip \
+       firstsecond-split-deflated.zip \
+       firstsecond-split-stored.zip \
+       foo-stored.zip \
+       incons-archive-comment-longer.zip \
+       incons-archive-comment-shorter.zip \
+       incons-cdoffset.zip \
+       incons-central-compression-method.zip \
+       incons-central-compsize-larger-toolarge.zip \
+       incons-central-compsize-larger.zip \
+       incons-central-compsize-smaller.zip \
+       incons-central-crc.zip \
+       incons-central-date.zip \
+       incons-central-file-comment-longer.zip \
+       incons-central-file-comment-shorter.zip \
+       incons-central-magic-bad.zip \
+       incons-central-magic-bad2.zip \
+       incons-central-size-larger.zip \
+       incons-data.zip \
+       incons-ef-central-size-wrong.zip \
+       incons-ef-local-id-size.zip \
+       incons-ef-local-id.zip \
+       incons-ef-local-incomplete1.zip \
+       incons-ef-local-incomplete2.zip \
+       incons-ef-local-incomplete3.zip \
+       incons-ef-local-incomplete4.zip \
+       incons-ef-local-size.zip \
+       incons-eocd-magic-bad.zip \
+       incons-file-count-high.zip \
+       incons-file-count-low.zip \
+       incons-file-count-overflow.zip \
+       incons-local-compression-method.zip \
+       incons-local-compsize-larger.zip \
+       incons-local-compsize-smaller.zip \
+       incons-local-crc.zip \
+       incons-local-filename-long.zip \
+       incons-local-filename-missing.zip \
+       incons-local-filename-short.zip \
+       incons-local-filename.zip \
+       incons-local-magic-bad.zip \
+       incons-local-size-larger.zip \
+       large-uncompressable \
+       manyfiles-zip.zip \
+       rename_ok.zip \
+       streamed.zip \
+       streamed-zip64.zip \
        test.zip \
+       test2.zip \
+       test-cp437.zip \
+       test-cp437-comment-utf-8.zip \
+       test-cp437-fc.zip \
+       test-cp437-fc-utf-8-filename.zip \
+       test-utf8.zip \
+       test-utf8-unmarked.zip \
        testbuffer.zip \
        testdir.zip \
        testchanged.zip \
        testchangedlocal.zip \
        testcomment.zip \
+       testcomment13.zip \
        testcommentremoved.zip \
+       testdeflated.zip \
+       testdeflated2.zip \
+       testempty.zip \
+       testextrabytes.zip \
        testfile.txt \
        testfile.zip \
-       testnottorrent.zip \
+       testfile-cp437.zip \
+       testfile-plus-extra.zip \
+       testfile-UTF8.zip \
+       testfile2014.zip \
+       teststdin.zip \
        teststored.zip \
-       testtorrent.tzip
+       utf-8-standardization-input.zip \
+       utf-8-standardization-output.zip \
+       zip64.zip
 
-TESTS_ENVIRONMENT=     ZIPCMP=${top_builddir}/src/zipcmp ${srcdir}/runtest
+TESTS_ENVIRONMENT=     ZIPCMP=${top_builddir}/src/zipcmp
+# ${srcdir}/runtest
+#LOG_COMPILER=  ${srcdir}/runtest
+TEST_EXTENSIONS= .test
+TEST_LOG_COMPILER= ${builddir}/runtest
+#AM_TEST_LOG_FLAGS = -s
 
 TESTS= \
        add_dir.test \
        add_from_buffer.test \
        add_from_file.test \
+       add_from_file_duplicate.test \
+       add_from_file_twice_duplicate.test \
        add_from_filep.test \
-       add_from_zip.test \
+       add_from_stdin.test \
+       add_from_zip_closed.test \
+       add_from_zip_deflated.test \
+       add_from_zip_deflated2.test \
+       add_from_zip_partial_deflated.test \
+       add_from_zip_partial_stored.test \
+       add_from_zip_stored.test \
+       add_stored.test \
+       add_stored_in_memory.test \
+       delete_add_same.test \
+       delete_invalid.test \
+       delete_last.test \
+       delete_multiple_last.test \
+       delete_multiple_partial.test \
+       delete_renamed_rename.test \
        encrypt.test \
+       extra_add.test \
+       extra_add_multiple.test \
+       extra_count.test \
+       extra_count_by_id.test \
+       extra_count_ignore_zip64.test \
+       extra_delete.test \
+       extra_delete_by_id.test \
+       extra_get.test \
+       extra_get_by_id.test \
+       extra_set.test \
+       extra_set_modify_c.test \
+       extra_set_modify_l.test \
+       file_comment_encmismatch.test \
+       fopen_unchanged.test \
        fread.test \
        get_comment.test \
        name_locate.test \
+       open_cons_extrabytes.test \
+       open_empty.test \
+       open_empty_2.test \
+       open_extrabytes.test \
+       open_file_count.test \
+       open_filename_duplicate.test \
+       open_filename_duplicate_consistency.test \
+       open_filename_duplicate_empty.test \
+       open_filename_duplicate_empty_consistency.test \
+       open_filename_empty.test \
+       open_incons.test \
        open_many_ok.test \
        open_new_but_exists.test \
        open_new_ok.test \
        open_nonarchive.test \
        open_nosuchfile.test \
        open_ok.test \
+       open_too_short.test \
+       open_truncate.test \
+       open_zip64_ok.test \
+       rename_ascii.test \
+       rename_cp437.test \
+       rename_deleted.test \
+       rename_fail.test \
+       rename_ok.test \
+       rename_utf8.test \
+       rename_utf8_encmismatch.test \
        set_comment_all.test \
        set_comment_localonly.test \
        set_comment_removeglobal.test \
        set_comment_revert.test \
-       torrent-already.test \
-       torrent-new.test
-# problems with comparing stderr output
-NOTYET= \
-       add_from_file_duplicate.test
+       set_compression_deflate_to_deflate.test \
+       set_compression_deflate_to_store.test \
+       set_compression_store_to_deflate.test \
+       set_compression_store_to_store.test \
+       set_compression_unknown.test \
+       stat_index_cp437_guess.test \
+       stat_index_cp437_raw.test \
+       stat_index_cp437_strict.test \
+       stat_index_fileorder.test \
+       stat_index_streamed.test \
+       stat_index_streamed_zip64.test \
+       stat_index_utf8_guess.test \
+       stat_index_utf8_raw.test \
+       stat_index_utf8_strict.test \
+       stat_index_utf8_unmarked_strict.test \
+       stat_index_zip64.test \
+       utf-8-standardization.test \
+       zip64_creation.test \
+       zip64_stored_creation.test
 
-AM_CPPFLAGS=-I${top_srcdir}/lib
+XFAIL_TESTS= \
+       open_filename_duplicate_consistency.test \
+       open_filename_duplicate_empty_consistency.test
+
+AM_CPPFLAGS=-I${top_srcdir}/lib -I../lib -I${top_srcdir}/src
 LDADD=${top_builddir}/lib/libzip.la
+
+check-am: bigzero.zip manyfiles.zip runtest
+
+bigzero.zip: bigzero-zip.zip
+       ${builddir}/modify ${srcdir}/bigzero-zip.zip cat 0 > ${builddir}/bigzero.zip
+
+manyfiles.zip: manyfiles-zip.zip
+       ${builddir}/modify ${srcdir}/manyfiles-zip.zip cat 0 > ${builddir}/manyfiles.zip
+
+runtest: runtest.in
+       sed -e 's!@[s]rcdir@!${srcdir}!g' -e 's!@[a]bs_srcdir@!${abs_srcdir}!g' ${srcdir}/runtest.in > runtest
+       chmod +x runtest
+
+cleanup:
+       rm -rf ${builddir}/sandbox-*.d[0-9]*/
+
+CLEANFILES=bigzero.zip manyfiles.zip runtest
index 6ef04dc..9dae407 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 @SET_MAKE@
 
+
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -34,122 +79,319 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-noinst_PROGRAMS = add_dir$(EXEEXT) add_from_buffer$(EXEEXT) \
-       add_from_file$(EXEEXT) add_from_filep$(EXEEXT) \
-       add_from_zip$(EXEEXT) encrypt$(EXEEXT) fread$(EXEEXT) \
-       get_comment$(EXEEXT) name_locate$(EXEEXT) \
-       set_comment_all$(EXEEXT) set_comment_localonly$(EXEEXT) \
-       set_comment_removeglobal$(EXEEXT) set_comment_revert$(EXEEXT) \
-       tryopen$(EXEEXT)
-EXTRA_PROGRAMS = deltest$(EXEEXT) ziptest$(EXEEXT)
+noinst_PROGRAMS = add_from_filep$(EXEEXT) fopen_unchanged$(EXEEXT) \
+       fread$(EXEEXT) hole$(EXEEXT) modify$(EXEEXT) tryopen$(EXEEXT)
 subdir = regress
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+       $(top_srcdir)/depcomp $(top_srcdir)/test-driver
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 PROGRAMS = $(noinst_PROGRAMS)
-add_dir_SOURCES = add_dir.c
-add_dir_OBJECTS = add_dir.$(OBJEXT)
-add_dir_LDADD = $(LDADD)
-add_dir_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-add_from_buffer_SOURCES = add_from_buffer.c
-add_from_buffer_OBJECTS = add_from_buffer.$(OBJEXT)
-add_from_buffer_LDADD = $(LDADD)
-add_from_buffer_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-add_from_file_SOURCES = add_from_file.c
-add_from_file_OBJECTS = add_from_file.$(OBJEXT)
-add_from_file_LDADD = $(LDADD)
-add_from_file_DEPENDENCIES = ${top_builddir}/lib/libzip.la
 add_from_filep_SOURCES = add_from_filep.c
 add_from_filep_OBJECTS = add_from_filep.$(OBJEXT)
 add_from_filep_LDADD = $(LDADD)
 add_from_filep_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-add_from_zip_SOURCES = add_from_zip.c
-add_from_zip_OBJECTS = add_from_zip.$(OBJEXT)
-add_from_zip_LDADD = $(LDADD)
-add_from_zip_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-deltest_SOURCES = deltest.c
-deltest_OBJECTS = deltest.$(OBJEXT)
-deltest_LDADD = $(LDADD)
-deltest_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-encrypt_SOURCES = encrypt.c
-encrypt_OBJECTS = encrypt.$(OBJEXT)
-encrypt_LDADD = $(LDADD)
-encrypt_DEPENDENCIES = ${top_builddir}/lib/libzip.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+fopen_unchanged_SOURCES = fopen_unchanged.c
+fopen_unchanged_OBJECTS = fopen_unchanged.$(OBJEXT)
+fopen_unchanged_LDADD = $(LDADD)
+fopen_unchanged_DEPENDENCIES = ${top_builddir}/lib/libzip.la
 fread_SOURCES = fread.c
 fread_OBJECTS = fread.$(OBJEXT)
 fread_LDADD = $(LDADD)
 fread_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-get_comment_SOURCES = get_comment.c
-get_comment_OBJECTS = get_comment.$(OBJEXT)
-get_comment_LDADD = $(LDADD)
-get_comment_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-name_locate_SOURCES = name_locate.c
-name_locate_OBJECTS = name_locate.$(OBJEXT)
-name_locate_LDADD = $(LDADD)
-name_locate_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-set_comment_all_SOURCES = set_comment_all.c
-set_comment_all_OBJECTS = set_comment_all.$(OBJEXT)
-set_comment_all_LDADD = $(LDADD)
-set_comment_all_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-set_comment_localonly_SOURCES = set_comment_localonly.c
-set_comment_localonly_OBJECTS = set_comment_localonly.$(OBJEXT)
-set_comment_localonly_LDADD = $(LDADD)
-set_comment_localonly_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-set_comment_removeglobal_SOURCES = set_comment_removeglobal.c
-set_comment_removeglobal_OBJECTS = set_comment_removeglobal.$(OBJEXT)
-set_comment_removeglobal_LDADD = $(LDADD)
-set_comment_removeglobal_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-set_comment_revert_SOURCES = set_comment_revert.c
-set_comment_revert_OBJECTS = set_comment_revert.$(OBJEXT)
-set_comment_revert_LDADD = $(LDADD)
-set_comment_revert_DEPENDENCIES = ${top_builddir}/lib/libzip.la
+am_hole_OBJECTS = hole.$(OBJEXT) source_hole.$(OBJEXT)
+hole_OBJECTS = $(am_hole_OBJECTS)
+hole_LDADD = $(LDADD)
+hole_DEPENDENCIES = ${top_builddir}/lib/libzip.la
+am_modify_OBJECTS = modify.$(OBJEXT) source_hole.$(OBJEXT)
+modify_OBJECTS = $(am_modify_OBJECTS)
+modify_LDADD = $(LDADD)
+modify_DEPENDENCIES = ${top_builddir}/lib/libzip.la
 tryopen_SOURCES = tryopen.c
 tryopen_OBJECTS = tryopen.$(OBJEXT)
 tryopen_LDADD = $(LDADD)
 tryopen_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-ziptest_SOURCES = ziptest.c
-ziptest_OBJECTS = ziptest.$(OBJEXT)
-ziptest_LDADD = $(LDADD)
-ziptest_DEPENDENCIES = ${top_builddir}/lib/libzip.la
+SCRIPTS = $(noinst_SCRIPTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-       --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-       --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-       $(LDFLAGS) -o $@
-SOURCES = add_dir.c add_from_buffer.c add_from_file.c add_from_filep.c \
-       add_from_zip.c deltest.c encrypt.c fread.c get_comment.c \
-       name_locate.c set_comment_all.c set_comment_localonly.c \
-       set_comment_removeglobal.c set_comment_revert.c tryopen.c \
-       ziptest.c
-DIST_SOURCES = add_dir.c add_from_buffer.c add_from_file.c \
-       add_from_filep.c add_from_zip.c deltest.c encrypt.c fread.c \
-       get_comment.c name_locate.c set_comment_all.c \
-       set_comment_localonly.c set_comment_removeglobal.c \
-       set_comment_revert.c tryopen.c ziptest.c
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = add_from_filep.c fopen_unchanged.c fread.c $(hole_SOURCES) \
+       $(modify_SOURCES) tryopen.c
+DIST_SOURCES = add_from_filep.c fopen_unchanged.c fread.c \
+       $(hole_SOURCES) $(modify_SOURCES) tryopen.c
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red='\e[0;31m'; \
+    grn='\e[0;32m'; \
+    lgn='\e[1;32m'; \
+    blu='\e[1;34m'; \
+    mgn='\e[0;35m'; \
+    brg='\e[1m'; \
+    std='\e[m'; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[    ]*:recheck:[    ]*
+am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
+am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+           recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[       ]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);                                     \
+$(am__vpath_adj_setup) $(am__vpath_adj)                        \
+$(am__tty_colors);                                     \
+srcdir=$(srcdir); export srcdir;                       \
+case "$@" in                                           \
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
+    *) am__odir=.;;                                    \
+esac;                                                  \
+test "x$$am__odir" = x"." || test -d "$$am__odir"      \
+  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
+if test -f "./$$f"; then dir=./;                       \
+elif test -f "$$f"; then dir=;                         \
+else dir="$(srcdir)/"; fi;                             \
+tst=$$dir$$f; log='$@';                                \
+if test -n '$(DISABLE_HARD_ERRORS)'; then              \
+  am__enable_hard_errors=no;                           \
+else                                                   \
+  am__enable_hard_errors=yes;                          \
+fi;                                                    \
+case " $(XFAIL_TESTS) " in                             \
+  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
+    am__expect_failure=yes;;                           \
+  *)                                                   \
+    am__expect_failure=no;;                            \
+esac;                                                  \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+       $(TEST_LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -158,11 +400,13 @@ AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -172,6 +416,7 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -187,6 +432,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MANFMT = @MANFMT@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -202,6 +448,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG_RPATH = @PKG_CONFIG_RPATH@
 RANLIB = @RANLIB@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
@@ -212,6 +459,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
@@ -244,7 +492,6 @@ libdir = @libdir@
 libexecdir = @libexecdir@
 localedir = @localedir@
 localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
@@ -260,60 +507,219 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = parallel-tests
+noinst_SCRIPTS = runtest
+modify_SOURCES = \
+       modify.c \
+       source_hole.c
+
+hole_SOURCES = \
+       hole.c \
+       source_hole.c
+
 EXTRA_DIST = \
        CMakeLists.txt \
-       runtest \
+       NiHTest.pm \
+       runtest.in \
        ${TESTS} \
+       bigstored.zh \
+       bigzero-zip.zip \
+       bogus.zip \
        broken.zip \
+       cm-default.zip \
        encrypt.zip \
-       manyfiles.zip \
+       encrypt_plus_extra.zip \
+       encrypt_plus_extra_modified_c.zip \
+       encrypt_plus_extra_modified_l.zip \
+       filename_duplicate.zip \
+       filename_duplicate_empty.zip \
+       filename_empty.zip \
+       fileorder.zip \
+       firstsecond.zip \
+       firstsecond-split-deflated.zip \
+       firstsecond-split-stored.zip \
+       foo-stored.zip \
+       incons-archive-comment-longer.zip \
+       incons-archive-comment-shorter.zip \
+       incons-cdoffset.zip \
+       incons-central-compression-method.zip \
+       incons-central-compsize-larger-toolarge.zip \
+       incons-central-compsize-larger.zip \
+       incons-central-compsize-smaller.zip \
+       incons-central-crc.zip \
+       incons-central-date.zip \
+       incons-central-file-comment-longer.zip \
+       incons-central-file-comment-shorter.zip \
+       incons-central-magic-bad.zip \
+       incons-central-magic-bad2.zip \
+       incons-central-size-larger.zip \
+       incons-data.zip \
+       incons-ef-central-size-wrong.zip \
+       incons-ef-local-id-size.zip \
+       incons-ef-local-id.zip \
+       incons-ef-local-incomplete1.zip \
+       incons-ef-local-incomplete2.zip \
+       incons-ef-local-incomplete3.zip \
+       incons-ef-local-incomplete4.zip \
+       incons-ef-local-size.zip \
+       incons-eocd-magic-bad.zip \
+       incons-file-count-high.zip \
+       incons-file-count-low.zip \
+       incons-file-count-overflow.zip \
+       incons-local-compression-method.zip \
+       incons-local-compsize-larger.zip \
+       incons-local-compsize-smaller.zip \
+       incons-local-crc.zip \
+       incons-local-filename-long.zip \
+       incons-local-filename-missing.zip \
+       incons-local-filename-short.zip \
+       incons-local-filename.zip \
+       incons-local-magic-bad.zip \
+       incons-local-size-larger.zip \
+       large-uncompressable \
+       manyfiles-zip.zip \
+       rename_ok.zip \
+       streamed.zip \
+       streamed-zip64.zip \
        test.zip \
+       test2.zip \
+       test-cp437.zip \
+       test-cp437-comment-utf-8.zip \
+       test-cp437-fc.zip \
+       test-cp437-fc-utf-8-filename.zip \
+       test-utf8.zip \
+       test-utf8-unmarked.zip \
        testbuffer.zip \
        testdir.zip \
        testchanged.zip \
        testchangedlocal.zip \
        testcomment.zip \
+       testcomment13.zip \
        testcommentremoved.zip \
+       testdeflated.zip \
+       testdeflated2.zip \
+       testempty.zip \
+       testextrabytes.zip \
        testfile.txt \
        testfile.zip \
-       testnottorrent.zip \
+       testfile-cp437.zip \
+       testfile-plus-extra.zip \
+       testfile-UTF8.zip \
+       testfile2014.zip \
+       teststdin.zip \
        teststored.zip \
-       testtorrent.tzip
-
-TESTS_ENVIRONMENT = ZIPCMP=${top_builddir}/src/zipcmp ${srcdir}/runtest
+       utf-8-standardization-input.zip \
+       utf-8-standardization-output.zip \
+       zip64.zip
+
+TESTS_ENVIRONMENT = ZIPCMP=${top_builddir}/src/zipcmp
+# ${srcdir}/runtest
+#LOG_COMPILER=  ${srcdir}/runtest
+TEST_EXTENSIONS = .test
+TEST_LOG_COMPILER = ${builddir}/runtest
+#AM_TEST_LOG_FLAGS = -s
 TESTS = \
        add_dir.test \
        add_from_buffer.test \
        add_from_file.test \
+       add_from_file_duplicate.test \
+       add_from_file_twice_duplicate.test \
        add_from_filep.test \
-       add_from_zip.test \
+       add_from_stdin.test \
+       add_from_zip_closed.test \
+       add_from_zip_deflated.test \
+       add_from_zip_deflated2.test \
+       add_from_zip_partial_deflated.test \
+       add_from_zip_partial_stored.test \
+       add_from_zip_stored.test \
+       add_stored.test \
+       add_stored_in_memory.test \
+       delete_add_same.test \
+       delete_invalid.test \
+       delete_last.test \
+       delete_multiple_last.test \
+       delete_multiple_partial.test \
+       delete_renamed_rename.test \
        encrypt.test \
+       extra_add.test \
+       extra_add_multiple.test \
+       extra_count.test \
+       extra_count_by_id.test \
+       extra_count_ignore_zip64.test \
+       extra_delete.test \
+       extra_delete_by_id.test \
+       extra_get.test \
+       extra_get_by_id.test \
+       extra_set.test \
+       extra_set_modify_c.test \
+       extra_set_modify_l.test \
+       file_comment_encmismatch.test \
+       fopen_unchanged.test \
        fread.test \
        get_comment.test \
        name_locate.test \
+       open_cons_extrabytes.test \
+       open_empty.test \
+       open_empty_2.test \
+       open_extrabytes.test \
+       open_file_count.test \
+       open_filename_duplicate.test \
+       open_filename_duplicate_consistency.test \
+       open_filename_duplicate_empty.test \
+       open_filename_duplicate_empty_consistency.test \
+       open_filename_empty.test \
+       open_incons.test \
        open_many_ok.test \
        open_new_but_exists.test \
        open_new_ok.test \
        open_nonarchive.test \
        open_nosuchfile.test \
        open_ok.test \
+       open_too_short.test \
+       open_truncate.test \
+       open_zip64_ok.test \
+       rename_ascii.test \
+       rename_cp437.test \
+       rename_deleted.test \
+       rename_fail.test \
+       rename_ok.test \
+       rename_utf8.test \
+       rename_utf8_encmismatch.test \
        set_comment_all.test \
        set_comment_localonly.test \
        set_comment_removeglobal.test \
        set_comment_revert.test \
-       torrent-already.test \
-       torrent-new.test
-
-# problems with comparing stderr output
-NOTYET = \
-       add_from_file_duplicate.test
-
-AM_CPPFLAGS = -I${top_srcdir}/lib
+       set_compression_deflate_to_deflate.test \
+       set_compression_deflate_to_store.test \
+       set_compression_store_to_deflate.test \
+       set_compression_store_to_store.test \
+       set_compression_unknown.test \
+       stat_index_cp437_guess.test \
+       stat_index_cp437_raw.test \
+       stat_index_cp437_strict.test \
+       stat_index_fileorder.test \
+       stat_index_streamed.test \
+       stat_index_streamed_zip64.test \
+       stat_index_utf8_guess.test \
+       stat_index_utf8_raw.test \
+       stat_index_utf8_strict.test \
+       stat_index_utf8_unmarked_strict.test \
+       stat_index_zip64.test \
+       utf-8-standardization.test \
+       zip64_creation.test \
+       zip64_stored_creation.test
+
+XFAIL_TESTS = \
+       open_filename_duplicate_consistency.test \
+       open_filename_duplicate_empty_consistency.test
+
+AM_CPPFLAGS = -I${top_srcdir}/lib -I../lib -I${top_srcdir}/src
 LDADD = ${top_builddir}/lib/libzip.la
+CLEANFILES = bigzero.zip manyfiles.zip runtest
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        @for dep in $?; do \
          case '$(am__configure_deps)' in \
@@ -353,54 +759,30 @@ clean-noinstPROGRAMS:
        list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
        echo " rm -f" $$list; \
        rm -f $$list
-add_dir$(EXEEXT): $(add_dir_OBJECTS) $(add_dir_DEPENDENCIES) 
-       @rm -f add_dir$(EXEEXT)
-       $(LINK) $(add_dir_OBJECTS) $(add_dir_LDADD) $(LIBS)
-add_from_buffer$(EXEEXT): $(add_from_buffer_OBJECTS) $(add_from_buffer_DEPENDENCIES) 
-       @rm -f add_from_buffer$(EXEEXT)
-       $(LINK) $(add_from_buffer_OBJECTS) $(add_from_buffer_LDADD) $(LIBS)
-add_from_file$(EXEEXT): $(add_from_file_OBJECTS) $(add_from_file_DEPENDENCIES) 
-       @rm -f add_from_file$(EXEEXT)
-       $(LINK) $(add_from_file_OBJECTS) $(add_from_file_LDADD) $(LIBS)
-add_from_filep$(EXEEXT): $(add_from_filep_OBJECTS) $(add_from_filep_DEPENDENCIES) 
+
+add_from_filep$(EXEEXT): $(add_from_filep_OBJECTS) $(add_from_filep_DEPENDENCIES) $(EXTRA_add_from_filep_DEPENDENCIES) 
        @rm -f add_from_filep$(EXEEXT)
-       $(LINK) $(add_from_filep_OBJECTS) $(add_from_filep_LDADD) $(LIBS)
-add_from_zip$(EXEEXT): $(add_from_zip_OBJECTS) $(add_from_zip_DEPENDENCIES) 
-       @rm -f add_from_zip$(EXEEXT)
-       $(LINK) $(add_from_zip_OBJECTS) $(add_from_zip_LDADD) $(LIBS)
-deltest$(EXEEXT): $(deltest_OBJECTS) $(deltest_DEPENDENCIES) 
-       @rm -f deltest$(EXEEXT)
-       $(LINK) $(deltest_OBJECTS) $(deltest_LDADD) $(LIBS)
-encrypt$(EXEEXT): $(encrypt_OBJECTS) $(encrypt_DEPENDENCIES) 
-       @rm -f encrypt$(EXEEXT)
-       $(LINK) $(encrypt_OBJECTS) $(encrypt_LDADD) $(LIBS)
-fread$(EXEEXT): $(fread_OBJECTS) $(fread_DEPENDENCIES) 
+       $(AM_V_CCLD)$(LINK) $(add_from_filep_OBJECTS) $(add_from_filep_LDADD) $(LIBS)
+
+fopen_unchanged$(EXEEXT): $(fopen_unchanged_OBJECTS) $(fopen_unchanged_DEPENDENCIES) $(EXTRA_fopen_unchanged_DEPENDENCIES) 
+       @rm -f fopen_unchanged$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(fopen_unchanged_OBJECTS) $(fopen_unchanged_LDADD) $(LIBS)
+
+fread$(EXEEXT): $(fread_OBJECTS) $(fread_DEPENDENCIES) $(EXTRA_fread_DEPENDENCIES) 
        @rm -f fread$(EXEEXT)
-       $(LINK) $(fread_OBJECTS) $(fread_LDADD) $(LIBS)
-get_comment$(EXEEXT): $(get_comment_OBJECTS) $(get_comment_DEPENDENCIES) 
-       @rm -f get_comment$(EXEEXT)
-       $(LINK) $(get_comment_OBJECTS) $(get_comment_LDADD) $(LIBS)
-name_locate$(EXEEXT): $(name_locate_OBJECTS) $(name_locate_DEPENDENCIES) 
-       @rm -f name_locate$(EXEEXT)
-       $(LINK) $(name_locate_OBJECTS) $(name_locate_LDADD) $(LIBS)
-set_comment_all$(EXEEXT): $(set_comment_all_OBJECTS) $(set_comment_all_DEPENDENCIES) 
-       @rm -f set_comment_all$(EXEEXT)
-       $(LINK) $(set_comment_all_OBJECTS) $(set_comment_all_LDADD) $(LIBS)
-set_comment_localonly$(EXEEXT): $(set_comment_localonly_OBJECTS) $(set_comment_localonly_DEPENDENCIES) 
-       @rm -f set_comment_localonly$(EXEEXT)
-       $(LINK) $(set_comment_localonly_OBJECTS) $(set_comment_localonly_LDADD) $(LIBS)
-set_comment_removeglobal$(EXEEXT): $(set_comment_removeglobal_OBJECTS) $(set_comment_removeglobal_DEPENDENCIES) 
-       @rm -f set_comment_removeglobal$(EXEEXT)
-       $(LINK) $(set_comment_removeglobal_OBJECTS) $(set_comment_removeglobal_LDADD) $(LIBS)
-set_comment_revert$(EXEEXT): $(set_comment_revert_OBJECTS) $(set_comment_revert_DEPENDENCIES) 
-       @rm -f set_comment_revert$(EXEEXT)
-       $(LINK) $(set_comment_revert_OBJECTS) $(set_comment_revert_LDADD) $(LIBS)
-tryopen$(EXEEXT): $(tryopen_OBJECTS) $(tryopen_DEPENDENCIES) 
+       $(AM_V_CCLD)$(LINK) $(fread_OBJECTS) $(fread_LDADD) $(LIBS)
+
+hole$(EXEEXT): $(hole_OBJECTS) $(hole_DEPENDENCIES) $(EXTRA_hole_DEPENDENCIES) 
+       @rm -f hole$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(hole_OBJECTS) $(hole_LDADD) $(LIBS)
+
+modify$(EXEEXT): $(modify_OBJECTS) $(modify_DEPENDENCIES) $(EXTRA_modify_DEPENDENCIES) 
+       @rm -f modify$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(modify_OBJECTS) $(modify_LDADD) $(LIBS)
+
+tryopen$(EXEEXT): $(tryopen_OBJECTS) $(tryopen_DEPENDENCIES) $(EXTRA_tryopen_DEPENDENCIES) 
        @rm -f tryopen$(EXEEXT)
-       $(LINK) $(tryopen_OBJECTS) $(tryopen_LDADD) $(LIBS)
-ziptest$(EXEEXT): $(ziptest_OBJECTS) $(ziptest_DEPENDENCIES) 
-       @rm -f ziptest$(EXEEXT)
-       $(LINK) $(ziptest_OBJECTS) $(ziptest_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(tryopen_OBJECTS) $(tryopen_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -408,43 +790,34 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add_dir.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add_from_buffer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add_from_file.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add_from_filep.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add_from_zip.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deltest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encrypt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fopen_unchanged.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fread.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_comment.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/name_locate.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set_comment_all.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set_comment_localonly.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set_comment_removeglobal.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set_comment_revert.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hole.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modify.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/source_hole.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tryopen.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ziptest.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .c.lo:
-@am__fastdepCC_TRUE@   $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LTCOMPILE) -c -o $@ $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
 mostlyclean-libtool:
        -rm -f *.lo
@@ -452,26 +825,15 @@ mostlyclean-libtool:
 clean-libtool:
        -rm -rf .libs _libs
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -483,15 +845,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -500,101 +858,180 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-check-TESTS: $(TESTS)
-       @failed=0; all=0; xfail=0; xpass=0; skip=0; \
-       srcdir=$(srcdir); export srcdir; \
-       list=' $(TESTS) '; \
-       $(am__tty_colors); \
-       if test -n "$$list"; then \
-         for tst in $$list; do \
-           if test -f ./$$tst; then dir=./; \
-           elif test -f $$tst; then dir=; \
-           else dir="$(srcdir)/"; fi; \
-           if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
-             all=`expr $$all + 1`; \
-             case " $(XFAIL_TESTS) " in \
-             *[\ \     ]$$tst[\ \      ]*) \
-               xpass=`expr $$xpass + 1`; \
-               failed=`expr $$failed + 1`; \
-               col=$$red; res=XPASS; \
-             ;; \
-             *) \
-               col=$$grn; res=PASS; \
-             ;; \
-             esac; \
-           elif test $$? -ne 77; then \
-             all=`expr $$all + 1`; \
-             case " $(XFAIL_TESTS) " in \
-             *[\ \     ]$$tst[\ \      ]*) \
-               xfail=`expr $$xfail + 1`; \
-               col=$$lgn; res=XFAIL; \
-             ;; \
-             *) \
-               failed=`expr $$failed + 1`; \
-               col=$$red; res=FAIL; \
-             ;; \
-             esac; \
-           else \
-             skip=`expr $$skip + 1`; \
-             col=$$blu; res=SKIP; \
-           fi; \
-           echo "$${col}$$res$${std}: $$tst"; \
-         done; \
-         if test "$$all" -eq 1; then \
-           tests="test"; \
-           All=""; \
-         else \
-           tests="tests"; \
-           All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+       rm -f $< $@
+       $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+       @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+       @$(am__set_TESTS_bases); \
+       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+       redo_bases=`for i in $$bases; do \
+                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+                   done`; \
+       if test -n "$$redo_bases"; then \
+         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+         if $(am__make_dryrun); then :; else \
+           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
          fi; \
-         if test "$$failed" -eq 0; then \
-           if test "$$xfail" -eq 0; then \
-             banner="$$All$$all $$tests passed"; \
-           else \
-             if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
-             banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
-           fi; \
-         else \
-           if test "$$xpass" -eq 0; then \
-             banner="$$failed of $$all $$tests failed"; \
+       fi; \
+       if test -n "$$am__remaking_logs"; then \
+         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+              "recursion detected" >&2; \
+       else \
+         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+       fi; \
+       if $(am__make_dryrun); then :; else \
+         st=0;  \
+         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+         for i in $$redo_bases; do \
+           test -f $$i.trs && test -r $$i.trs \
+             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+           test -f $$i.log && test -r $$i.log \
+             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+         done; \
+         test $$st -eq 0 || exit 1; \
+       fi
+       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+       ws='[   ]'; \
+       results=`for b in $$bases; do echo $$b.trs; done`; \
+       test -n "$$results" || results=/dev/null; \
+       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+         success=true; \
+       else \
+         success=false; \
+       fi; \
+       br='==================='; br=$$br$$br$$br$$br; \
+       result_count () \
+       { \
+           if test x"$$1" = x"--maybe-color"; then \
+             maybe_colorize=yes; \
+           elif test x"$$1" = x"--no-color"; then \
+             maybe_colorize=no; \
            else \
-             if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
-             banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
            fi; \
-         fi; \
-         dashes="$$banner"; \
-         skipped=""; \
-         if test "$$skip" -ne 0; then \
-           if test "$$skip" -eq 1; then \
-             skipped="($$skip test was not run)"; \
+           shift; \
+           desc=$$1 count=$$2; \
+           if test $$maybe_colorize = yes && test $$count -gt 0; then \
+             color_start=$$3 color_end=$$std; \
            else \
-             skipped="($$skip tests were not run)"; \
+             color_start= color_end=; \
            fi; \
-           test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
-             dashes="$$skipped"; \
-         fi; \
-         report=""; \
-         if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
-           report="Please report to $(PACKAGE_BUGREPORT)"; \
-           test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
-             dashes="$$report"; \
-         fi; \
-         dashes=`echo "$$dashes" | sed s/./=/g`; \
-         if test "$$failed" -eq 0; then \
-           echo "$$grn$$dashes"; \
-         else \
-           echo "$$red$$dashes"; \
-         fi; \
-         echo "$$banner"; \
-         test -z "$$skipped" || echo "$$skipped"; \
-         test -z "$$report" || echo "$$report"; \
-         echo "$$dashes$$std"; \
-         test "$$failed" -eq 0; \
-       else :; fi
+           echo "$${color_start}# $$desc $$count$${color_end}"; \
+       }; \
+       create_testsuite_report () \
+       { \
+         result_count $$1 "TOTAL:" $$all   "$$brg"; \
+         result_count $$1 "PASS: " $$pass  "$$grn"; \
+         result_count $$1 "SKIP: " $$skip  "$$blu"; \
+         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+         result_count $$1 "FAIL: " $$fail  "$$red"; \
+         result_count $$1 "XPASS:" $$xpass "$$red"; \
+         result_count $$1 "ERROR:" $$error "$$mgn"; \
+       }; \
+       {                                                               \
+         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
+           $(am__rst_title);                                           \
+         create_testsuite_report --no-color;                           \
+         echo;                                                         \
+         echo ".. contents:: :depth: 2";                               \
+         echo;                                                         \
+         for b in $$bases; do echo $$b; done                           \
+           | $(am__create_global_log);                                 \
+       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
+       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
+       if $$success; then                                              \
+         col="$$grn";                                                  \
+        else                                                           \
+         col="$$red";                                                  \
+         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
+       fi;                                                             \
+       echo "$${col}$$br$${std}";                                      \
+       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
+       echo "$${col}$$br$${std}";                                      \
+       create_testsuite_report --maybe-color;                          \
+       echo "$$col$$br$$std";                                          \
+       if $$success; then :; else                                      \
+         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
+         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
+           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+         fi;                                                           \
+         echo "$$col$$br$$std";                                        \
+       fi;                                                             \
+       $$success || exit 1
+
+check-TESTS:
+       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+       exit $$?;
+recheck: all 
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       bases=`for i in $$bases; do echo $$i; done \
+                | $(am__list_recheck_tests)` || exit 1; \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       log_list=`echo $$log_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+               am__force_recheck=am--force-recheck \
+               TEST_LOGS="$$log_list"; \
+       exit $$?
+.test.log:
+       @p='$<'; \
+       $(am__set_b); \
+       $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@      @p='$<'; \
+@am__EXEEXT_TRUE@      $(am__set_b); \
+@am__EXEEXT_TRUE@      $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
 
 distdir: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -629,7 +1066,7 @@ distdir: $(DISTFILES)
 check-am: all-am
        $(MAKE) $(AM_MAKEFLAGS) check-TESTS
 check: check-am
-all-am: Makefile $(PROGRAMS)
+all-am: Makefile $(PROGRAMS) $(SCRIPTS)
 installdirs:
 install: install-am
 install-exec: install-exec-am
@@ -641,13 +1078,22 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
+       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
 
 clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
 
 distclean-generic:
        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
@@ -729,9 +1175,9 @@ uninstall-am:
 
 .MAKE: check-am install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
-       clean-generic clean-libtool clean-noinstPROGRAMS ctags \
-       distclean distclean-compile distclean-generic \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+       clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \
+       ctags ctags-am distclean distclean-compile distclean-generic \
        distclean-libtool distclean-tags distdir dvi dvi-am html \
        html-am info info-am install install-am install-data \
        install-data-am install-dvi install-dvi-am install-exec \
@@ -741,8 +1187,23 @@ uninstall-am:
        installcheck-am installdirs maintainer-clean \
        maintainer-clean-generic mostlyclean mostlyclean-compile \
        mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags uninstall uninstall-am
+       recheck tags tags-am uninstall uninstall-am
+
+
+check-am: bigzero.zip manyfiles.zip runtest
+
+bigzero.zip: bigzero-zip.zip
+       ${builddir}/modify ${srcdir}/bigzero-zip.zip cat 0 > ${builddir}/bigzero.zip
+
+manyfiles.zip: manyfiles-zip.zip
+       ${builddir}/modify ${srcdir}/manyfiles-zip.zip cat 0 > ${builddir}/manyfiles.zip
+
+runtest: runtest.in
+       sed -e 's!@[s]rcdir@!${srcdir}!g' -e 's!@[a]bs_srcdir@!${abs_srcdir}!g' ${srcdir}/runtest.in > runtest
+       chmod +x runtest
 
+cleanup:
+       rm -rf ${builddir}/sandbox-*.d[0-9]*/
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/regress/NiHTest.pm b/regress/NiHTest.pm
new file mode 100644 (file)
index 0000000..1dfbb51
--- /dev/null
@@ -0,0 +1,1121 @@
+package NiHTest;
+
+use strict;
+use warnings;
+
+use Cwd;
+use File::Copy;
+use File::Path qw(mkpath);
+use IPC::Open3;
+use Symbol 'gensym';
+use UNIVERSAL;
+
+use Data::Dumper qw(Dumper);
+
+#  NiHTest -- package to run regression tests
+#  Copyright (C) 2002-2014 Dieter Baron and Thomas Klausner
+#
+#  This file is part of ckmame, a program to check rom sets for MAME.
+#  The authors can be contacted at <ckmame@nih.at>
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions
+#  are met:
+#  1. Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#  2. Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#  3. The names of the authors may not be used to endorse or promote
+#     products derived from this software without specific prior
+#     written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+#  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+#  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+#  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+#  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+#  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+#  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+#  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# runtest TESTNAME
+#
+# files:
+#   TESTNAME.test: test scenario
+#
+# test scenario:
+#    Lines beginning with # are comments.
+#
+#    The following commands are recognized; return and args must
+#    appear exactly once, the others are optional.
+#
+#      args ARGS
+#          run program with command line arguments ARGS
+#
+#      description TEXT
+#          description of what test is for
+#
+#      features FEATURE ...
+#          only run test if all FEATUREs are present, otherwise skip it.
+#
+#      file TEST IN OUT
+#          copy file IN as TEST, compare against OUT after program run.
+#
+#      file-del TEST IN
+#          copy file IN as TEST, check that it is removed by program.
+#
+#      file-new TEST OUT
+#          check that file TEST is created by program and compare
+#          against OUT.
+#
+#      mkdir MODE NAME
+#          create directory NAME with permissions MODE.
+#
+#      pipein COMMAND ARGS ...
+#          pipe output of running COMMAND to program's stdin.
+#
+#      preload LIBRARY
+#          pre-load LIBRARY before running program.
+#
+#      program PRG
+#          run PRG instead of ckmame.
+#
+#      return RET
+#          RET is the expected exit code
+#
+#      setenv VAR VALUE
+#          set environment variable VAR to VALUE.
+#
+#      stderr TEXT
+#          program is expected to produce the error message TEXT.  If
+#          multiple stderr commands are used, the messages are
+#          expected in the order given.
+#
+#       stderr-replace REGEX REPLACEMENT
+#           run regex replacement over expected and got stderr output.
+#
+#      stdout TEXT
+#          program is expected to print TEXT to stdout.  If multiple
+#          stdout commands are used, the messages are expected in
+#          the order given.
+#
+#      touch MTIME FILE
+#          set last modified timestamp of FILE to MTIME (seconds since epoch).
+#          If FILE doesn't exist, an empty file is created.
+#
+#      ulimit C VALUE
+#          set ulimit -C to VALUE while running the program.
+#
+# exit status
+#      runtest uses the following exit codes:
+#          0: test passed
+#          1: test failed
+#          2: other error
+#         77: test was skipped
+#
+# environment variables:
+#   RUN_GDB: if set, run gdb on program in test environment
+#   KEEP_BROKEN: if set, don't delete test environment if test failed
+#   NO_CLEANUP: if set, don't delete test environment
+#   SETUP_ONLY: if set, exit after creating test environment
+#   VERBOSE: if set, be more verbose (e. g., output diffs)
+
+my %EXIT_CODES = (
+       PASS => 0,
+       FAIL => 1,
+       SKIP => 77,
+       ERROR => 99
+    );
+
+sub new {
+       my $class = UNIVERSAL::isa ($_[0], __PACKAGE__) ? shift : __PACKAGE__;
+       my $self = bless {}, $class;
+       
+       my ($opts) = @_;
+
+       $self->{default_program} = $opts->{default_program};
+       $self->{zipcmp} = $opts->{zipcmp} // 'zipcmp';
+       $self->{zipcmp_flags} = $opts->{zipcmp_flags};
+
+       $self->{directives} = {
+               args => { type => 'string...', once => 1, required => 1 },
+               description => { type => 'string', once => 1 },
+               features => { type => 'string...', once => 1 },
+               file => { type => 'string string string' },
+               'file-del' => { type => 'string string' },
+               'file-new' => { type => 'string string' },
+               mkdir => { type => 'string string' },
+               pipein => { type => 'string', once => 1 },
+               preload => { type => 'string', once => 1 },
+               program => { type => 'string', once => 1 },
+               'return' => { type => 'int', once => 1, required => 1 },
+               setenv => { type => 'string string' },
+               stderr => { type => 'string' },
+               'stderr-replace' => { type => 'string string' },
+               stdout => { type => 'string' },
+               touch => { type => 'int string' },
+               ulimit => { type => 'char string' }
+       };
+       
+       $self->{compare_by_type} = {};
+       $self->{copy_by_type} = {};
+       $self->{hooks} = {};
+
+       $self->add_comparator('zip/zip', \&comparator_zip);
+       
+       $self->{srcdir} = $opts->{srcdir} // $ENV{srcdir};
+       
+       if (!defined($self->{srcdir}) || $self->{srcdir} eq '') {
+               $self->{srcdir} = `sed -n 's/^srcdir = \(.*\)/\1/p' Makefile`;
+               chomp($self->{srcdir});
+       }
+       
+       $self->{in_sandbox} = 0;
+       
+       $self->{verbose} = $ENV{VERBOSE};
+       $self->{keep_broken} = $ENV{KEEP_BROKEN};
+       $self->{no_cleanup} = $ENV{NO_CLEANUP};
+       $self->{setup_only} = $ENV{SETUP_ONLY};
+
+       return $self;
+}
+
+
+sub add_comparator {
+       my ($self, $ext, $sub) = @_;
+       
+       return $self->add_file_proc('compare_by_type', $ext, $sub);
+}
+
+
+sub add_copier {
+       my ($self, $ext, $sub) = @_;
+
+       return $self->add_file_proc('copy_by_type', $ext, $sub);
+}
+
+
+sub add_directive {
+       my ($self, $name, $def) = @_;
+       
+       if (exists($self->{directives}->{$name})) {
+               $self->die("directive $name already defined");
+       }
+       
+       # TODO: validate $def
+       
+       $self->{directives}->{$name} = $def;
+       
+       return 1;
+}
+
+
+sub add_file_proc {
+       my ($self, $proc, $ext, $sub) = @_;
+
+       $self->{$proc}->{$ext} = [] unless (defined($self->{$proc}->{$ext}));
+       unshift @{$self->{$proc}->{$ext}}, $sub;
+
+       return 1;
+}
+
+
+sub add_hook {
+       my ($self, $hook, $sub) = @_;
+       
+       $self->{hooks}->{$hook} = [] unless (defined($self->{hooks}->{$hook}));
+       push @{$self->{hooks}->{$hook}}, $sub;
+
+       return 1;
+}
+
+
+sub end {
+       my ($self, @results) = @_;
+
+       my $result = 'PASS';
+
+       for my $r (@results) {
+               if ($r eq 'ERROR' || ($r eq 'FAIL' && $result ne 'ERROR')) {
+                       $result = $r;
+               }
+       }
+
+       $self->end_test($result);
+}
+
+
+sub run {
+       my ($self, @argv) = @_;
+
+       $self->setup(@argv);
+
+       $self->end($self->runtest());
+}
+
+
+sub runtest {
+       my ($self, $tag) = @_;
+
+       $ENV{TZ} = "UTC";
+       $ENV{LC_CTYPE} = "C";
+       $self->sandbox_create($tag);
+       $self->sandbox_enter();
+       
+       my $ok = 1;
+       $ok &= $self->copy_files();
+       $ok &= $self->run_hook('post_copy_files');
+       $ok &= $self->touch_files();
+       $ok &= $self->run_hook('prepare_sandbox');
+       return 'ERROR' unless ($ok);
+
+       if ($self->{setup_only}) {
+               $self->sandbox_leave();
+               return 'SKIP';
+       }
+
+       for my $env (@{$self->{test}->{'setenv'}}) {
+               $ENV{$env->[0]} = $env->[1];
+       }
+       if (defined($self->{test}->{'preload'})) {
+               $ENV{LD_PRELOAD} = cwd() . "/../.libs/$self->{test}->{'preload'}";
+       }
+
+       $self->run_program();
+
+       for my $env (@{$self->{test}->{'setenv'}}) {
+               delete ${ENV{$env->[0]}};
+       }
+       if (defined($self->{test}->{'preload'})) {
+               delete ${ENV{LD_PRELOAD}};
+       }
+
+       if ($self->{test}->{stdout}) {
+               $self->{expected_stdout} = [ @{$self->{test}->{stdout}} ];
+       }
+       else {
+               $self->{expected_stdout} = [];
+       }
+       if ($self->{test}->{stderr}) {
+               $self->{expected_stderr} = [ @{$self->{test}->{stderr}} ];
+       }
+       else {
+               $self->{expected_stderr} = [];
+       }
+
+       $self->run_hook('post_run_program');
+
+       my @failed = ();
+       
+       if ($self->{exit_status} != $self->{test}->{return} // 0) {
+               push @failed, 'exit status';
+               if ($self->{verbose}) {
+                       print "Unexpected exit status:\n";
+                       print "-" . ($self->{test}->{return} // 0) . "\n+$self->{exit_status}\n";
+               }
+       }
+       
+       if (!$self->compare_arrays($self->{expected_stdout}, $self->{stdout}, 'output')) {
+               push @failed, 'output';
+       }
+       if (!$self->compare_arrays($self->{expected_stderr}, $self->{stderr}, 'error output')) {
+               push @failed, 'error output';
+       }
+       if (!$self->compare_files()) {
+               push @failed, 'files';
+       }
+       
+       $self->{failed} = \@failed;
+       
+       $self->run_hook('checks');
+       
+       my $result = scalar(@{$self->{failed}}) == 0 ? 'PASS' : 'FAIL';
+
+       $self->sandbox_leave();
+       if (!($self->{no_cleanup} || ($self->{keep_broken} && $result eq 'FAIL'))) {
+               $self->sandbox_remove();
+       }
+
+       $self->print_test_result($tag, $result, join ', ', @{$self->{failed}});
+
+       return $result;
+}
+
+
+sub setup {
+       my ($self, @argv) = @_;
+       
+       if (scalar(@argv) != 1) {
+               print STDERR "Usage: $0 testcase\n";
+               exit(1);
+       }
+       
+       my $testcase = shift @argv;
+
+       $testcase .= '.test' unless ($testcase =~ m/\.test$/);
+
+       my $testcase_file = $self->find_file($testcase);
+       
+       $self->die("cannot find test case $testcase") unless ($testcase_file);
+       
+       $testcase =~ s,^(?:.*/)?([^/]*)\.test$,$1,;
+       $self->{testname} = $testcase;
+
+       $self->die("error in test case definition") unless $self->parse_case($testcase_file);
+       
+       $self->check_features_requirement() if ($self->{test}->{features});
+}
+
+
+#
+# internal methods
+#
+
+sub add_file {
+       my ($self, $file) = @_;
+       
+       if (defined($self->{files}->{$file->{destination}})) {
+               $self->warn("duplicate specification for input file $file->{destination}");
+               return undef;
+       }
+        
+       $self->{files}->{$file->{destination}} = $file;
+       
+       return 1;
+}
+
+
+sub check_features_requirement() {
+       my ($self) = @_;
+       
+       ### TODO: implement
+       
+       return 1;
+}
+
+
+sub comparator_zip {
+       my ($self, $got, $expected) = @_;
+
+       my @args = ($self->{zipcmp}, $self->{verbose} ? '-pv' : '-pq');
+       push @args, $self->{zipcmp_flags} if ($self->{zipcmp_flags});
+       push @args, ($expected, $got);
+        
+       my $ret = system(@args);
+       
+       return $ret == 0;
+}
+
+
+sub compare_arrays() {
+       my ($self, $a, $b, $tag) = @_;
+       
+       my $ok = 1;
+       
+       if (scalar(@$a) != scalar(@$b)) {
+               $ok = 0;
+       }
+       else {
+               for (my $i = 0; $i < scalar(@$a); $i++) {
+                       if ($a->[$i] ne $b->[$i]) {
+                               $ok = 0;
+                               last;
+                       }
+               }
+       }
+       
+       if (!$ok && $self->{verbose}) {
+               print "Unexpected $tag:\n";
+               print "--- expected\n+++ got\n";
+
+               diff_arrays($a, $b);
+       }
+       
+       return $ok;
+}
+
+
+sub compare_file() {
+       my ($self, $got, $expected) = @_;
+       
+       my $real_expected = $self->find_file($expected);
+       unless ($real_expected) {
+               $self->warn("cannot find expected result file $expected");
+               return 0;
+       }
+
+       my $ok = $self->run_comparator($got, $real_expected);
+
+       if (!defined($ok)) {
+               my $ret;
+               if ($self->{verbose}) {
+                       $ret = system('diff', '-u', $real_expected, $got);
+               }
+               else {
+                       $ret = system('cmp', '-s', $real_expected, $got);
+               }
+               $ok = ($ret == 0);
+       }
+
+       return $ok;
+}
+
+
+sub compare_files() {
+       my ($self) = @_;
+       
+       my $ok = 1;
+       
+       my $ls;
+       open $ls, "find . -type f -print |";
+       unless ($ls) {
+               # TODO: handle error
+       }
+       my @files_got = ();
+       
+       while (my $line = <$ls>) {
+               chomp $line;
+               $line =~ s,^\./,,;
+               push @files_got, $line;
+       }
+       close($ls);
+       
+       @files_got = sort @files_got;
+       my @files_should = ();
+       
+        for my $file (sort keys %{$self->{files}}) {
+               push @files_should, $file if ($self->{files}->{$file}->{result} || $self->{files}->{$file}->{ignore});
+       }
+
+       $self->{files_got} = \@files_got;
+       $self->{files_should} = \@files_should;
+
+       unless ($self->run_hook('post_list_files')) {
+               return 0;
+       }
+       
+       $ok = $self->compare_arrays($self->{files_should}, $self->{files_got}, 'files');
+       
+       for my $file (@{$self->{files_got}}) {
+               my $file_def = $self->{files}->{$file};
+               next unless ($file_def && $file_def->{result});
+               
+               $ok &= $self->compare_file($file, $file_def->{result});
+       }
+       
+       return $ok;
+}
+
+
+sub copy_files {
+       my ($self) = @_;
+       
+       my $ok = 1;
+       
+       for my $filename (sort keys %{$self->{files}}) {
+               my $file = $self->{files}->{$filename};
+               next unless ($file->{source});
+
+               my $src = $self->find_file($file->{source});
+               unless ($src) {
+                       $self->warn("cannot find input file $file->{source}");
+                       $ok = 0;
+                       next;
+               }
+
+               if ($file->{destination} =~ m,/,) {
+                       my $dir = $file->{destination};
+                       $dir =~ s,/[^/]*$,,;
+                       if (! -d $dir) {
+                               mkpath($dir);
+                       }
+               }
+
+               my $this_ok = $self->run_copier($src, $file->{destination});
+               if (defined($this_ok)) {
+                       $ok &= $this_ok;
+               }
+               else {
+                       unless (copy($src, $file->{destination})) {
+                               $self->warn("cannot copy $src to $file->{destination}: $!");
+                               $ok = 0;
+                       }
+               }
+       }
+
+       if (defined($self->{test}->{mkdir})) {
+               for my $dir_spec (@{$self->{test}->{mkdir}}) {
+                       my ($mode, $dir) = @$dir_spec;
+                       if (! -d $dir) {
+                               unless (mkdir($dir, oct($mode))) {
+                                       $self->warn("cannot create directory $dir: $!");
+                                       $ok = 0;
+                               }
+                       }
+               }
+       }
+       
+       $self->die("failed to copy input files") unless ($ok);
+}
+
+
+sub die() {
+       my ($self, $msg) = @_;
+       
+       print STDERR "$0: $msg\n" if ($msg);
+       
+       $self->end_test('ERROR');
+}
+
+
+sub end_test {
+       my ($self, $status) = @_;
+       
+       my $exit_code = $EXIT_CODES{$status} // $EXIT_CODES{ERROR};
+       
+       $self->exit($exit_code);
+}
+
+
+
+sub exit() {
+       my ($self, $status) = @_;
+       ### TODO: cleanup
+       
+       exit($status);
+}
+
+
+sub find_file() {
+       my ($self, $fname) = @_;
+       
+       for my $dir (('', "$self->{srcdir}/")) {
+               my $f = "$dir$fname";
+               $f = "../$f" if ($self->{in_sandbox} && $dir !~ m,^/,);
+               
+               return $f if (-f $f);
+       }
+       
+       return undef;
+}
+
+
+sub get_extension {
+       my ($self, $fname) = @_;
+
+       my $ext = $fname;
+       if ($ext =~ m/\./) {
+               $ext =~ s/.*\.//;
+       }
+       else {
+               $ext = '';
+       }
+
+       return $ext;
+}
+
+
+sub parse_args {
+       my ($self, $type, $str) = @_;
+
+       if ($type eq 'string...') {
+               my $args = [];
+
+               while ($str ne '') {
+                       if ($str =~ m/^\"/) {
+                               unless ($str =~ m/^\"([^\"]*)\"\s*(.*)/) {
+                                       $self->warn_file_line("unclosed quote in [$str]");
+                                       return undef;
+                               }
+                               push @$args, $1;
+                               $str = $2;
+                       }
+                       else {
+                               $str =~ m/^(\S+)\s*(.*)/;
+                               push @$args, $1;
+                               $str = $2;
+                       }
+               }
+
+               return $args;
+       }
+       elsif ($type =~ m/(\s|\.\.\.$)/) {
+               my $ellipsis = 0;
+               if ($type =~ m/(.*)\.\.\.$/) {
+                       $ellipsis = 1;
+                       $type = $1;
+               }
+               my @types = split /\s+/, $type;
+               my @strs = split /\s+/, $str;
+               
+               if (!$ellipsis && scalar(@types) != scalar(@strs)) {
+                       $self->warn_file_line("expected " . (scalar(@types)) . " arguments, got " . (scalar(@strs)));
+                       return undef;
+               }
+               
+               my $args = [];
+               
+               my $n = scalar(@types);
+               for (my $i=0; $i<scalar(@strs); $i++) {
+                       my $val = $self->parse_args(($i >= $n ? $types[$n-1] : $types[$i]), $strs[$i]);
+                       return undef unless (defined($val));
+                       push @$args, $val;
+               }
+               
+               return $args;
+       }
+       else {
+               if ($type eq 'string') {
+                       return $str;
+               }
+               elsif ($type eq 'int') {
+                       if ($str !~ m/^\d+$/) {
+                               $self->warn_file_line("illegal int [$str]");
+                               return undef;
+                       }
+                       return $str+0;
+               }
+               elsif ($type eq 'char') {
+                       if ($str !~ m/^.$/) {
+                               $self->warn_file_line("illegal char [$str]");
+                               return undef;
+                       }
+                       return $str;
+               }
+               else {
+                       $self->warn_file_line("unknown type $type");
+                       return undef;
+               }
+       }
+}
+
+
+sub parse_case() {
+       my ($self, $fname) = @_;
+       
+       my $ok = 1;
+       
+       open TST, "< $fname" or $self->die("cannot open test case $fname: $!");
+       
+       $self->{testcase_fname} = $fname;
+       
+       my %test = ();
+       
+       while (my $line = <TST>) {
+               chomp $line;
+               
+               next if ($line =~ m/^\#/);
+               
+               unless ($line =~ m/(\S*)(?:\s(.*))?/) {
+                       $self->warn_file_line("cannot parse line $line");
+                       $ok = 0;
+                       next;
+               }
+               my ($cmd, $argstring) = ($1, $2//"");
+               
+               my $def = $self->{directives}->{$cmd};
+               
+               unless ($def) {
+                       $self->warn_file_line("unknown directive $cmd in test file");
+                       $ok = 0;
+                       next;
+               }
+               
+               my $args = $self->parse_args($def->{type}, $argstring);
+
+               if (!defined($args)) {
+                       $ok = 0;
+                       next;
+               }
+               
+               if ($def->{once}) {
+                       if (defined($test{$cmd})) {
+                               $self->warn_file_line("directive $cmd appeared twice in test file");
+                       }
+                       $test{$cmd} = $args;
+               }
+               else {
+                       $test{$cmd} = [] unless (defined($test{$cmd}));
+                       push @{$test{$cmd}}, $args;
+               }
+       }
+
+       close TST;
+       
+       return undef unless ($ok);
+       
+       for my $cmd (sort keys %test) {
+               if ($self->{directives}->{$cmd}->{required} && !defined($test{$cmd})) {
+                       $self->warn_file("required directive $cmd missing in test file");
+                       $ok = 0;
+               }
+       }
+       
+       return undef unless ($ok);
+
+       if (defined($test{'stderr-replace'}) && defined($test{stderr})) {
+               $test{stderr} = [ map { $self->stderr_rewrite($test{'stderr-replace'}, $_); } @{$test{stderr}} ];
+       }
+
+       if (!defined($test{program})) {
+               $test{program} = $self->{default_program};
+       }
+
+       $self->{test} = \%test;
+
+       $self->run_hook('mangle_program');
+       
+       if (!$self->parse_postprocess_files()) {
+               return 0;
+       }
+
+       return $self->run_hook('post_parse');
+}
+
+
+sub parse_postprocess_files {
+       my ($self) = @_;
+       
+       $self->{files} = {};
+       
+       my $ok = 1;
+       
+       for my $file (@{$self->{test}->{file}}) {
+               $ok = 0 unless ($self->add_file({ source => $file->[1], destination => $file->[0], result => $file->[2] }));
+       }
+       
+       for my $file (@{$self->{test}->{'file-del'}}) {
+               $ok = 0 unless ($self->add_file({ source => $file->[1], destination => $file->[0], result => undef }));
+       }
+       
+       for my $file (@{$self->{test}->{'file-new'}}) {
+               $ok = 0 unless ($self->add_file({ source => undef, destination => $file->[0], result => $file->[1] }));
+       }
+       
+       return $ok;
+}
+
+
+sub print_test_result {
+       my ($self, $tag, $result, $reason) = @_;
+
+       if ($self->{verbose}) {
+               print "$self->{testname}";
+               print " ($tag)" if ($tag);
+               print " -- $result";
+               print ": $reason" if ($reason);
+               print "\n";
+       }
+}
+
+
+sub run_comparator {
+       my ($self, $got, $expected) = @_;
+
+       return $self->run_file_proc('compare_by_type', $got, $expected);
+}
+
+
+sub run_copier {
+       my ($self, $src, $dest) = @_;
+
+       return $self->run_file_proc('copy_by_type', $src, $dest);
+}
+
+
+sub run_file_proc {
+       my ($self, $proc, $got, $expected) = @_;
+
+       my $ext = ($self->get_extension($got)) . '/' . ($self->get_extension($expected));
+
+       if (defined($self->{$proc}->{$ext})) {
+               for my $sub (@{$self->{$proc}->{$ext}}) {
+                       my $ret = $sub->($self, $got, $expected);
+                       return $ret if (defined($ret));
+               }
+       }
+
+       return undef;
+}
+
+
+sub run_hook {
+       my ($self, $hook) = @_;
+       
+       my $ok = 1;
+       
+       if (defined($self->{hooks}->{$hook})) {
+               for my $sub (@{$self->{hooks}->{$hook}}) {
+                       unless ($sub->($self, $hook)) {
+                               $self->warn("hook $hook failed");
+                               $ok = 0;
+                       }
+               }
+       }
+       
+       return $ok;
+}
+
+
+sub backslash_decode {
+       my ($str) = @_;
+
+       if ($str =~ m/\\/) {
+               $str =~ s/\\a/\a/gi;
+               $str =~ s/\\b/\b/gi;
+               $str =~ s/\\f/\f/gi;
+               $str =~ s/\\n/\n/gi;
+               $str =~ s/\\r/\r/gi;
+               $str =~ s/\\t/\t/gi;
+               $str =~ s/\\v/\cK/gi;
+               $str =~ s/\\s/ /gi;
+               # TODO: \xhh, \ooo
+               $str =~ s/\\(.)/$1/g;
+       }
+
+       return $str;
+}
+
+
+sub run_program {
+       my ($self) = @_;
+       
+       my ($stdin, $stdout, $stderr);
+       $stderr = gensym;
+
+       my @cmd = ('../' . $self->{test}->{program}, map ({ backslash_decode($_); } @{$self->{test}->{args}}));
+
+       ### TODO: catch errors?
+       
+       my $pid = open3($stdin, $stdout, $stderr, @cmd);
+       
+       $self->{stdout} = [];
+       $self->{stderr} = [];
+        
+        if ($self->{test}->{pipein}) {
+                my $fh;
+                open($fh, "$self->{test}->{pipein} |");
+                if (!defined($fh)) {
+                        $self->die("cannot run pipein command [$self->{test}->{pipein}: $!");
+                }
+                while (my $line = <$fh>) {
+                        print $stdin $line;
+                }
+                close($fh);
+                close($stdin);
+        }
+       
+       while (my $line = <$stdout>) {
+               chomp $line;
+               push @{$self->{stdout}}, $line;
+       }
+       my $prg = $self->{test}->{program};
+       $prg =~ s,.*/,,;
+       while (my $line = <$stderr>) {
+               chomp $line;
+
+               $line =~ s/^[^: ]*$prg: //;
+               if (defined($self->{test}->{'stderr-replace'})) {
+                       $line = $self->stderr_rewrite($self->{test}->{'stderr-replace'}, $line);
+               }
+               push @{$self->{stderr}}, $line;
+       }
+       
+       waitpid($pid, 0);
+       
+       $self->{exit_status} = $? >> 8;
+}
+
+
+sub sandbox_create {
+       my ($self, $tag) = @_;
+       
+       $tag = ($tag ? "-$tag" : "");
+       $self->{sandbox_dir} = "sandbox-$self->{testname}$tag.d$$";
+       
+       $self->die("sandbox $self->{sandbox_dir} already exists") if (-e $self->{sandbox_dir});
+       
+       mkdir($self->{sandbox_dir}) or $self->die("cannot create sandbox $self->{sandbox_dir}: $!");
+       
+       return 1;
+}
+
+
+sub sandbox_enter {
+       my ($self) = @_;
+       
+       $self->die("internal error: cannot enter sandbox before creating it") unless (defined($self->{sandbox_dir}));
+
+       return if ($self->{in_sandbox});
+
+       chdir($self->{sandbox_dir}) or $self->die("cant cd into sandbox $self->{sandbox_dir}: $!");
+       
+       $self->{in_sandbox} = 1;
+}
+
+
+sub sandbox_leave {
+       my ($self) = @_;
+       
+       return if (!$self->{in_sandbox});
+       
+       chdir('..') or $self->die("cannot leave sandbox: $!");
+       
+       $self->{in_sandbox} = 0;
+}
+
+
+sub sandbox_remove {
+       my ($self) = @_;
+
+       my $ok = 1;
+       unless (system('chmod', '-R', 'u+rwx', $self->{sandbox_dir}) == 0) {
+               $self->warn("can't ensure that sandbox is writable: $!");
+       }
+       unless (system('rm', '-rf', $self->{sandbox_dir}) == 0) {
+               $self->warn("can't remove sandbox: $!");
+               $ok = 0;
+       }
+       
+       return $ok;
+}
+
+
+sub touch_files {
+       my ($self) = @_;
+       
+       my $ok = 1;
+       
+       if (defined($self->{test}->{touch})) {
+               for my $args (@{$self->{test}->{touch}}) {
+                       my ($mtime, $fname) = @$args;
+                       
+                       if (!-f $fname) {
+                               my $fh;
+                               unless (open($fh, "> $fname") and close($fh)) {
+                                       # TODO: error message
+                                       $ok = 0;
+                                       next;
+                               }
+                       }
+                       unless (utime($mtime, $mtime, $fname) == 1) {
+                               # TODO: error message
+                               $ok = 0;
+                       }
+               }
+       }
+       
+       return $ok;
+}
+
+
+sub warn {
+       my ($self, $msg) = @_;
+       
+       print STDERR "$0: $msg\n";
+}
+
+
+sub warn_file {
+       my ($self, $msg) = @_;
+       
+       $self->warn("$self->{testcase_fname}: $msg");
+}
+
+
+sub warn_file_line {
+       my ($self, $msg) = @_;
+       
+       $self->warn("$self->{testcase_fname}:$.: $msg");
+}
+
+sub stderr_rewrite {
+       my ($self, $pattern, $line) = @_;
+       for my $repl (@{$pattern}) {
+               $line =~ s/$repl->[0]/$repl->[1]/;
+       }
+       return $line;
+}
+
+
+# MARK: array diff
+
+sub diff_arrays {
+       my ($a, $b) = @_;
+
+       my ($i, $j);
+       for ($i = $j = 0; $i < scalar(@$a) || $j < scalar(@$b);) {
+               if ($i >= scalar(@$a)) {
+                       print "+$b->[$j]\n";
+                       $j++;
+               }
+               elsif ($j >= scalar(@$b)) {
+                       print "-$a->[$i]\n";
+                       $i++;
+               }
+               elsif ($a->[$i] eq $b->[$j]) {
+                       print " $a->[$i]\n";
+                       $i++;
+                       $j++;
+               }
+               else {
+                       my ($off_a, $off_b) = find_best_offsets($a, $i, $b, $j);
+                       my ($off_b_2, $off_a_2) = find_best_offsets($b, $j, $a, $i);
+
+                       if ($off_a + $off_b > $off_a_2 + $off_b_2) {
+                               $off_a = $off_a_2;
+                               $off_b = $off_b_2;
+                       }
+
+                       for (my $off = 0; $off < $off_a; $off++) {
+                               print "-$a->[$i]\n";
+                               $i++;
+                       }
+                       for (my $off = 0; $off < $off_b; $off++) {
+                               print "+$b->[$j]\n";
+                               $j++;
+                       }
+               }
+       }
+
+}
+
+sub find_best_offsets {
+       my ($a, $i, $b, $j) = @_;
+
+       my ($best_a, $best_b);
+
+       for (my $off_a = 0; $off_a < (defined($best_a) ? $best_a + $best_b : scalar(@$a) - $i); $off_a++) {
+               my $off_b = find_entry($a->[$i+$off_a], $b, $j, defined($best_a) ? $best_a + $best_b - $off_a : scalar(@$b) - $j);
+
+               next unless (defined($off_b));
+
+               if (!defined($best_a) || $best_a + $best_b > $off_a + $off_b) {
+                       $best_a = $off_a;
+                       $best_b = $off_b;
+               }
+       }
+
+       if (!defined($best_a)) {
+               return (scalar(@$a) - $i, scalar(@$b) - $j);
+       }
+       
+       return ($best_a, $best_b);
+}
+
+sub find_entry {
+       my ($entry, $array, $start, $max_offset) = @_;
+
+       for (my $offset = 0; $offset < $max_offset; $offset++) {
+               return $offset if ($array->[$start + $offset] eq $entry);
+       }
+
+       return undef;
+}
+
+1;
index 8613b05..9b75559 100644 (file)
@@ -1,5 +1,5 @@
 # add directories to zip
-program add_dir
+program modify
 return 0
-args testdir.zip
+args testdir.zip   add_dir testdir/   add_dir testdir-noslash
 file-new testdir.zip testdir.zip
index ff6c472..d0a1ebb 100644 (file)
@@ -1,5 +1,5 @@
 # add buffer contents as file to zip
-program add_from_buffer
+program modify
 return 0
-args testbuffer.zip
+args testbuffer.zip add teststring.txt "This is a test, and it seems to have been successful.\n"
 file-new testbuffer.zip testbuffer.zip
index 279fbe1..8619167 100644 (file)
@@ -1,6 +1,6 @@
 # add file to zip
-program add_from_file
+program modify
 return 0
-args testfile.zip testfile.txt
+args -- testfile.zip   add_file testfile.txt testfile.txt 0 -1
 file testfile.txt testfile.txt testfile.txt
 file-new testfile.zip testfile.zip
diff --git a/regress/add_from_file_duplicate.test b/regress/add_from_file_duplicate.test
new file mode 100644 (file)
index 0000000..7aca619
--- /dev/null
@@ -0,0 +1,7 @@
+# add already existing file to zip, making duplicate names
+program modify
+return 1
+args -- testfile.zip   add_file testfile.txt testfile.txt 0 -1
+file testfile.txt testfile.txt testfile.txt
+file testfile.zip testfile.zip testfile.zip
+stderr can't add file 'testfile.txt': File already exists
diff --git a/regress/add_from_file_twice_duplicate.test b/regress/add_from_file_twice_duplicate.test
new file mode 100644 (file)
index 0000000..e5a0f99
--- /dev/null
@@ -0,0 +1,7 @@
+# add file to zip twice, making duplicate names
+program modify
+return 1
+args -- testfile.zip   add_file testfile.txt testfile.txt 0 -1   add_file testfile.txt testfile.txt 0 -1
+file testfile.txt testfile.txt testfile.txt
+file-new testfile.zip testfile.zip
+stderr can't add file 'testfile.txt': File already exists
index 059e957..c97b99e 100644 (file)
@@ -1,6 +1,6 @@
 /*
   add_from_filep.c -- test case for adding file to archive
-  Copyright (C) 1999, 2003, 2005 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -31,7 +31,6 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <errno.h>
 #include <stdio.h>
@@ -48,9 +47,8 @@ main(int argc, char *argv[])
     const char *archive;
     const char *file;
     const char *name;
-    struct zip *za;
-    struct zip_source *zs;
-    char buf[100];
+    zip_t *za;
+    zip_source_t *zs;
     int err;
     FILE *fp;
 
@@ -65,20 +63,21 @@ main(int argc, char *argv[])
     file = argv[2];
     
     if ((za=zip_open(archive, ZIP_CREATE, &err)) == NULL) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't open zip archive %s: %s\n", prg,
-               archive, buf);
+       zip_error_t error;
+       zip_error_init_with_code(&error, err);
+       fprintf(stderr, "%s: can't open zip archive '%s': %s\n", prg, archive, zip_error_strerror(&error));
+       zip_error_fini(&error);
        return 1;
     }
 
     if ((fp=fopen(file, "r")) == NULL) {
-       fprintf(stderr, "%s: can't open input file `%s': %s\n", prg,
+       fprintf(stderr, "%s: can't open input file '%s': %s\n", prg,
                file, strerror(errno));
        return 1;
     }
 
     if ((zs=zip_source_filep(za, fp, 0, -1)) == NULL) {
-       fprintf(stderr, "%s: error creating file source for `%s': %s\n", prg,
+       fprintf(stderr, "%s: error creating file source for '%s': %s\n", prg,
                file, zip_strerror(za));
        return 1;
     }
@@ -88,14 +87,14 @@ main(int argc, char *argv[])
 
     if (zip_add(za, name, zs) == -1) {
        zip_source_free(zs);
-       fprintf(stderr, "%s: can't add file `%s': %s\n", prg,
+       fprintf(stderr, "%s: can't add file '%s': %s\n", prg,
                file, zip_strerror(za));
        return 1;
     }
 
     if (zip_close(za) == -1) {
-       fprintf(stderr, "%s: can't close zip archive `%s'\n", prg,
-               archive);
+       fprintf(stderr, "%s: can't close zip archive '%s': %s\n", prg,
+               archive, zip_strerror(za));
        return 1;
     }
 
diff --git a/regress/add_from_stdin.test b/regress/add_from_stdin.test
new file mode 100644 (file)
index 0000000..cf8a937
--- /dev/null
@@ -0,0 +1,6 @@
+# add stdin to zip
+pipein echo This is a test, and it seems to have been successful.
+program modify
+args -- teststdin.zip add_file teststring.txt /dev/stdin 0 -1
+return 0
+file-new teststdin.zip teststdin.zip
diff --git a/regress/add_from_zip.c b/regress/add_from_zip.c
deleted file mode 100644 (file)
index f509fb7..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
-  add_from_zip.c -- test case for adding file from archive to archive
-  Copyright (C) 2010 Dieter Baron and Thomas Klausner
-
-  This file is part of libzip, a library to manipulate ZIP archives.
-  The authors can be contacted at <libzip@nih.at>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
-  1. Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-  2. Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in
-     the documentation and/or other materials provided with the
-     distribution.
-  3. The names of the authors may not be used to endorse or promote
-     products derived from this software without specific prior
-     written permission.
-  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-\f
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "zip.h"
-
-static const char *prg;
-
-int
-main(int argc, char *argv[])
-{
-    const char *source;
-    const char *archive;
-    const char *file;
-    int file_idx;
-    struct zip *z_in;
-    struct zip *z_out;
-    struct zip_source *zs;
-    char buf[100];
-    int err;
-
-    prg = argv[0];
-
-    if (argc != 4) {
-       fprintf(stderr, "usage: %s source-archive target-archive file\n", prg);
-       return 1;
-    }
-
-    source = argv[1];
-    archive = argv[2];
-    file = argv[3];
-
-    if ((z_in=zip_open(source, ZIP_CHECKCONS, &err)) == NULL) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't open source zip archive %s: %s\n", prg,
-               source, buf);
-       return 1;
-    }
-
-    if ((file_idx=zip_name_locate(z_in, file, 0)) == -1) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't find file `%s' in source zip archive %s: %s\n",
-               prg, file, source, buf);
-       return 1;
-    }
-
-    if ((z_out=zip_open(archive, ZIP_CREATE, &err)) == NULL) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't open target zip archive %s: %s\n", prg,
-               archive, buf);
-       return 1;
-    }
-
-    if ((zs=zip_source_zip(z_out, z_in, file_idx, 0, 0, -1)) == NULL) {
-       fprintf(stderr, "%s: error creating file source for `%s': %s\n", prg,
-               file, zip_strerror(z_out));
-       return 1;
-    }
-
-    if (zip_add(z_out, file, zs) == -1) {
-       zip_source_free(zs);
-       fprintf(stderr, "%s: can't add file `%s': %s\n", prg,
-               file, zip_strerror(z_out));
-       return 1;
-    }
-
-    if (zip_close(z_out) == -1) {
-       fprintf(stderr, "%s: can't close zip archive `%s'\n", prg,
-               archive);
-       return 1;
-    }
-
-    return 0;
-}
diff --git a/regress/add_from_zip.test b/regress/add_from_zip.test
deleted file mode 100644 (file)
index 53dcfd7..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-# add file from zip to zip
-program add_from_zip
-return 0
-args teststored.zip testfile.zip empty.txt
-file teststored.zip teststored.zip teststored.zip
-file-new testfile.zip teststored.zip
diff --git a/regress/add_from_zip_closed.test b/regress/add_from_zip_closed.test
new file mode 100644 (file)
index 0000000..c90306f
--- /dev/null
@@ -0,0 +1,6 @@
+# add deflated file from zip to zip, but close the source before it can be read
+program modify
+return 1
+args -- testfile.zip   add_from_zip abac-repeat.txt testdeflated.zzip 0 0 -1  zin_close 0
+file testdeflated.zzip testdeflated.zip testdeflated.zip
+stderr can't close zip archive 'testfile.zip': Containing zip archive was closed
diff --git a/regress/add_from_zip_deflated.test b/regress/add_from_zip_deflated.test
new file mode 100644 (file)
index 0000000..c88582e
--- /dev/null
@@ -0,0 +1,6 @@
+# add deflated file from zip to zip
+program modify
+return 0
+args -- testfile.zip   add_from_zip abac-repeat.txt testdeflated.zzip 0 0 -1
+file testdeflated.zzip testdeflated.zip testdeflated.zip
+file-new testfile.zip testdeflated.zip
diff --git a/regress/add_from_zip_deflated2.test b/regress/add_from_zip_deflated2.test
new file mode 100644 (file)
index 0000000..03a6c1b
--- /dev/null
@@ -0,0 +1,6 @@
+# add deflated files from zip to zip
+program modify
+return 0
+args -- testfile.zip   add_from_zip abac-repeat.txt testdeflated.zzip 0 0 -1  add_from_zip abac-repeat2.txt testdeflated.zzip 0 0 -1
+file testdeflated.zzip testdeflated.zip testdeflated.zip
+file-new testfile.zip testdeflated2.zip
diff --git a/regress/add_from_zip_partial_deflated.test b/regress/add_from_zip_partial_deflated.test
new file mode 100644 (file)
index 0000000..f848a48
--- /dev/null
@@ -0,0 +1,6 @@
+# add parts of a file from zip to zip
+program modify
+return 0
+args -- testfile.zip   add_from_zip first firstsecond.zzip 0 0 9   add_from_zip second firstsecond.zzip 0 9 -1
+file firstsecond.zzip firstsecond.zip firstsecond.zip
+file-new testfile.zip firstsecond-split-stored.zip
diff --git a/regress/add_from_zip_partial_stored.test b/regress/add_from_zip_partial_stored.test
new file mode 100644 (file)
index 0000000..fd1be84
--- /dev/null
@@ -0,0 +1,6 @@
+# add parts of a file from zip to zip
+program modify
+return 0
+args -- testfile.zip   add_from_zip first firstsecond.zzip 1 0 9   add_from_zip second firstsecond.zzip 1 9 -1
+file firstsecond.zzip firstsecond.zip firstsecond.zip
+file-new testfile.zip firstsecond-split-stored.zip
diff --git a/regress/add_from_zip_stored.test b/regress/add_from_zip_stored.test
new file mode 100644 (file)
index 0000000..02ee33e
--- /dev/null
@@ -0,0 +1,6 @@
+# add stored file from zip to zip
+program modify
+return 0
+args -- testfile.zip   add_from_zip abac-repeat.txt teststored.zzip 0 0 -1
+file teststored.zzip teststored.zip teststored.zip
+file-new testfile.zip testdeflated.zip
diff --git a/regress/add_stored.test b/regress/add_stored.test
new file mode 100644 (file)
index 0000000..628387e
--- /dev/null
@@ -0,0 +1,5 @@
+# add file, set compression method to ZIP_CM_STORE
+program modify
+return 0
+args -n test.zip add foo foo  set_file_compression 0 store 0
+file-new test.zip foo-stored.zip
diff --git a/regress/add_stored_in_memory.test b/regress/add_stored_in_memory.test
new file mode 100644 (file)
index 0000000..9b13849
--- /dev/null
@@ -0,0 +1,5 @@
+# add file, set compression method to ZIP_CM_STORE
+program modify
+return 0
+args -mn test.zip add foo foo  set_file_compression 0 store 0
+file-new test.zip foo-stored.zip
diff --git a/regress/bigstored.zh b/regress/bigstored.zh
new file mode 100644 (file)
index 0000000..f43ba1b
Binary files /dev/null and b/regress/bigstored.zh differ
diff --git a/regress/bigzero-zip.zip b/regress/bigzero-zip.zip
new file mode 100644 (file)
index 0000000..158cb6d
Binary files /dev/null and b/regress/bigzero-zip.zip differ
diff --git a/regress/bogus.zip b/regress/bogus.zip
new file mode 100644 (file)
index 0000000..7e538b6
--- /dev/null
@@ -0,0 +1 @@
+bogus data
diff --git a/regress/cm-default.zip b/regress/cm-default.zip
new file mode 100644 (file)
index 0000000..3eba2a3
Binary files /dev/null and b/regress/cm-default.zip differ
diff --git a/regress/delete_add_same.test b/regress/delete_add_same.test
new file mode 100644 (file)
index 0000000..385caac
--- /dev/null
@@ -0,0 +1,6 @@
+# delete entry in zip archive then add file of same name
+# time is now(), so use zipcmp
+program modify
+return 0
+args testfile.zip delete 0 add testfile.txt test
+file testfile.zip testfile.zip test2.zip
diff --git a/regress/delete_invalid.test b/regress/delete_invalid.test
new file mode 100644 (file)
index 0000000..fe317ec
--- /dev/null
@@ -0,0 +1,6 @@
+# delete last entry in zip archive
+program modify
+return 1
+args testfile.zzip delete 5
+file testfile.zzip testfile.zip testfile.zip
+stderr can't delete file at index '5': Invalid argument
diff --git a/regress/delete_last.test b/regress/delete_last.test
new file mode 100644 (file)
index 0000000..a7fdb8e
--- /dev/null
@@ -0,0 +1,5 @@
+# delete last entry in zip archive
+program modify
+return 0
+args testfile.zzip delete 0
+file-del testfile.zzip testfile.zip
diff --git a/regress/delete_multiple_last.test b/regress/delete_multiple_last.test
new file mode 100644 (file)
index 0000000..bd830a7
--- /dev/null
@@ -0,0 +1,5 @@
+# delete multiple entries in zip archive, emptying it
+program modify
+return 0
+args testfile.zzip delete 0 delete 1 delete 2 delete 3
+file-del testfile.zzip testcomment.zip
diff --git a/regress/delete_multiple_partial.test b/regress/delete_multiple_partial.test
new file mode 100644 (file)
index 0000000..9e6dcc5
--- /dev/null
@@ -0,0 +1,5 @@
+# delete some entries in zip archive
+program modify
+return 0
+args testfile.zip delete 1 delete 3
+file testfile.zip testcomment.zip testcomment13.zip
diff --git a/regress/delete_renamed_rename.test b/regress/delete_renamed_rename.test
new file mode 100644 (file)
index 0000000..4e3e414
--- /dev/null
@@ -0,0 +1,6 @@
+# delete renamed entry in zip archive then rename file to same name
+# file date is now(), so use zipcmp
+program modify
+return 0
+args testfile.zip rename 0 something  add test test  delete 0  rename 1 testfile.txt
+file testfile.zip testfile.zip test2.zip
diff --git a/regress/deltest.c b/regress/deltest.c
deleted file mode 100644 (file)
index 87991e5..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "zip.h"
-#include "error.h"
-
-char *prg;
-#define BUFSIZE 65536
-
-int
-main(int argc, char *argv[])
-{
-    struct zip *za;
-
-    if (argc != 2) {
-       fprintf(stderr, "%s: call with one option: zip-file. First file"
-               " in zip-file will be deleted\n", argv[0]);
-       return 1;
-    }
-
-    if ((za=zip_open(argv[1], ZIP_CHECKCONS))==NULL) {
-       fprintf(stderr, "%s: can't open '%s': %s\n", argv[0], argv[1],
-               zip_err_str[zip_err]);
-       return 1;
-    }
-
-    if (zip_delete(za, 0)< 0) {
-       fprintf(stderr, "%s: can't delete first file in '%s': %s", 
-               argv[0], argv[1], zip_err_str[zip_err]);
-       return 1;
-    }
-
-    if (zip_close(za)!=0) {
-       fprintf(stderr, "%s: can't close file '%s': %s", argv[0], argv[1],
-               zip_err_str[zip_err]);
-       return 1;
-    }
-    
-    return 0;
-}
diff --git a/regress/encrypt.c b/regress/encrypt.c
deleted file mode 100644 (file)
index d5b00ca..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
-  encrypt.c -- test encryption support
-  Copyright (C) 2006 Dieter Baron and Thomas Klausner
-
-  This file is part of libzip, a library to manipulate ZIP archives.
-  The authors can be contacted at <libzip@nih.at>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
-  1. Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-  2. Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in
-     the documentation and/or other materials provided with the
-     distribution.
-  3. The names of the authors may not be used to endorse or promote
-     products derived from this software without specific prior
-     written permission.
-  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-\f
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "zip.h"
-
-const char *prg;
-
-int
-main(int argc, char *argv[])
-{
-    const char *archive;
-    struct zip *za;
-    char buf[100];
-    int err;
-    int i;
-    struct zip_stat st;
-
-    prg = argv[0];
-
-    if (argc != 2) {
-       fprintf(stderr, "usage: %s archive\n", prg);
-       return 1;
-    }
-
-    archive = argv[1];
-    
-    if ((za=zip_open(archive, 0, &err)) == NULL) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't open zip archive `%s': %s\n", prg,
-               archive, buf);
-       return 1;
-    }
-
-    for (i=0; i<zip_get_num_files(za); i++) {
-       if (zip_stat_index(za, i, 0, &st) < 0)
-           fprintf(stderr, "%s: can't stat file %d: %s\n",
-                   prg, i, zip_strerror(za));
-       else
-           printf("%d: %d\n", i, st.encryption_method);
-    }
-
-    if (zip_close(za) == -1) {
-       fprintf(stderr, "%s: can't close zip archive `%s'\n", prg, archive);
-       return 1;
-    }
-
-    return 0;
-}
index ba6502f..c571863 100644 (file)
@@ -1,7 +1,24 @@
 # test encryption support
-program encrypt
+# TODO: only checks recognition of encrypted entries for now.
+program modify
 return 0
-args encrypt.zip
-file encrypt.zip encrypt.zip encrypt.zip
-stdout 0: 1
-stdout 1: 0
+args encrypt.zzip stat 0 stat 1
+file encrypt.zzip encrypt.zip encrypt.zip
+stdout name: 'encrypted'
+stdout index: '0'
+stdout size: '4'
+stdout compressed size: '16'
+stdout mtime: 'Mon Apr 24 2006 16:01:34'
+stdout crc: '7e3265a8'
+stdout compression method: '0'
+stdout encryption method: '1'
+stdout 
+stdout name: 'plain'
+stdout index: '1'
+stdout size: '4'
+stdout compressed size: '4'
+stdout mtime: 'Mon Apr 24 2006 16:01:42'
+stdout crc: '7e3265a8'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
diff --git a/regress/encrypt_plus_extra.zip b/regress/encrypt_plus_extra.zip
new file mode 100644 (file)
index 0000000..4a26309
Binary files /dev/null and b/regress/encrypt_plus_extra.zip differ
diff --git a/regress/encrypt_plus_extra_modified_c.zip b/regress/encrypt_plus_extra_modified_c.zip
new file mode 100644 (file)
index 0000000..f50d649
Binary files /dev/null and b/regress/encrypt_plus_extra_modified_c.zip differ
diff --git a/regress/encrypt_plus_extra_modified_l.zip b/regress/encrypt_plus_extra_modified_l.zip
new file mode 100644 (file)
index 0000000..a546022
Binary files /dev/null and b/regress/encrypt_plus_extra_modified_l.zip differ
diff --git a/regress/extra_add.test b/regress/extra_add.test
new file mode 100644 (file)
index 0000000..1e3d45c
--- /dev/null
@@ -0,0 +1,8 @@
+# add extra field
+program modify
+#args encrypt.zip set_extra 0 2345 65535 cl extrafieldcontent
+args encrypt.zip set_extra 0 2345 65535 cl extrafieldcontent get_extra_by_id 0 2345 0 c get_extra_by_id 0 2345 0 l
+return 0
+file encrypt.zip encrypt.zip encrypt_plus_extra.zip
+stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74
+stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74
diff --git a/regress/extra_add_multiple.test b/regress/extra_add_multiple.test
new file mode 100644 (file)
index 0000000..c174e4d
--- /dev/null
@@ -0,0 +1,9 @@
+# add extra fields
+program modify
+args testfile.zip  set_extra 0 2345 65535 cl extra1  set_extra 0 2345 65535 cl extra2  set_extra 0 2345 0 c extra1c  set_extra 0 2345 1 l extra2l  get_extra_by_id 0 2345 0 c  get_extra_by_id 0 2345 1 c  get_extra_by_id 0 2345 0 l  get_extra_by_id 0 2345 1 l
+return 0
+file testfile.zip testfile.zip testfile-plus-extra.zip
+stdout Extra field 0x0929: len 7, data 0x65787472613163
+stdout Extra field 0x0929: len 6, data 0x657874726132
+stdout Extra field 0x0929: len 6, data 0x657874726131
+stdout Extra field 0x0929: len 7, data 0x6578747261326c
diff --git a/regress/extra_count.test b/regress/extra_count.test
new file mode 100644 (file)
index 0000000..2ac26e6
--- /dev/null
@@ -0,0 +1,11 @@
+# count extra fields for index
+program modify
+args encrypt.zip count_extra 0 l count_extra 0 c count_extra 0 lc count_extra 1 l count_extra 1 c count_extra 1 lc
+return 0
+file encrypt.zip encrypt.zip encrypt.zip
+stdout Extra field count: 2
+stdout Extra field count: 2
+stdout Extra field count: 4
+stdout Extra field count: 2
+stdout Extra field count: 2
+stdout Extra field count: 4
diff --git a/regress/extra_count_by_id.test b/regress/extra_count_by_id.test
new file mode 100644 (file)
index 0000000..dc11f34
--- /dev/null
@@ -0,0 +1,23 @@
+# count extra fields for index
+program modify
+args encrypt.zip count_extra_by_id 0 0 l count_extra_by_id 0 1 l count_extra_by_id 0 21589 l count_extra_by_id 0 30805 l count_extra_by_id 0 21844 l count_extra_by_id 0 12345 l count_extra_by_id 0 0 c count_extra_by_id 0 1 c count_extra_by_id 0 21589 c count_extra_by_id 0 30805 c count_extra_by_id 0 21844 c count_extra_by_id 0 12345 c count_extra_by_id 0 0 cl count_extra_by_id 0 1 cl count_extra_by_id 0 21589 cl count_extra_by_id 0 30805 cl count_extra_by_id 0 21844 cl count_extra_by_id 0 12345 cl
+return 0
+file encrypt.zip encrypt.zip encrypt.zip
+stdout Extra field count: 0
+stdout Extra field count: 0
+stdout Extra field count: 1
+stdout Extra field count: 1
+stdout Extra field count: 0
+stdout Extra field count: 0
+stdout Extra field count: 0
+stdout Extra field count: 0
+stdout Extra field count: 1
+stdout Extra field count: 1
+stdout Extra field count: 0
+stdout Extra field count: 0
+stdout Extra field count: 0
+stdout Extra field count: 0
+stdout Extra field count: 2
+stdout Extra field count: 2
+stdout Extra field count: 0
+stdout Extra field count: 0
diff --git a/regress/extra_count_ignore_zip64.test b/regress/extra_count_ignore_zip64.test
new file mode 100644 (file)
index 0000000..2599b33
--- /dev/null
@@ -0,0 +1,8 @@
+# count extra fields for index
+program modify
+args bigzero.zip count_extra 0 l count_extra 0 c count_extra 0 lc
+return 0
+file bigzero.zip bigzero.zip bigzero.zip
+stdout Extra field count: 0
+stdout Extra field count: 0
+stdout Extra field count: 0
diff --git a/regress/extra_delete.test b/regress/extra_delete.test
new file mode 100644 (file)
index 0000000..4ca5d49
--- /dev/null
@@ -0,0 +1,15 @@
+# delete extra field by index
+program modify
+args encrypt.zip get_extra 0 0 c get_extra 0 1 c get_extra 0 2 c get_extra 0 0 l get_extra 0 1 l get_extra 0 2 l delete_extra 0 2 c delete_extra 0 0 l get_extra 0 0 c get_extra 0 1 c get_extra 0 0 l get_extra 0 1 l
+file encrypt.zip encrypt_plus_extra.zip encrypt.zip
+return 0
+stdout Extra field 0x5455: len 5, data 0x033dda4c44
+stdout Extra field 0x7855: len 0
+stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74
+stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74
+stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44
+stdout Extra field 0x7855: len 4, data 0x64001400
+stdout Extra field 0x5455: len 5, data 0x033dda4c44
+stdout Extra field 0x7855: len 0
+stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44
+stdout Extra field 0x7855: len 4, data 0x64001400
diff --git a/regress/extra_delete_by_id.test b/regress/extra_delete_by_id.test
new file mode 100644 (file)
index 0000000..8525739
--- /dev/null
@@ -0,0 +1,7 @@
+# delete extra field by id and index
+program modify
+#args encrypt.zip set_extra 0 2345 65535 cl extrafieldcontent
+args encrypt.zip delete_extra_by_id 0 2345 0 c delete_extra_by_id 0 2345 0 l get_extra_by_id 0 2345 0 c
+return 1
+file encrypt.zip encrypt_plus_extra.zip encrypt.zip
+stderr can't get extra field data for file at index 0, extra field id 2345, ef index 0, flags 512: No such file
diff --git a/regress/extra_get.test b/regress/extra_get.test
new file mode 100644 (file)
index 0000000..1455978
--- /dev/null
@@ -0,0 +1,10 @@
+# get extra fields for index
+program modify
+args encrypt.zip get_extra 0 0 l get_extra 0 0 c get_extra 0 1 l get_extra 0 1 c get_extra 0 2 l
+return 1
+file encrypt.zip encrypt.zip encrypt.zip
+stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44
+stdout Extra field 0x5455: len 5, data 0x033dda4c44
+stdout Extra field 0x7855: len 4, data 0x64001400
+stdout Extra field 0x7855: len 0
+stderr can't get extra field data for file at index 0, extra field 2, flags 256: No such file
diff --git a/regress/extra_get_by_id.test b/regress/extra_get_by_id.test
new file mode 100644 (file)
index 0000000..b3b76f3
--- /dev/null
@@ -0,0 +1,10 @@
+# get extra_by_id fields for index
+program modify
+args encrypt.zip get_extra_by_id 0 21589 0 l get_extra_by_id 0 30805 0 l get_extra_by_id 0 21589 0 c get_extra_by_id 0 30805 0 c get_extra_by_id 0 21544 0 c
+return 1
+file encrypt.zip encrypt.zip encrypt.zip
+stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44
+stdout Extra field 0x7855: len 4, data 0x64001400
+stdout Extra field 0x5455: len 5, data 0x033dda4c44
+stdout Extra field 0x7855: len 0
+stderr can't get extra field data for file at index 0, extra field id 21544, ef index 0, flags 512: No such file
diff --git a/regress/extra_set.test b/regress/extra_set.test
new file mode 100644 (file)
index 0000000..32b6f88
--- /dev/null
@@ -0,0 +1,15 @@
+# set extra field
+program modify
+args -- encrypt get_extra 0 0 c get_extra 0 1 c get_extra 0 0 l get_extra 0 1 l set_extra 0 2345 -1 l extrafieldcontent set_extra 0 2345 -1 c extrafieldcontent get_extra 0 0 c get_extra 0 1 c get_extra 0 2 c get_extra 0 0 l get_extra 0 1 l get_extra 0 2 l
+file encrypt encrypt.zip encrypt_plus_extra.zip
+return 0
+stdout Extra field 0x5455: len 5, data 0x033dda4c44
+stdout Extra field 0x7855: len 0
+stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44
+stdout Extra field 0x7855: len 4, data 0x64001400
+stdout Extra field 0x5455: len 5, data 0x033dda4c44
+stdout Extra field 0x7855: len 0
+stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74
+stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44
+stdout Extra field 0x7855: len 4, data 0x64001400
+stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74
diff --git a/regress/extra_set_modify_c.test b/regress/extra_set_modify_c.test
new file mode 100644 (file)
index 0000000..9f84ced
--- /dev/null
@@ -0,0 +1,17 @@
+# change existing central extra field
+program modify
+args encrypt.zip get_extra 0 0 c get_extra 0 1 c get_extra 0 2 c get_extra 0 0 l get_extra 0 1 l get_extra 0 2 l set_extra 0 2345 0 c Extrafieldcontent get_extra 0 0 c get_extra 0 1 c get_extra 0 2 c get_extra 0 0 l get_extra 0 1 l get_extra 0 2 l
+file encrypt.zip encrypt_plus_extra.zip encrypt_plus_extra_modified_c.zip
+return 0
+stdout Extra field 0x5455: len 5, data 0x033dda4c44
+stdout Extra field 0x7855: len 0
+stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74
+stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74
+stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44
+stdout Extra field 0x7855: len 4, data 0x64001400
+stdout Extra field 0x5455: len 5, data 0x033dda4c44
+stdout Extra field 0x7855: len 0
+stdout Extra field 0x0929: len 17, data 0x45787472616669656c64636f6e74656e74
+stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74
+stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44
+stdout Extra field 0x7855: len 4, data 0x64001400
diff --git a/regress/extra_set_modify_l.test b/regress/extra_set_modify_l.test
new file mode 100644 (file)
index 0000000..0a838b6
--- /dev/null
@@ -0,0 +1,17 @@
+# change existing local extra field
+program modify
+args encrypt.zip get_extra 0 0 c get_extra 0 1 c get_extra 0 2 c get_extra 0 0 l get_extra 0 1 l get_extra 0 2 l set_extra 0 2345 0 l Extrafieldcontent get_extra 0 0 c get_extra 0 1 c get_extra 0 2 c get_extra 0 0 l get_extra 0 1 l get_extra 0 2 l
+file encrypt.zip encrypt_plus_extra.zip encrypt_plus_extra_modified_l.zip
+return 0
+stdout Extra field 0x5455: len 5, data 0x033dda4c44
+stdout Extra field 0x7855: len 0
+stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74
+stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74
+stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44
+stdout Extra field 0x7855: len 4, data 0x64001400
+stdout Extra field 0x5455: len 5, data 0x033dda4c44
+stdout Extra field 0x7855: len 0
+stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74
+stdout Extra field 0x0929: len 17, data 0x45787472616669656c64636f6e74656e74
+stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44
+stdout Extra field 0x7855: len 4, data 0x64001400
diff --git a/regress/file_comment_encmismatch.test b/regress/file_comment_encmismatch.test
new file mode 100644 (file)
index 0000000..8d6dc98
--- /dev/null
@@ -0,0 +1,5 @@
+# set file comment to UTF-8 for CP437 encoded filename (adds InfoZIP extra field)
+program modify
+return 0
+args testfile.zip   set_file_comment 0 ÄÖÜßäöü
+file testfile.zip test-cp437.zip test-cp437-comment-utf-8.zip
diff --git a/regress/filename_duplicate.zip b/regress/filename_duplicate.zip
new file mode 100644 (file)
index 0000000..96a11e7
Binary files /dev/null and b/regress/filename_duplicate.zip differ
diff --git a/regress/filename_duplicate_empty.zip b/regress/filename_duplicate_empty.zip
new file mode 100644 (file)
index 0000000..c4af0d8
Binary files /dev/null and b/regress/filename_duplicate_empty.zip differ
diff --git a/regress/filename_empty.zip b/regress/filename_empty.zip
new file mode 100644 (file)
index 0000000..d32e4e7
Binary files /dev/null and b/regress/filename_empty.zip differ
diff --git a/regress/fileorder.zip b/regress/fileorder.zip
new file mode 100644 (file)
index 0000000..3fcd81a
Binary files /dev/null and b/regress/fileorder.zip differ
diff --git a/regress/firstsecond-split-deflated.zip b/regress/firstsecond-split-deflated.zip
new file mode 100644 (file)
index 0000000..35b9a5c
Binary files /dev/null and b/regress/firstsecond-split-deflated.zip differ
diff --git a/regress/firstsecond-split-stored.zip b/regress/firstsecond-split-stored.zip
new file mode 100644 (file)
index 0000000..35f0684
Binary files /dev/null and b/regress/firstsecond-split-stored.zip differ
diff --git a/regress/firstsecond.zip b/regress/firstsecond.zip
new file mode 100644 (file)
index 0000000..a9117e3
Binary files /dev/null and b/regress/firstsecond.zip differ
diff --git a/regress/foo-stored.zip b/regress/foo-stored.zip
new file mode 100644 (file)
index 0000000..d3adc80
Binary files /dev/null and b/regress/foo-stored.zip differ
similarity index 69%
rename from regress/add_from_buffer.c
rename to regress/fopen_unchanged.c
index 40efd21..0256425 100644 (file)
@@ -1,6 +1,6 @@
 /*
-  add_from_buffer.c -- test case for adding file from buffer to archive
-  Copyright (C) 1999, 2003, 2005 Dieter Baron and Thomas Klausner
+  fopen_unchanged.c -- test case for adding file and reading from unchanged
+  Copyright (C) 2012-2015 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -31,7 +31,6 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <errno.h>
 #include <stdio.h>
 
 #include "zip.h"
 
-const char *teststr="This is a test, and it seems to have been successful.\n";
+const char *teststr="This is a test.\n";
 const char *file="teststring.txt";
-const char *prg;
 
 int
 main(int argc, char *argv[])
 {
     const char *archive;
-    struct zip *za;
-    struct zip_source *zs;
-    char buf[100];
+    zip_t *za;
+    zip_source_t *zs;
     int err;
 
-    prg = argv[0];
-
     if (argc != 2) {
-       fprintf(stderr, "usage: %s archive\n", prg);
+       fprintf(stderr, "usage: %s archive\n", argv[0]);
        return 1;
     }
 
     archive = argv[1];
     
     if ((za=zip_open(archive, ZIP_CREATE, &err)) == NULL) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't open zip archive %s: %s\n", prg,
-               archive, buf);
+       zip_error_t error;
+       zip_error_init_with_code(&error, err);
+       fprintf(stderr, "can't open zip archive '%s': %s\n", archive, zip_error_strerror(&error));
+       zip_error_fini(&error);
        return 1;
     }
 
     if ((zs=zip_source_buffer(za, teststr, strlen(teststr), 0)) == NULL) {
-       fprintf(stderr, "%s: can't create zip_source from buffer: %s\n", prg,
-               zip_strerror(za));
+       fprintf(stderr, "can't create zip_source from buffer: %s\n", zip_strerror(za));
        exit(1);
     }
 
     if (zip_add(za, file, zs) == -1) {
-       zip_source_free(zs);
-       fprintf(stderr, "%s: can't add file `%s': %s\n", prg,
-               file, zip_strerror(za));
+       fprintf(stderr, "can't add file '%s': %s\n", file, zip_strerror(za));
+       (void)zip_source_free(zs);
+       (void)zip_close(za);
+       return 1;
+    }
+
+    if (zip_fopen(za, file, ZIP_FL_UNCHANGED) == NULL) {
+       fprintf(stderr, "can't zip_fopen file '%s': %s\n", file, zip_strerror(za));
+       (void)zip_discard(za);
        return 1;
     }
 
     if (zip_close(za) == -1) {
-       fprintf(stderr, "%s: can't close zip archive %s\n", prg,
-               archive);
+       fprintf(stderr, "can't close zip archive '%s': %s\n", archive, zip_strerror(za));
        return 1;
     }
 
diff --git a/regress/fopen_unchanged.test b/regress/fopen_unchanged.test
new file mode 100644 (file)
index 0000000..885f8b7
--- /dev/null
@@ -0,0 +1,5 @@
+# add buffer contents as file to zip, then read unchanged from it
+program fopen_unchanged
+return 1
+args testbuffer.zip
+stderr can't zip_fopen file 'teststring.txt': No such file
index 9080b8a..22b3ae4 100644 (file)
@@ -1,6 +1,6 @@
 /*
   fread.c -- test cases for reading from zip archives
-  Copyright (C) 2004-2009 Dieter Baron and Thomas Klausner
+  Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
+#include "config.h"
 
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifndef HAVE_GETOPT
+#include "getopt.h"
+#endif
 
 #include "zip.h"
 
@@ -47,36 +54,53 @@ const char *when_name[] = {
     "no", "zip_fopen", "zip_fread", "zip_fclose"
 };
 
-int do_read(struct zip *, const char *, int, enum when, int, int);
+static int do_read(zip_t *z, const char *name, zip_flags_t flags, enum when when_ex, int ze_ex, int se_ex);
 
-\f
+int verbose;
 
 const char *prg;
+#define USAGE "usage: %s [-v] archive\n"
 
 int
 main(int argc, char *argv[])
 {
     int fail, ze;
-    struct zip *z;
-    struct zip_source *zs;
+    int c;
+    zip_t *z;
+    zip_source_t *zs;
     char *archive;
-    char errstr[1024];
+    zip_int64_t idx;
 
+    verbose = 0;
     fail = 0;
 
     prg = argv[0];
 
-    if (argc != 2) {
-        fprintf(stderr, "usage: %s archive\n", prg);
+    while ((c=getopt(argc, argv, "v")) != -1) {
+       switch (c) {
+            case 'v':
+                verbose = 1;
+                break;
+
+            default:
+                fprintf(stderr, USAGE, prg);
+                return 1;
+       }
+    }
+
+    
+    if (argc-optind != 1) {
+        fprintf(stderr, USAGE, prg);
         return 1;
     }
 
-    archive = argv[1];
+    archive = argv[optind];
 
     if ((z=zip_open(archive, 0, &ze)) == NULL) {
-       zip_error_to_str(errstr, sizeof(errstr), ze, errno);
-       printf("%s: opening zip archive ``%s'' failed: %s\n",
-              prg, archive, errstr);
+       zip_error_t error;
+       zip_error_init_with_code(&error, ze);
+       fprintf(stderr, "%s: can't open zip archive '%s': %s\n", prg, archive, zip_error_strerror(&error));
+       zip_error_fini(&error);
        return 1;
     }
 
@@ -89,8 +113,7 @@ main(int argc, char *argv[])
     fail += do_read(z, "nosuchfile", 0, WHEN_OPEN, ZIP_ER_NOENT, 0);
     fail += do_read(z, "deflatezliberror", ZIP_FL_COMPRESSED, WHEN_NEVER, 0,0);
     fail += do_read(z, "deflatecrcerror", ZIP_FL_COMPRESSED, WHEN_NEVER, 0, 0);
-    fail += do_read(z, "storedcrcerror", ZIP_FL_COMPRESSED,
-                   WHEN_READ, ZIP_ER_CRC, 0);
+    fail += do_read(z, "storedcrcerror", ZIP_FL_COMPRESSED, WHEN_READ, ZIP_ER_CRC, 0);
     fail += do_read(z, "storedok", ZIP_FL_COMPRESSED, WHEN_NEVER, 0, 0);
 
     fail += do_read(z, "cryptok", 0, WHEN_OPEN, ZIP_ER_NOPASSWD, 0);
@@ -101,71 +124,98 @@ main(int argc, char *argv[])
     zip_set_default_password(z, NULL);
 
     zs = zip_source_buffer(z, "asdf", 4, 0);
-    zip_replace(z, zip_name_locate(z, "storedok", 0), zs);
-    fail += do_read(z, "storedok", 0, WHEN_OPEN, ZIP_ER_CHANGED, 0);
-    fail += do_read(z, "storedok", ZIP_FL_UNCHANGED, WHEN_NEVER, 0, 0);
-    zip_delete(z, zip_name_locate(z, "storedok", 0));
-    fail += do_read(z, "storedok", 0, WHEN_OPEN, ZIP_ER_NOENT, 0);
-    fail += do_read(z, "storedok", ZIP_FL_UNCHANGED, WHEN_NEVER, 0, 0);
+    if ((idx = zip_name_locate(z, "storedok", 0)) < 0) {
+        fprintf(stderr, "%s: can't locate 'storedok' in zip archive '%s': %s\n", prg, archive, zip_strerror(z));
+        fail++;
+    }
+    else {
+        if (zip_replace(z, (zip_uint64_t)idx, zs) < 0) {
+            fprintf(stderr, "%s: can't replace 'storedok' in zip archive '%s': %s\n", prg, archive, zip_strerror(z));
+            fail++;
+        }
+        else {
+            fail += do_read(z, "storedok", 0, WHEN_OPEN, ZIP_ER_CHANGED, 0);
+            fail += do_read(z, "storedok", ZIP_FL_UNCHANGED, WHEN_NEVER, 0, 0);
+        }
+    }
+    if ((idx = zip_name_locate(z, "storedok", 0)) < 0) {
+        fprintf(stderr, "%s: can't locate 'storedok' in zip archive '%s': %s\n", prg, archive, zip_strerror(z));
+        fail++;
+    }
+    else {
+        if (zip_delete(z, (zip_uint64_t)idx) < 0) {
+            fprintf(stderr, "%s: can't replace 'storedok' in zip archive '%s': %s\n", prg, archive, zip_strerror(z));
+            fail++;
+        }
+        else {
+            fail += do_read(z, "storedok", 0, WHEN_OPEN, ZIP_ER_NOENT, 0);
+            fail += do_read(z, "storedok", ZIP_FL_UNCHANGED, WHEN_NEVER, 0, 0);
+        }
+    }
     zs = zip_source_buffer(z, "asdf", 4, 0);
-    zip_add(z, "new_file", zs);
-    fail += do_read(z, "new_file", 0, WHEN_OPEN, ZIP_ER_CHANGED, 0);
+    if (zip_file_add(z, "new_file", zs, 0) < 0) {
+        fprintf(stderr, "%s: can't add file to zip archive '%s': %s\n", prg, archive, zip_strerror(z));
+        fail++;
+    }
+    else {
+        fail += do_read(z, "new_file", 0, WHEN_OPEN, ZIP_ER_CHANGED, 0);
+    }
+    
     zip_unchange_all(z);
-
     if (zip_close(z) == -1) {
-        fprintf(stderr, "%s: can't close zip archive `%s'\n", prg, archive);
+        fprintf(stderr, "%s: can't close zip archive '%s': %s\n", prg, archive, zip_strerror(z));
         return 1;
     }
 
     exit(fail ? 1 : 0);
 }
 
-\f
 
-int
-do_read(struct zip *z, const char *name, int flags,
-       enum when when_ex, int ze_ex, int se_ex)
+static int
+do_read(zip_t *z, const char *name, zip_flags_t flags, enum when when_ex, int ze_ex, int se_ex)
 {
-    struct zip_file *zf;
+    zip_file_t *zf;
     enum when when_got;
-    int ze_got, se_got;
+    zip_error_t error_got, error_ex;
+    int err;
     char b[8192];
-    int n;
-    char expected[80];
-    char got[80];
+    zip_int64_t n;
 
     when_got = WHEN_NEVER;
-    ze_got = se_got = 0;
+    zip_error_init(&error_got);
+    zip_error_init(&error_ex);
+    zip_error_set(&error_ex, ze_ex, se_ex);
     
     if ((zf=zip_fopen(z, name, flags)) == NULL) {
        when_got = WHEN_OPEN;
-       zip_error_get(z, &ze_got, &se_got);
+       zip_error_t *zf_error = zip_get_error(z);
+       zip_error_set(&error_got, zip_error_code_zip(zf_error), zip_error_code_system(zf_error));
     }
     else {
        while ((n=zip_fread(zf, b, sizeof(b))) > 0)
            ;
        if (n < 0) {
            when_got = WHEN_READ;
-           zip_file_error_get(zf, &ze_got, &se_got);
+           zip_error_t *zf_error = zip_file_get_error(zf);
+           zip_error_set(&error_got, zip_error_code_zip(zf_error), zip_error_code_system(zf_error));
        }
-       n = zip_fclose(zf);
-       if (when_got == WHEN_NEVER && n != 0) {
+       err = zip_fclose(zf);
+       if (when_got == WHEN_NEVER && err != 0) {
            when_got = WHEN_CLOSE;
-           ze_got = n;
-           se_got = 0;
+           zip_error_init_with_code(&error_got, err);
        }
     }
 
-    if (when_got != when_ex || ze_got != ze_ex || se_got != se_ex) {
-       zip_error_to_str(expected, sizeof(expected), ze_ex, se_ex);
-       zip_error_to_str(got, sizeof(got), ze_got, se_got);
+    if (when_got != when_ex || zip_error_code_zip(&error_got) != zip_error_code_zip(&error_ex) || zip_error_code_system(&error_got) != zip_error_code_system(&error_ex)) {
        printf("%s: %s: got %s error (%s), expected %s error (%s)\n",
               prg, name,
-              when_name[when_got], got, 
-              when_name[when_ex], expected);
+              when_name[when_got], zip_error_strerror(&error_got), 
+              when_name[when_ex], zip_error_strerror(&error_ex));
+       zip_error_fini(&error_got);
+       zip_error_fini(&error_ex);
        return 1;
     }
-    else if (getenv("VERBOSE"))
+    else if (verbose)
        printf("%s: %s: passed\n", prg, name);
 
     return 0;
diff --git a/regress/get_comment.c b/regress/get_comment.c
deleted file mode 100644 (file)
index 62a521f..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
-  comment.c -- test cases for file and archive comments
-  Copyright (C) 2006 Dieter Baron and Thomas Klausner
-
-  This file is part of libzip, a library to manipulate ZIP archives.
-  The authors can be contacted at <libzip@nih.at>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
-  1. Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-  2. Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in
-     the documentation and/or other materials provided with the
-     distribution.
-  3. The names of the authors may not be used to endorse or promote
-     products derived from this software without specific prior
-     written permission.
-  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-\f
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "zip.h"
-
-const char *prg;
-
-int
-main(int argc, char *argv[])
-{
-    const char *archive;
-    struct zip *za;
-    char buf[100];
-    int err;
-    const char *com;
-    int i, len;
-
-    prg = argv[0];
-
-    if (argc != 2) {
-       fprintf(stderr, "usage: %s archive\n", prg);
-       return 1;
-    }
-
-    archive = argv[1];
-    
-    if ((za=zip_open(archive, 0, &err)) == NULL) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't open zip archive `%s': %s\n", prg,
-               archive, buf);
-       return 1;
-    }
-
-    if ((com=zip_get_archive_comment(za, &len, 0)) == NULL)
-       printf("No archive comment\n");
-    else
-       printf("Archive comment: %.*s\n", len, com);
-
-    for (i=0; i<zip_get_num_files(za); i++) {
-       if ((com=zip_get_file_comment(za, i, &len, 0)) == NULL)
-           printf("No comment for `%s'\n", zip_get_name(za, i, 0));
-       else
-           printf("File comment for `%s': %.*s\n", zip_get_name(za, i, 0), len, com);
-    }  
-
-    if (zip_close(za) == -1) {
-       fprintf(stderr, "%s: can't close zip archive `%s'\n", prg, archive);
-       return 1;
-    }
-
-    return 0;
-}
index a7b22ea..735cc97 100644 (file)
@@ -1,7 +1,7 @@
 # show comments of a zip archive
-program get_comment
+program modify
 return 0
-args testcomment.zip
+args testcomment.zip   get_archive_comment   get_file_comment 0   get_file_comment 1   get_file_comment 2   get_file_comment 3
 file testcomment.zip testcomment.zip testcomment.zip
 stdout Archive comment: This is the archive comment for the file.\r
 stdout \r
@@ -9,7 +9,7 @@ stdout Long.
 stdout \r
 stdout Longer.\r
 stdout 
-stdout No comment for `file1'
-stdout File comment for `file2': First one had no comment.
-stdout File comment for `file3': Third one.
-stdout File comment for `file4': Last.
+stdout No comment for 'file1'
+stdout File comment for 'file2': First one had no comment.
+stdout File comment for 'file3': Third one.
+stdout File comment for 'file4': Last.
diff --git a/regress/hole.c b/regress/hole.c
new file mode 100644 (file)
index 0000000..70e4e01
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ hole.c -- convert huge files with mostly NULs to/from source_hole
+ Copyright (C) 2014 Dieter Baron and Thomas Klausner
+ This file is part of libzip, a library to manipulate ZIP archives.
+ The authors can be contacted at <libzip@nih.at>
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 3. The names of the authors may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifndef HAVE_GETOPT
+#include "getopt.h"
+#endif
+
+#include "zip.h"
+
+/* public API */
+
+zip_source_t *source_hole_create(const char *, int flags, zip_error_t *);
+
+const char *prg;
+
+
+static int
+copy_source(zip_source_t *from, zip_source_t *to)
+{
+    zip_uint8_t buf[8192];
+    zip_int64_t n;
+    
+    if (zip_source_open(from) < 0) {
+        fprintf(stderr, "%s: can't open source for reading: %s\n", prg, zip_error_strerror(zip_source_error(from)));
+        return -1;
+    }
+    
+    if (zip_source_begin_write(to) < 0) {
+        fprintf(stderr, "%s: can't open source for writing: %s\n", prg, zip_error_strerror(zip_source_error(to)));
+        zip_source_close(from);
+        return -1;
+    }
+        
+    while ((n = zip_source_read(from, buf, sizeof(buf))) > 0) {
+        if (zip_source_write(to, buf, (zip_uint64_t)n) != n) {
+            fprintf(stderr, "%s: can't write to source: %s\n", prg, zip_error_strerror(zip_source_error(to)));
+            zip_source_close(from);
+            zip_source_rollback_write(to);
+            return -1;
+        }
+    }
+    
+    if (n < 0) {
+        fprintf(stderr, "%s: can't read from source: %s\n", prg, zip_error_strerror(zip_source_error(from)));
+        zip_source_close(from);
+        zip_source_rollback_write(to);
+        return -1;
+    }
+
+    zip_source_close(from);
+    
+    if (zip_source_commit_write(to) < 0) {
+        fprintf(stderr, "%s: can't commit source: %s\n", prg, zip_error_strerror(zip_source_error(to)));
+        zip_source_rollback_write(to);
+        return -1;
+    }
+    
+    return 0;
+}
+
+
+static zip_source_t *
+open_compressed(const char *fname, int flags)
+{
+    zip_error_t error;
+    zip_source_t *src;
+    
+    zip_error_init(&error);
+    
+    if ((src = source_hole_create(fname, flags, &error)) == NULL) {
+        fprintf(stderr, "%s: can't open compressed file %s: %s\n", prg, fname, zip_error_strerror(&error));
+        zip_error_fini(&error);
+        exit(1);
+    }
+    
+    return src;
+}
+
+
+static zip_source_t *
+open_file(const char *fname)
+{
+    zip_error_t error;
+    zip_source_t *src;
+    
+    zip_error_init(&error);
+    
+    if ((src = zip_source_file_create(fname, 0, 0, &error)) == NULL) {
+        fprintf(stderr, "%s: can't open file %s: %s\n", prg, fname, zip_error_strerror(&error));
+        zip_error_fini(&error);
+        exit(1);
+    }
+    
+    return src;
+}
+
+
+static void
+usage(void)
+{
+    fprintf(stderr, "usage: %s [-du] in out\n", prg);
+    fprintf(stderr, "\nOptions:\n  -d  decompress in\n  -u  update in\n");
+    exit(1);
+}
+
+
+int
+main(int argc, char **argv)
+{
+    zip_source_t *from;
+    zip_source_t *to;
+    int c, err;
+    int compress = 1;
+    int decompress = 0;
+    
+    prg = argv[0];
+    
+    while ((c=getopt(argc, argv, "du")) != -1) {
+        switch (c) {
+            case 'd':
+                compress = 0;
+                decompress = 1;
+                break;
+
+            case 'u':
+                compress = 1;
+                decompress = 1;
+                break;
+
+            default:
+                usage();
+                break;
+        }
+    }
+    
+    if (optind+2 != argc) {
+        usage();
+    }
+    
+    if (decompress) {
+        from = open_compressed(argv[optind], 0);
+    }
+    else {
+        from = open_file(argv[optind]);
+    }
+
+    if (compress) {
+        to = open_compressed(argv[optind+1], ZIP_CREATE);
+    }
+    else {
+        to = open_file(argv[optind+1]);
+    }
+    
+    err = copy_source(from, to);
+    
+    zip_source_free(from);
+    zip_source_free(to);
+    
+    exit(err < 0 ? 1 : 0);
+}
+
diff --git a/regress/incons-archive-comment-longer.zip b/regress/incons-archive-comment-longer.zip
new file mode 100644 (file)
index 0000000..28d7ed3
Binary files /dev/null and b/regress/incons-archive-comment-longer.zip differ
diff --git a/regress/incons-archive-comment-shorter.zip b/regress/incons-archive-comment-shorter.zip
new file mode 100644 (file)
index 0000000..d23cad4
Binary files /dev/null and b/regress/incons-archive-comment-shorter.zip differ
diff --git a/regress/incons-cdoffset.zip b/regress/incons-cdoffset.zip
new file mode 100644 (file)
index 0000000..153e7a8
Binary files /dev/null and b/regress/incons-cdoffset.zip differ
diff --git a/regress/incons-central-compression-method.zip b/regress/incons-central-compression-method.zip
new file mode 100644 (file)
index 0000000..1bf78f2
Binary files /dev/null and b/regress/incons-central-compression-method.zip differ
diff --git a/regress/incons-central-compsize-larger-toolarge.zip b/regress/incons-central-compsize-larger-toolarge.zip
new file mode 100644 (file)
index 0000000..1c82ef6
Binary files /dev/null and b/regress/incons-central-compsize-larger-toolarge.zip differ
diff --git a/regress/incons-central-compsize-larger.zip b/regress/incons-central-compsize-larger.zip
new file mode 100644 (file)
index 0000000..67e9a99
Binary files /dev/null and b/regress/incons-central-compsize-larger.zip differ
diff --git a/regress/incons-central-compsize-smaller.zip b/regress/incons-central-compsize-smaller.zip
new file mode 100644 (file)
index 0000000..97dd14a
Binary files /dev/null and b/regress/incons-central-compsize-smaller.zip differ
diff --git a/regress/incons-central-crc.zip b/regress/incons-central-crc.zip
new file mode 100644 (file)
index 0000000..1f882ac
Binary files /dev/null and b/regress/incons-central-crc.zip differ
diff --git a/regress/incons-central-date.zip b/regress/incons-central-date.zip
new file mode 100644 (file)
index 0000000..6c831ca
Binary files /dev/null and b/regress/incons-central-date.zip differ
diff --git a/regress/incons-central-file-comment-longer.zip b/regress/incons-central-file-comment-longer.zip
new file mode 100644 (file)
index 0000000..b34c661
Binary files /dev/null and b/regress/incons-central-file-comment-longer.zip differ
diff --git a/regress/incons-central-file-comment-shorter.zip b/regress/incons-central-file-comment-shorter.zip
new file mode 100644 (file)
index 0000000..bc8b13d
Binary files /dev/null and b/regress/incons-central-file-comment-shorter.zip differ
diff --git a/regress/incons-central-magic-bad.zip b/regress/incons-central-magic-bad.zip
new file mode 100644 (file)
index 0000000..954563b
Binary files /dev/null and b/regress/incons-central-magic-bad.zip differ
diff --git a/regress/incons-central-magic-bad2.zip b/regress/incons-central-magic-bad2.zip
new file mode 100644 (file)
index 0000000..f99d9b7
Binary files /dev/null and b/regress/incons-central-magic-bad2.zip differ
diff --git a/regress/incons-central-size-larger.zip b/regress/incons-central-size-larger.zip
new file mode 100644 (file)
index 0000000..0779ce6
Binary files /dev/null and b/regress/incons-central-size-larger.zip differ
diff --git a/regress/incons-data.zip b/regress/incons-data.zip
new file mode 100644 (file)
index 0000000..e2ab58a
Binary files /dev/null and b/regress/incons-data.zip differ
diff --git a/regress/incons-ef-central-size-wrong.zip b/regress/incons-ef-central-size-wrong.zip
new file mode 100644 (file)
index 0000000..a3f4cc1
Binary files /dev/null and b/regress/incons-ef-central-size-wrong.zip differ
diff --git a/regress/incons-ef-local-id-size.zip b/regress/incons-ef-local-id-size.zip
new file mode 100644 (file)
index 0000000..44ce2f7
Binary files /dev/null and b/regress/incons-ef-local-id-size.zip differ
diff --git a/regress/incons-ef-local-id.zip b/regress/incons-ef-local-id.zip
new file mode 100644 (file)
index 0000000..aad5521
Binary files /dev/null and b/regress/incons-ef-local-id.zip differ
diff --git a/regress/incons-ef-local-incomplete1.zip b/regress/incons-ef-local-incomplete1.zip
new file mode 100644 (file)
index 0000000..61d6609
Binary files /dev/null and b/regress/incons-ef-local-incomplete1.zip differ
diff --git a/regress/incons-ef-local-incomplete2.zip b/regress/incons-ef-local-incomplete2.zip
new file mode 100644 (file)
index 0000000..5f8c83d
Binary files /dev/null and b/regress/incons-ef-local-incomplete2.zip differ
diff --git a/regress/incons-ef-local-incomplete3.zip b/regress/incons-ef-local-incomplete3.zip
new file mode 100644 (file)
index 0000000..298edd4
Binary files /dev/null and b/regress/incons-ef-local-incomplete3.zip differ
diff --git a/regress/incons-ef-local-incomplete4.zip b/regress/incons-ef-local-incomplete4.zip
new file mode 100644 (file)
index 0000000..3628307
Binary files /dev/null and b/regress/incons-ef-local-incomplete4.zip differ
diff --git a/regress/incons-ef-local-size.zip b/regress/incons-ef-local-size.zip
new file mode 100644 (file)
index 0000000..ad16710
Binary files /dev/null and b/regress/incons-ef-local-size.zip differ
diff --git a/regress/incons-eocd-magic-bad.zip b/regress/incons-eocd-magic-bad.zip
new file mode 100644 (file)
index 0000000..9e49e56
Binary files /dev/null and b/regress/incons-eocd-magic-bad.zip differ
diff --git a/regress/incons-file-count-high.zip b/regress/incons-file-count-high.zip
new file mode 100644 (file)
index 0000000..876a886
Binary files /dev/null and b/regress/incons-file-count-high.zip differ
diff --git a/regress/incons-file-count-low.zip b/regress/incons-file-count-low.zip
new file mode 100644 (file)
index 0000000..4af9038
Binary files /dev/null and b/regress/incons-file-count-low.zip differ
diff --git a/regress/incons-file-count-overflow.zip b/regress/incons-file-count-overflow.zip
new file mode 100644 (file)
index 0000000..461722c
Binary files /dev/null and b/regress/incons-file-count-overflow.zip differ
diff --git a/regress/incons-local-compression-method.zip b/regress/incons-local-compression-method.zip
new file mode 100644 (file)
index 0000000..2e70f59
Binary files /dev/null and b/regress/incons-local-compression-method.zip differ
diff --git a/regress/incons-local-compsize-larger.zip b/regress/incons-local-compsize-larger.zip
new file mode 100644 (file)
index 0000000..6fc27e0
Binary files /dev/null and b/regress/incons-local-compsize-larger.zip differ
diff --git a/regress/incons-local-compsize-smaller.zip b/regress/incons-local-compsize-smaller.zip
new file mode 100644 (file)
index 0000000..75f1463
Binary files /dev/null and b/regress/incons-local-compsize-smaller.zip differ
diff --git a/regress/incons-local-crc.zip b/regress/incons-local-crc.zip
new file mode 100644 (file)
index 0000000..6f74b15
Binary files /dev/null and b/regress/incons-local-crc.zip differ
diff --git a/regress/incons-local-filename-long.zip b/regress/incons-local-filename-long.zip
new file mode 100644 (file)
index 0000000..42b4a1f
Binary files /dev/null and b/regress/incons-local-filename-long.zip differ
diff --git a/regress/incons-local-filename-missing.zip b/regress/incons-local-filename-missing.zip
new file mode 100644 (file)
index 0000000..71d3eb2
Binary files /dev/null and b/regress/incons-local-filename-missing.zip differ
diff --git a/regress/incons-local-filename-short.zip b/regress/incons-local-filename-short.zip
new file mode 100644 (file)
index 0000000..c69be1b
Binary files /dev/null and b/regress/incons-local-filename-short.zip differ
diff --git a/regress/incons-local-filename.zip b/regress/incons-local-filename.zip
new file mode 100644 (file)
index 0000000..1878235
Binary files /dev/null and b/regress/incons-local-filename.zip differ
diff --git a/regress/incons-local-magic-bad.zip b/regress/incons-local-magic-bad.zip
new file mode 100644 (file)
index 0000000..9a6a061
Binary files /dev/null and b/regress/incons-local-magic-bad.zip differ
diff --git a/regress/incons-local-size-larger.zip b/regress/incons-local-size-larger.zip
new file mode 100644 (file)
index 0000000..4e0bb43
Binary files /dev/null and b/regress/incons-local-size-larger.zip differ
diff --git a/regress/large-uncompressable b/regress/large-uncompressable
new file mode 100644 (file)
index 0000000..e7e26d9
Binary files /dev/null and b/regress/large-uncompressable differ
diff --git a/regress/manyfiles-zip.zip b/regress/manyfiles-zip.zip
new file mode 100644 (file)
index 0000000..944fecc
Binary files /dev/null and b/regress/manyfiles-zip.zip differ
diff --git a/regress/manyfiles.zip b/regress/manyfiles.zip
deleted file mode 100644 (file)
index 3915c8e..0000000
Binary files a/regress/manyfiles.zip and /dev/null differ
diff --git a/regress/modify.c b/regress/modify.c
new file mode 100644 (file)
index 0000000..a278686
--- /dev/null
@@ -0,0 +1,1001 @@
+/*
+  modify.c -- test tool for modifying zip archive in multiple ways
+  Copyright (C) 2012-2015 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "config.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <inttypes.h>
+
+#ifndef HAVE_GETOPT
+#include "getopt.h"
+#endif
+
+#include "zip.h"
+
+zip_source_t *source_hole_create(const char *, int flags, zip_error_t *);
+
+typedef enum {
+    SOURCE_TYPE_NONE,
+    SOURCE_TYPE_IN_MEMORY,
+    SOURCE_TYPE_HOLE
+} source_type_t;
+
+typedef struct dispatch_table_s {
+    const char *cmdline_name;
+    int argument_count;
+    const char *arg_names;
+    const char *description;
+    int (*function)(int argc, char *argv[]);
+} dispatch_table_t;
+
+static zip_flags_t get_flags(const char *arg);
+static zip_int32_t get_compression_method(const char *arg);
+static void hexdump(const zip_uint8_t *data, zip_uint16_t len);
+static zip_t *read_to_memory(const char *archive, int flags, int *err, zip_source_t **srcp);
+static zip_source_t *source_nul(zip_t *za, zip_uint64_t length);
+
+zip_t *za, *z_in[16];
+int z_in_count;
+zip_flags_t stat_flags;
+
+static int
+add(int argc, char *argv[]) {
+    zip_source_t *zs;
+
+    if ((zs=zip_source_buffer(za, argv[1], strlen(argv[1]), 0)) == NULL) {
+       fprintf(stderr, "can't create zip_source from buffer: %s\n", zip_strerror(za));
+       return -1;
+    }
+
+    if (zip_add(za, argv[0], zs) == -1) {
+       zip_source_free(zs);
+       fprintf(stderr, "can't add file '%s': %s\n", argv[0], zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+add_dir(int argc, char *argv[]) {
+    /* add directory */
+    if (zip_add_dir(za, argv[0]) < 0) {
+       fprintf(stderr, "can't add directory '%s': %s\n", argv[0], zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+add_file(int argc, char *argv[]) {
+    zip_source_t *zs;
+    zip_uint64_t start = strtoull(argv[2], NULL, 10);
+    zip_int64_t len = strtoll(argv[3], NULL, 10);
+
+    if (strcmp(argv[1], "/dev/stdin") == 0) {
+       if ((zs=zip_source_filep(za, stdin, start, len)) == NULL) {
+           fprintf(stderr, "can't create zip_source from stdin: %s\n", zip_strerror(za));
+           return -1;
+       }
+    } else {
+       if ((zs=zip_source_file(za, argv[1], start, len)) == NULL) {
+           fprintf(stderr, "can't create zip_source from file: %s\n", zip_strerror(za));
+           return -1;
+       }
+    }
+
+    if (zip_add(za, argv[0], zs) == -1) {
+       zip_source_free(zs);
+       fprintf(stderr, "can't add file '%s': %s\n", argv[0], zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+add_from_zip(int argc, char *argv[]) {
+    zip_uint64_t idx;
+    int err;
+    zip_source_t *zs;
+    /* add from another zip file */
+    idx = strtoull(argv[2], NULL, 10);
+    zip_uint64_t start = strtoull(argv[3], NULL, 10);
+    zip_int64_t len = strtoll(argv[4], NULL, 10);
+    if ((z_in[z_in_count]=zip_open(argv[1], ZIP_CHECKCONS, &err)) == NULL) {
+       zip_error_t error;
+       zip_error_init_with_code(&error, err);
+       fprintf(stderr, "can't open zip archive '%s': %s\n", argv[1], zip_error_strerror(&error));
+       zip_error_fini(&error);
+       return -1;
+    }
+    if ((zs=zip_source_zip(za, z_in[z_in_count], idx, 0, start, len)) == NULL) {
+       fprintf(stderr, "error creating file source from '%s' index '%" PRIu64 "': %s\n", argv[1], idx, zip_strerror(za));
+       zip_close(z_in[z_in_count]);
+       return -1;
+    }
+    if (zip_add(za, argv[0], zs) == -1) {
+       fprintf(stderr, "can't add file '%s': %s\n", argv[0], zip_strerror(za));
+       zip_source_free(zs);
+       zip_close(z_in[z_in_count]);
+       return -1;
+    }
+    z_in_count++;
+    return 0;
+}
+
+static int
+add_nul(int argc, char *argv[]) {
+    zip_source_t *zs;
+    zip_uint64_t length = strtoull(argv[1], NULL, 10);
+    
+    if ((zs=source_nul(za, length)) == NULL) {
+        fprintf(stderr, "can't create zip_source for length: %s\n", zip_strerror(za));
+        return -1;
+    }
+    
+    if (zip_add(za, argv[0], zs) == -1) {
+        zip_source_free(zs);
+        fprintf(stderr, "can't add file '%s': %s\n", argv[0], zip_strerror(za));
+        return -1;
+    }
+    return 0;
+}
+
+static int
+cat(int argc, char *argv[]) {
+    /* output file contents to stdout */
+    zip_uint64_t idx;
+    zip_int64_t n;
+    zip_file_t *zf;
+    char buf[8192];
+    int err;
+    idx = strtoull(argv[0], NULL, 10);
+
+    if ((zf=zip_fopen_index(za, idx, 0)) == NULL) {
+       fprintf(stderr, "can't open file at index '%" PRIu64 "': %s\n", idx, zip_strerror(za));
+       return -1;
+    }
+    while ((n=zip_fread(zf, buf, sizeof(buf))) > 0) {
+       if (fwrite(buf, (size_t)n, 1, stdout) != 1) {
+           zip_fclose(zf);
+           fprintf(stderr, "can't write file contents to stdout: %s\n", strerror(errno));
+           return -1;
+       }
+    }
+    if (n == -1) {
+       zip_fclose(zf);
+       fprintf(stderr, "can't read file at index '%" PRIu64 "': %s\n", idx, zip_file_strerror(zf));
+       return -1;
+    }
+    if ((err = zip_fclose(zf)) != 0) {
+       zip_error_t error;
+       
+       zip_error_init_with_code(&error, err);
+       fprintf(stderr, "can't close file at index '%" PRIu64 "': %s\n", idx, zip_error_strerror(&error));
+       return -1;
+    }
+
+    return 0;
+}
+
+static int
+count_extra(int argc, char *argv[]) {
+    zip_int16_t count;
+    zip_uint64_t idx;
+    zip_flags_t ceflags = 0;
+    idx = strtoull(argv[0], NULL, 10);
+    ceflags = get_flags(argv[1]);
+    if ((count=zip_file_extra_fields_count(za, idx, ceflags)) < 0) {
+       fprintf(stderr, "can't get extra field count for file at index '%" PRIu64 "': %s\n", idx, zip_strerror(za));
+       return -1;
+    } else {
+       printf("Extra field count: %d\n", count);
+    }
+    return 0;
+}
+
+static int
+count_extra_by_id(int argc, char *argv[]) {
+    zip_int16_t count;
+    zip_uint16_t eid;
+    zip_flags_t ceflags = 0;
+    zip_uint64_t idx;
+    idx = strtoull(argv[0], NULL, 10);
+    eid = (zip_uint16_t)strtoull(argv[1], NULL, 10);
+    ceflags = get_flags(argv[2]);
+    if ((count=zip_file_extra_fields_count_by_id(za, idx, eid, ceflags)) < 0) {
+       fprintf(stderr, "can't get extra field count for file at index '%" PRIu64 "' and for id `%d': %s\n", idx, eid, zip_strerror(za));
+       return -1;
+    } else {
+       printf("Extra field count: %d\n", count);
+    }
+    return 0;
+}
+
+static int
+delete(int argc, char *argv[]) {
+    zip_uint64_t idx;
+    idx = strtoull(argv[0], NULL, 10);
+    if (zip_delete(za, idx) < 0) {
+       fprintf(stderr, "can't delete file at index '%" PRIu64 "': %s\n", idx, zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+delete_extra(int argc, char *argv[]) {
+    zip_flags_t geflags;
+    zip_uint16_t eid;
+    zip_uint64_t idx;
+    idx = strtoull(argv[0], NULL, 10);
+    eid = (zip_uint16_t)strtoull(argv[1], NULL, 10);
+    geflags = get_flags(argv[2]);
+    if ((zip_file_extra_field_delete(za, idx, eid, geflags)) < 0) {
+       fprintf(stderr, "can't delete extra field data for file at index '%" PRIu64 "', extra field id `%d': %s\n", idx, eid, zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+delete_extra_by_id(int argc, char *argv[]) {
+    zip_flags_t geflags;
+    zip_uint16_t eid, eidx;
+    zip_uint64_t idx;
+    idx = strtoull(argv[0], NULL, 10);
+    eid = (zip_uint16_t)strtoull(argv[1], NULL, 10);
+    eidx = (zip_uint16_t)strtoull(argv[2], NULL, 10);
+    geflags = get_flags(argv[3]);
+    if ((zip_file_extra_field_delete_by_id(za, idx, eid, eidx, geflags)) < 0) {
+       fprintf(stderr, "can't delete extra field data for file at index '%" PRIu64 "', extra field id `%d', extra field idx `%d': %s\n", idx, eid, eidx, zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+get_archive_comment(int argc, char *argv[]) {
+    const char *comment;
+    int len;
+    /* get archive comment */
+    if ((comment=zip_get_archive_comment(za, &len, 0)) == NULL)
+       printf("No archive comment\n");
+    else
+       printf("Archive comment: %.*s\n", len, comment);
+    return 0;
+}
+
+static int
+get_extra(int argc, char *argv[]) {
+    zip_flags_t geflags;
+    zip_uint16_t id, eidx, eflen;
+    const zip_uint8_t *efdata;
+    zip_uint64_t idx;
+    /* get extra field data */
+    idx = strtoull(argv[0], NULL, 10);
+    eidx = (zip_uint16_t)strtoull(argv[1], NULL, 10);
+    geflags = get_flags(argv[2]);
+    if ((efdata=zip_file_extra_field_get(za, idx, eidx, &id, &eflen, geflags)) == NULL) {
+       fprintf(stderr, "can't get extra field data for file at index %" PRIu64 ", extra field %d, flags %u: %s\n", idx, eidx, geflags, zip_strerror(za));
+       return -1;
+    }
+    printf("Extra field 0x%04x: len %d", id, eflen);
+    if (eflen > 0) {
+       printf(", data ");
+       hexdump(efdata, eflen);
+    }
+    printf("\n");
+    return 0;
+}
+
+static int
+get_extra_by_id(int argc, char *argv[]) {
+    zip_flags_t geflags;
+    zip_uint16_t eid, eidx, eflen;
+    const zip_uint8_t *efdata;
+    zip_uint64_t idx;
+    idx = strtoull(argv[0], NULL, 10);
+    eid = (zip_uint16_t)strtoull(argv[1], NULL, 10);
+    eidx = (zip_uint16_t)strtoull(argv[2], NULL, 10);
+    geflags = get_flags(argv[3]);
+    if ((efdata=zip_file_extra_field_get_by_id(za, idx, eid, eidx, &eflen, geflags)) == NULL) {
+       fprintf(stderr, "can't get extra field data for file at index %" PRIu64 ", extra field id %d, ef index %d, flags %u: %s\n", idx, eid, eidx, geflags, zip_strerror(za));
+       return -1;
+    }
+    printf("Extra field 0x%04x: len %d", eid, eflen);
+    if (eflen > 0) {
+       printf(", data ");
+       hexdump(efdata, eflen);
+    }
+    printf("\n");
+    return 0;
+}
+
+static int
+get_file_comment(int argc, char *argv[]) {
+    const char *comment;
+    int len;
+    zip_uint64_t idx;
+    /* get file comment */
+    idx = strtoull(argv[0], NULL, 10);
+    if ((comment=zip_get_file_comment(za, idx, &len, 0)) == NULL) {
+       fprintf(stderr, "can't get comment for '%s': %s\n", zip_get_name(za, idx, 0), zip_strerror(za));
+       return -1;
+    } else if (len == 0)
+       printf("No comment for '%s'\n", zip_get_name(za, idx, 0));
+    else
+       printf("File comment for '%s': %.*s\n", zip_get_name(za, idx, 0), len, comment);
+    return 0;
+}
+
+static int
+name_locate(int argc, char *argv[]) {
+    zip_flags_t flags;
+    zip_int64_t idx;
+    flags = get_flags(argv[1]);
+
+    if ((idx=zip_name_locate(za, argv[0], flags)) < 0) {
+       fprintf(stderr, "can't find entry with name '%s' using flags '%s'\n", argv[0], argv[1]);
+    } else {
+       printf("name '%s' using flags '%s' found at index %" PRId64 "\n", argv[0], argv[1], idx);
+    }  
+
+    return 0;
+}
+
+static int
+zrename(int argc, char *argv[]) {
+    zip_uint64_t idx;
+    idx = strtoull(argv[0], NULL, 10);
+    if (zip_rename(za, idx, argv[1]) < 0) {
+       fprintf(stderr, "can't rename file at index '%" PRIu64 "' to `%s': %s\n", idx, argv[1], zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+replace_file_contents(int argc, char *argv[]) {
+    /* replace file contents with data from command line */
+    const char *content;
+    zip_source_t *s;
+    zip_uint64_t idx;
+    idx = strtoull(argv[0], NULL, 10);
+    content = argv[1];
+    if ((s=zip_source_buffer(za, content, strlen(content), 0)) == NULL ||
+       zip_file_replace(za, idx, s, 0) < 0) {
+       zip_source_free(s);
+       fprintf(stderr, "error replacing file data: %s\n", zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+set_extra(int argc, char *argv[]) {
+    zip_flags_t geflags;
+    zip_uint16_t eid, eidx;
+    const zip_uint8_t *efdata;
+    zip_uint64_t idx;
+    idx = strtoull(argv[0], NULL, 10);
+    eid = (zip_uint16_t)strtoull(argv[1], NULL, 10);
+    eidx = (zip_uint16_t)strtoull(argv[2], NULL, 10);
+    geflags = get_flags(argv[3]);
+    efdata = (zip_uint8_t *)argv[4];
+    if ((zip_file_extra_field_set(za, idx, eid, eidx, efdata, (zip_uint16_t)strlen((const char *)efdata), geflags)) < 0) {
+       fprintf(stderr, "can't set extra field data for file at index '%" PRIu64 "', extra field id `%d', index `%d': %s\n", idx, eid, eidx, zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+set_archive_comment(int argc, char *argv[]) {
+    if (zip_set_archive_comment(za, argv[0], (zip_uint16_t)strlen(argv[0])) < 0) {
+       fprintf(stderr, "can't set archive comment to `%s': %s\n", argv[0], zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+set_file_comment(int argc, char *argv[]) {
+    zip_uint64_t idx;
+    idx = strtoull(argv[0], NULL, 10);
+    if (zip_file_set_comment(za, idx, argv[1], (zip_uint16_t)strlen(argv[1]), 0) < 0) {
+       fprintf(stderr, "can't set file comment at index '%" PRIu64 "' to `%s': %s\n", idx, argv[1], zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+set_file_compression(int argc, char *argv[]) {
+    zip_int32_t method;
+    zip_uint32_t flags;
+    zip_uint64_t idx;
+    idx = strtoull(argv[0], NULL, 10);
+    method = get_compression_method(argv[1]);
+    flags = (zip_uint32_t)strtoull(argv[2], NULL, 10);
+    if (zip_set_file_compression(za, idx, method, flags) < 0) {
+       fprintf(stderr, "can't set file compression method at index '%" PRIu64 "' to `%s', flags `%d': %s\n", idx, argv[1], flags, zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+set_file_mtime(int argc, char *argv[]) {
+    /* set file last modification time (mtime) */
+    time_t mtime;
+    zip_uint64_t idx;
+    idx = strtoull(argv[0], NULL, 10);
+    mtime = (time_t)strtoull(argv[1], NULL, 10);
+    if (zip_file_set_mtime(za, idx, mtime, 0) < 0) {
+       fprintf(stderr, "can't set file mtime at index '%" PRIu64 "' to `%ld': %s\n", idx, mtime, zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+zstat(int argc, char *argv[]) {
+    zip_uint64_t idx;
+    char buf[100];
+    struct zip_stat sb;
+    idx = strtoull(argv[0], NULL, 10);
+
+    if (zip_stat_index(za, idx, stat_flags, &sb) < 0) {
+       fprintf(stderr, "zip_stat_index failed on '%" PRIu64 "' failed: %s\n", idx, zip_strerror(za));
+       return -1;
+    }
+
+    if (sb.valid & ZIP_STAT_NAME)
+       printf("name: '%s'\n", sb.name);
+    if (sb.valid & ZIP_STAT_INDEX)
+       printf("index: '%"PRIu64"'\n", sb.index);
+    if (sb.valid & ZIP_STAT_SIZE)
+       printf("size: '%"PRIu64"'\n", sb.size);
+    if (sb.valid & ZIP_STAT_COMP_SIZE)
+       printf("compressed size: '%"PRIu64"'\n", sb.comp_size);
+    if (sb.valid & ZIP_STAT_MTIME) {
+       struct tm *tpm;
+       tpm = localtime(&sb.mtime);
+       strftime(buf, sizeof(buf), "%a %b %d %Y %H:%M:%S", tpm);
+       printf("mtime: '%s'\n", buf);
+    }
+    if (sb.valid & ZIP_STAT_CRC)
+       printf("crc: '%0x'\n", sb.crc);
+    if (sb.valid & ZIP_STAT_COMP_METHOD)
+       printf("compression method: '%d'\n", sb.comp_method);
+    if (sb.valid & ZIP_STAT_ENCRYPTION_METHOD)
+       printf("encryption method: '%d'\n", sb.encryption_method);
+    if (sb.valid & ZIP_STAT_FLAGS)
+       printf("flags: '%ld'\n", (long)sb.flags);
+    printf("\n");
+
+    return 0;
+}
+
+static int
+unchange_all(int argc, char *argv[]) {
+    if (zip_unchange_all(za) < 0) {
+       fprintf(stderr, "can't revert changes to archive: %s\n", zip_strerror(za));
+       return -1;
+    }
+    return 0;
+}
+
+static int
+zin_close(int argc, char *argv[]) {
+    zip_uint64_t idx;
+
+    idx = strtoull(argv[0], NULL, 10);
+    if (idx >= z_in_count) {
+       fprintf(stderr, "invalid argument '%" PRIu64 "', only %d zip sources open\n", idx, z_in_count);
+       return -1;
+    }
+    if (zip_close(z_in[idx]) < 0) {
+       fprintf(stderr, "can't close source archive: %s\n", zip_strerror(z_in[idx]));
+       return -1;
+    }
+    z_in[idx] = z_in[z_in_count];
+    z_in_count--;
+
+    return 0;
+}
+
+static zip_flags_t
+get_flags(const char *arg)
+{
+    zip_flags_t flags = 0;
+    if (strchr(arg, 'C') != NULL)
+       flags |= ZIP_FL_NOCASE;
+    if (strchr(arg, 'c') != NULL)
+       flags |= ZIP_FL_CENTRAL;
+    if (strchr(arg, 'd') != NULL)
+       flags |= ZIP_FL_NODIR;
+    if (strchr(arg, 'l') != NULL)
+       flags |= ZIP_FL_LOCAL;
+    if (strchr(arg, 'u') != NULL)
+       flags |= ZIP_FL_UNCHANGED;
+    return flags;
+}
+
+static zip_int32_t
+get_compression_method(const char *arg)
+{
+    if (strcmp(arg, "default") == 0)
+        return ZIP_CM_DEFAULT;
+    else if (strcmp(arg, "store") == 0)
+        return ZIP_CM_STORE;
+    else if (strcmp(arg, "deflate") ==0)
+        return ZIP_CM_DEFLATE;
+    else if (strcmp(arg, "unknown") ==0)
+        return 99;
+    return 0; /* TODO: error handling */
+}
+
+static void
+hexdump(const zip_uint8_t *data, zip_uint16_t len)
+{
+    zip_uint16_t i;
+
+    if (len <= 0)
+       return;
+
+    printf("0x");
+       
+    for (i=0; i<len; i++)
+       printf("%02x", data[i]);
+
+    return;    
+}
+
+
+static zip_t *
+read_hole(const char *archive, int flags, int *err)
+{
+    zip_error_t error;
+    zip_source_t *src = NULL;
+    zip_t *zs = NULL;
+    
+    zip_error_init(&error);
+    
+    if ((src = source_hole_create(archive, flags, &error)) == NULL
+        || (zs = zip_open_from_source(src, flags, &error)) == NULL) {
+        zip_source_free(src);
+        *err = zip_error_code_zip(&error);
+        errno = zip_error_code_system(&error);
+    }
+    
+    return zs;
+}
+
+
+static zip_t *
+read_to_memory(const char *archive, int flags, int *err, zip_source_t **srcp)
+{
+    struct stat st;
+    zip_source_t *src;
+    zip_t *zb;
+    zip_error_t error;
+
+    if (stat(archive, &st) < 0) {
+       if (errno == ENOENT) {
+           src = zip_source_buffer_create(NULL, 0, 0, &error);
+       }
+       else {
+           *err = ZIP_ER_OPEN;
+           return NULL;
+       }
+    }
+    else {
+       char *buf;
+       FILE *fp;
+       if ((buf=malloc((size_t)st.st_size)) == NULL) {
+           *err = ZIP_ER_MEMORY;
+           return NULL;
+       }
+       if ((fp=fopen(archive, "r")) == NULL) {
+           free(buf);
+           *err = ZIP_ER_READ;
+           return NULL;
+       }
+       if (fread(buf, (size_t)st.st_size, 1, fp) < 1) {
+           free(buf);
+           fclose(fp);
+           *err = ZIP_ER_READ;
+           return NULL;
+       }
+       fclose(fp);
+       src = zip_source_buffer_create(buf, (zip_uint64_t)st.st_size, 1, &error);
+       if (src == NULL) {
+           free(buf);
+       }
+    }
+    if (src == NULL) {
+       *err = zip_error_code_zip(&error);
+       errno = zip_error_code_system(&error);
+       return NULL;
+    }
+    zb = zip_open_from_source(src, flags, &error);
+    if (zb == NULL) {
+       *err = zip_error_code_zip(&error);
+       errno = zip_error_code_system(&error);
+       zip_source_free(src);
+       return NULL;
+    }
+    zip_source_keep(src);
+    *srcp = src;
+    return zb;
+}
+
+
+typedef struct source_nul {
+    zip_error_t error;
+    zip_uint64_t length;
+    zip_uint64_t offset;
+} source_nul_t;
+
+static zip_int64_t
+source_nul_cb(void *ud, void *data, zip_uint64_t length, zip_source_cmd_t command)
+{
+    source_nul_t *ctx = (source_nul_t *)ud;
+    
+    switch (command) {
+        case ZIP_SOURCE_CLOSE:
+            return 0;
+
+        case ZIP_SOURCE_ERROR:
+            return zip_error_to_data(&ctx->error, data, length);
+            
+        case ZIP_SOURCE_FREE:
+            free(ctx);
+            return 0;
+            
+        case ZIP_SOURCE_OPEN:
+            ctx->offset = 0;
+            return 0;
+            
+        case ZIP_SOURCE_READ:
+           if (length > ZIP_INT64_MAX) {
+               zip_error_set(&ctx->error, ZIP_ER_INVAL, 0);
+               return -1;
+           }
+
+            if (length > ctx->length - ctx->offset) {
+                length =ctx->length - ctx->offset;
+            }
+            
+            memset(data, 0, length);
+            ctx->offset += length;
+            return (zip_int64_t)length;
+            
+        case ZIP_SOURCE_STAT: {
+            zip_stat_t *st = ZIP_SOURCE_GET_ARGS(zip_stat_t, data, length, &ctx->error);
+            
+            if (st == NULL) {
+                return -1;
+            }
+            
+            st->valid |= ZIP_STAT_SIZE;
+            st->size = ctx->length;
+            
+            return 0;
+        }
+            
+        case ZIP_SOURCE_SUPPORTS:
+            return zip_source_make_command_bitmap(ZIP_SOURCE_CLOSE, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_STAT, -1);
+
+        default:
+            zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0);
+            return -1;
+    }
+}
+
+static zip_source_t *
+source_nul(zip_t *zs, zip_uint64_t length)
+{
+    source_nul_t *ctx;
+    zip_source_t *src;
+    
+    if ((ctx = (source_nul_t *)malloc(sizeof(*ctx))) == NULL) {
+        zip_error_set(zip_get_error(zs), ZIP_ER_MEMORY, 0);
+        return NULL;
+    }
+    
+    zip_error_init(&ctx->error);
+    ctx->length = length;
+    ctx->offset = 0;
+    
+    if ((src = zip_source_function(zs, source_nul_cb, ctx)) == NULL) {
+        free(ctx);
+        return NULL;
+    }
+    
+    return src;
+}
+
+
+static int
+write_memory_src_to_file(const char *archive, zip_source_t *src)
+{
+    zip_stat_t zst;
+    char *buf;
+    FILE *fp;
+
+    if (zip_source_stat(src, &zst) < 0) {
+       fprintf(stderr, "zip_source_stat on buffer failed: %s\n", zip_error_strerror(zip_source_error(src)));
+       return -1;
+    }
+    if (zip_source_open(src) < 0) {
+       if (zip_error_code_zip(zip_source_error(src)) == ZIP_ER_DELETED) {
+           if (remove(archive) < 0 && errno != ENOENT) {
+               fprintf(stderr, "remove failed: %s\n", strerror(errno));
+               return -1;
+           }
+           return 0;
+       }
+       fprintf(stderr, "zip_source_open on buffer failed: %s\n", zip_error_strerror(zip_source_error(src)));
+       return -1;
+    }
+    if ((buf=malloc(zst.size)) == NULL) {
+       fprintf(stderr, "malloc failed: %s\n", strerror(errno));
+       zip_source_close(src);
+       return -1;
+    }
+    if (zip_source_read(src, buf, zst.size) < (zip_int64_t)zst.size) {
+       fprintf(stderr, "zip_source_read on buffer failed: %s\n", zip_error_strerror(zip_source_error(src)));
+       zip_source_close(src);
+       free(buf);
+       return -1;
+    }
+    zip_source_close(src);
+    if ((fp=fopen(archive, "wb")) == NULL) {
+       fprintf(stderr, "fopen failed: %s\n", strerror(errno));
+       free(buf);
+       return -1;
+    }
+    if (fwrite(buf, zst.size, 1, fp) < 1) {
+       fprintf(stderr, "fwrite failed: %s\n", strerror(errno));
+       free(buf);
+       fclose(fp);
+       return -1;
+    }
+    free(buf);
+    if (fclose(fp) != 0) {
+       fprintf(stderr, "fclose failed: %s\n", strerror(errno));
+       return -1;
+    }
+    return 0;
+}
+
+dispatch_table_t dispatch_table[] = {
+    { "add", 2, "name content", "add file called name using content", add },
+    { "add_dir", 1, "name", "add directory", add_dir },
+    { "add_file", 4, "name file_to_add offset len", "add file to archive, len bytes starting from offset", add_file },
+    { "add_from_zip", 5, "name archivename index offset len", "add file from another archive, len bytes starting from offset", add_from_zip },
+    { "add_nul", 2, "name length", "add NUL bytes", add_nul },
+    { "cat", 1, "index", "output file contents to stdout", cat },
+    { "count_extra", 2, "index flags", "show number of extra fields for archive entry", count_extra },
+    { "count_extra_by_id", 3, "index extra_id flags", "show number of extra fields of type extra_id for archive entry", count_extra_by_id },
+    { "delete", 1, "index", "remove entry", delete },
+    { "delete_extra", 3, "index extra_idx flags", "remove extra field", delete_extra },
+    { "delete_extra_by_id", 4, "index extra_id extra_index flags", "remove extra field of type extra_id", delete_extra_by_id },
+    { "get_archive_comment", 0, "", "show archive comment", get_archive_comment },
+    { "get_extra", 3, "index extra_index flags", "show extra field", get_extra },
+    { "get_extra_by_id", 4, "index extra_id extra_index flags", "show extra field of type extra_id", get_extra_by_id },
+    { "get_file_comment", 1, "index", "get file comment", get_file_comment },
+    { "name_locate", 2, "name flags", "find entry in archive", name_locate },
+    { "rename", 2, "index name", "rename entry", zrename },
+    { "replace_file_contents", 2, "index data", "replace entry with data", replace_file_contents },
+    { "set_archive_comment", 1, "comment", "set archive comment", set_archive_comment },
+    { "set_extra", 5, "index extra_id extra_index flags value", "set extra field", set_extra },
+    { "set_file_comment", 2, "index comment", "set file comment", set_file_comment },
+    { "set_file_compression", 3, "index method flags", "set file compression method", set_file_compression },
+    { "set_file_mtime", 2, "index timestamp", "set file modification time", set_file_mtime },
+    { "stat", 1, "index", "print information about entry", zstat },
+    { "unchange_all", 0, "", "revert all changes", unchange_all },
+    { "zin_close", 1, "index", "close input zip_source (for internal tests)", zin_close }
+};
+
+static int
+dispatch(int argc, char *argv[])
+{
+    unsigned int i;
+    for (i=0; i<sizeof(dispatch_table)/sizeof(dispatch_table_t); i++) {
+       if (strcmp(dispatch_table[i].cmdline_name, argv[0]) == 0) {
+           argc--;
+           argv++;
+           /* 1 for the command, argument_count for the arguments */
+           if (argc < dispatch_table[i].argument_count) {
+               fprintf(stderr, "not enough arguments for command '%s': %d available, %d needed\n", dispatch_table[i].cmdline_name, argc, dispatch_table[i].argument_count);
+               return -1;
+           }
+           if (dispatch_table[i].function(argc, argv) == 0)
+               return 1 + dispatch_table[i].argument_count;
+           return -1;
+       }
+    }
+
+    fprintf(stderr, "unknown command '%s'\n", argv[0]);
+    return -1;
+}
+
+
+static void
+usage(const char *progname)
+{
+    unsigned int i;
+    fprintf(stderr, "usage: %s [-cemnt] archive command1 [args] [command2 [args] ...]\n\n"
+           "Supported options are:\n"
+           "\t-c\tcheck consistency\n"
+           "\t-e\terror if archive already exists (only useful with -n)\n"
+           "\t-g\tguess file name encoding (for stat)\n"
+            "\t-H\twrite files with holes compactly\n"
+           "\t-m\tread archive into memory, and modify there; write out at end\n"
+           "\t-n\tcreate archive if it doesn't exist (default)\n"
+           "\t-r\tprint raw file name encoding without translation (for stat)\n"
+           "\t-s\tfollow file name convention strictly (for stat)\n"
+           "\t-t\tdisregard current archive contents, if any\n", progname);
+    fprintf(stderr, "\nSupported commands and arguments are:\n");
+    for (i=0; i<sizeof(dispatch_table)/sizeof(dispatch_table_t); i++) {
+       fprintf(stderr, "\t%s %s -- %s\n", dispatch_table[i].cmdline_name, dispatch_table[i].arg_names, dispatch_table[i].description);
+    }
+    fprintf(stderr, "\nSupported flags are:\n"
+           "\tC\tZIP_FL_NOCASE\n"
+           "\tc\tZIP_FL_CENTRAL\n"
+           "\td\tZIP_FL_NODIR\n"
+           "\tl\tZIP_FL_LOCAL\n"
+           "\tu\tZIP_FL_UNCHANGED\n");
+    fprintf(stderr, "\nThe index is zero-based.\n");
+    exit(1);
+}
+
+int
+main(int argc, char *argv[])
+{
+    const char *archive;
+    zip_source_t *memory_src;
+    int c, arg, err, flags, i;
+    const char *prg;
+    source_type_t source_type = SOURCE_TYPE_NONE;
+
+    flags = 0;
+    prg = argv[0];
+
+    if (argc < 2)
+       usage(prg);
+
+    while ((c=getopt(argc, argv, "cegHmnrst")) != -1) {
+       switch (c) {
+       case 'c':
+           flags |= ZIP_CHECKCONS;
+           break;
+       case 'e':
+           flags |= ZIP_EXCL;
+           break;
+       case 'g':
+           stat_flags = ZIP_FL_ENC_GUESS;
+           break;
+        case 'H':
+            source_type = SOURCE_TYPE_HOLE;
+            break;
+       case 'm':
+            source_type = SOURCE_TYPE_IN_MEMORY;
+            break;
+       case 'n':
+           flags |= ZIP_CREATE;
+           break;
+       case 'r':
+           stat_flags = ZIP_FL_ENC_RAW;
+           break;
+       case 's':
+           stat_flags = ZIP_FL_ENC_STRICT;
+           break;
+       case 't':
+           flags |= ZIP_TRUNCATE;
+           break;
+
+       default:
+           usage(prg);
+       }
+    }
+    
+    arg = optind;
+
+    archive = argv[arg++];
+
+    if (flags == 0)
+       flags = ZIP_CREATE;
+
+    switch (source_type) {
+        case SOURCE_TYPE_NONE:
+            za = zip_open(archive, flags, &err);
+            break;
+            
+        case SOURCE_TYPE_IN_MEMORY:
+            za = read_to_memory(archive, flags, &err, &memory_src);
+            break;
+            
+        case SOURCE_TYPE_HOLE: {
+            za = read_hole(archive, flags, &err);
+            break;
+        }
+    }
+    if (za == NULL) {
+       zip_error_t error;
+       zip_error_init_with_code(&error, err);
+       fprintf(stderr, "can't open zip archive '%s': %s\n", archive, zip_error_strerror(&error));
+       zip_error_fini(&error);
+       return 1;
+    }
+
+    err = 0;
+    while (arg < argc) {
+       int ret;
+       ret = dispatch(argc-arg, argv+arg);
+       if (ret > 0) {
+           arg += ret;
+       } else {
+           err = 1;
+           break;
+       }
+    }
+
+    if (zip_close(za) == -1) {
+       fprintf(stderr, "can't close zip archive '%s': %s\n", archive, zip_strerror(za));
+       return 1;
+    }
+    if (source_type == SOURCE_TYPE_IN_MEMORY) {
+       if (write_memory_src_to_file(archive, memory_src) < 0) {
+           err = 1;
+       }
+       zip_source_free(memory_src);
+    }
+
+    for (i=0; i<z_in_count; i++) {
+       if (zip_close(z_in[i]) < 0) {
+           err = 1;
+       }
+    }
+
+    return err;
+}
diff --git a/regress/name_locate.c b/regress/name_locate.c
deleted file mode 100644 (file)
index 62d3714..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
-  name_locate.c -- test cases for finding files in zip archives
-  Copyright (C) 2005-2006 Dieter Baron and Thomas Klausner
-
-  This file is part of libzip, a library to manipulate ZIP archives.
-  The authors can be contacted at <libzip@nih.at>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
-  1. Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-  2. Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in
-     the documentation and/or other materials provided with the
-     distribution.
-  3. The names of the authors may not be used to endorse or promote
-     products derived from this software without specific prior
-     written permission.
-  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-\f
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "zip.h"
-
-int find_fail(struct zip *, const char *, int, int);
-int find_success(struct zip *, const char *, int);
-
-const char *prg;
-
-\f
-
-int
-main(int argc, char *argv[])
-{
-    int fail, ze;
-    struct zip *z;
-    const char *archive;
-
-    fail = 0;
-    prg = argv[0];
-
-    if (argc != 2) {
-        fprintf(stderr, "usage: %s archive\n", prg);
-        return 1;
-    }
-
-    archive = argv[1];
-
-    if ((z=zip_open(archive, 0, &ze)) == NULL) {
-       printf("%s: opening zip archive ``%s'' failed (%d)\n", prg,
-              archive, ze);
-       return 1;
-    }
-
-    fail += find_fail(z, "nosuchfile", 0, ZIP_ER_NOENT);
-    fail += find_success(z, "test", 0);
-    fail += find_fail(z, "TeSt", 0, ZIP_ER_NOENT);
-    fail += find_success(z, "TeSt", ZIP_FL_NOCASE);
-    fail += find_success(z, "testdir/test2", 0);
-    fail += find_success(z, "tesTdir/tESt2", ZIP_FL_NOCASE);
-    fail += find_fail(z, "testdir/test2", ZIP_FL_NODIR, ZIP_ER_NOENT);
-    fail += find_fail(z, "tesTdir/tESt2", ZIP_FL_NOCASE|ZIP_FL_NODIR,
-                     ZIP_ER_NOENT);
-    fail += find_fail(z, "test2", 0, ZIP_ER_NOENT);
-    fail += find_success(z, "test2", ZIP_FL_NODIR);
-    fail += find_success(z, "TeST2", ZIP_FL_NODIR|ZIP_FL_NOCASE);
-    zip_delete(z, 0);
-    fail += find_fail(z, "test", 0, ZIP_ER_NOENT);
-    fail += find_success(z, "test", ZIP_FL_UNCHANGED);
-    zip_unchange_all(z);
-    fail += find_success(z, "test", 0);
-
-    if (zip_close(z) == -1) {
-       fprintf(stderr, "%s: can't close zip archive %s\n", prg,
-               archive);
-       return 1;
-    }
-
-    exit(fail ? 1 : 0);
-}
-
-\f
-
-int
-find_fail(struct zip *z, const char *name, int flags, int zerr)
-{
-    int ze, se;
-    char expected[80];
-
-    if (zip_name_locate(z, name, flags) < 0) {
-       zip_error_get(z, &ze, &se);
-       if (ze != zerr) {
-           zip_error_to_str(expected, sizeof(expected), zerr, 0);
-           printf("%s: unexpected error while looking for ``%s'': "
-                  "got ``%s'', expected ``%s''\n", prg, name,
-                  zip_strerror(z), expected);
-           return 1;
-       }
-
-       return 0;
-    }
-
-    return 1;
-}
-
-\f
-
-int
-find_success(struct zip *z, const char *name, int flags)
-{
-
-    if (zip_name_locate(z, name, flags) < 0) {
-       printf("%s: unexpected error while looking for ``%s'': %s\n",
-              prg, name, zip_strerror(z));
-       return 1;
-    }
-
-    return 0;
-}
index 5b5bde0..5d7fc26 100644 (file)
@@ -1,5 +1,28 @@
 # various tests for zip_name_locate
-program name_locate
-args test.zip
+program modify
+args test.zip  name_locate nosuchfile 0  name_locate test 0  name_locate "" 0  name_locate TeSt 0  name_locate TeSt C  name_locate testdir/test2 0  name_locate tesTdir/tESt2 C  name_locate testdir/test2 d  name_locate tesTdir/tESt2 dC  name_locate test2 0  name_locate test2 d  name_locate TeST2 dC  delete 0  name_locate test 0  name_locate test u  add new teststring  name_locate new 0  name_locate new u  add "" teststring  name_locate "" 0  unchange_all  name_locate test 0  name_locate new 0
+stderr can't find entry with name 'nosuchfile' using flags '0'
+stdout name 'test' using flags '0' found at index 0
+stderr can't find entry with name '' using flags '0'
+stderr can't find entry with name 'TeSt' using flags '0'
+stdout name 'TeSt' using flags 'C' found at index 0
+stdout name 'testdir/test2' using flags '0' found at index 2
+stdout name 'tesTdir/tESt2' using flags 'C' found at index 2
+stderr can't find entry with name 'testdir/test2' using flags 'd'
+stderr can't find entry with name 'tesTdir/tESt2' using flags 'dC'
+stderr can't find entry with name 'test2' using flags '0'
+stdout name 'test2' using flags 'd' found at index 2
+stdout name 'TeST2' using flags 'dC' found at index 2
+# delete 0
+stderr can't find entry with name 'test' using flags '0'
+stdout name 'test' using flags 'u' found at index 0
+# add "new"
+stdout name 'new' using flags '0' found at index 3
+stderr can't find entry with name 'new' using flags 'u'
+# add ""
+stdout name '' using flags '0' found at index 4
+# unchange all
+stdout name 'test' using flags '0' found at index 0
+stderr can't find entry with name 'new' using flags '0'
 return 0
 file test.zip test.zip test.zip
diff --git a/regress/open_cons_extrabytes.test b/regress/open_cons_extrabytes.test
new file mode 100644 (file)
index 0000000..beeb90e
--- /dev/null
@@ -0,0 +1,7 @@
+# zip_open: file has extra bytes at end of archive
+program tryopen
+file testextrabytes.zzip testextrabytes.zip testextrabytes.zip
+args -c testextrabytes.zzip
+return 1
+stdout opening 'testextrabytes.zzip' returned error 21
+stderr 1 errors
diff --git a/regress/open_empty.test b/regress/open_empty.test
new file mode 100644 (file)
index 0000000..8f05d29
--- /dev/null
@@ -0,0 +1,6 @@
+# zip_open: file contains no entry, but is valid
+program tryopen
+file testempty.zip testempty.zip testempty.zip
+args testempty.zip
+return 0
+stdout opening 'testempty.zip' succeeded, 0 entries
diff --git a/regress/open_empty_2.test b/regress/open_empty_2.test
new file mode 100644 (file)
index 0000000..07a5358
--- /dev/null
@@ -0,0 +1,6 @@
+# zip_open: 0 size file is recognized as empty zip
+program tryopen
+file testfile.txt testfile.txt testfile.txt
+args testfile.txt
+return 0
+stdout opening 'testfile.txt' succeeded, 0 entries
diff --git a/regress/open_extrabytes.test b/regress/open_extrabytes.test
new file mode 100644 (file)
index 0000000..1cfce24
--- /dev/null
@@ -0,0 +1,6 @@
+# zip_open: file has extra bytes at end of archive
+program tryopen
+file testextrabytes.zzip testextrabytes.zip testextrabytes.zip
+args testextrabytes.zzip
+return 0
+stdout opening 'testextrabytes.zzip' succeeded, 1 entries
diff --git a/regress/open_file_count.test b/regress/open_file_count.test
new file mode 100644 (file)
index 0000000..ef7f01c
--- /dev/null
@@ -0,0 +1,12 @@
+# zip_open: various inconsistent files
+setenv LANG C
+program tryopen
+file incons-file-count-high.zzip incons-file-count-high.zip incons-file-count-high.zip
+file incons-file-count-low.zzip incons-file-count-low.zip incons-file-count-low.zip
+file incons-file-count-overflow.zzip incons-file-count-overflow.zip incons-file-count-overflow.zip
+args incons-file-count-high.zzip incons-file-count-low.zzip incons-file-count-overflow.zzip
+return 1
+stdout opening 'incons-file-count-high.zzip' returned error 21
+stdout opening 'incons-file-count-low.zzip' succeeded, 2 entries
+stdout opening 'incons-file-count-overflow.zzip' returned error 14
+stderr 2 errors
diff --git a/regress/open_filename_duplicate.test b/regress/open_filename_duplicate.test
new file mode 100644 (file)
index 0000000..c8cc727
--- /dev/null
@@ -0,0 +1,6 @@
+# zip_open: file opens fine even though same file name appears twice
+program tryopen
+args filename_duplicate.zip
+return 0
+file filename_duplicate.zip filename_duplicate.zip filename_duplicate.zip
+stdout opening 'filename_duplicate.zip' succeeded, 2 entries
diff --git a/regress/open_filename_duplicate_consistency.test b/regress/open_filename_duplicate_consistency.test
new file mode 100644 (file)
index 0000000..a997972
--- /dev/null
@@ -0,0 +1,6 @@
+# zip_open: file opens fine even though same file name appears twice
+program tryopen
+args -c filename_duplicate.zip
+return 0
+file filename_duplicate.zip filename_duplicate.zip filename_duplicate.zip
+stderr some error about a duplicate file name
diff --git a/regress/open_filename_duplicate_empty.test b/regress/open_filename_duplicate_empty.test
new file mode 100644 (file)
index 0000000..505916b
--- /dev/null
@@ -0,0 +1,6 @@
+# zip_open: file opens fine even though same file name (empty file name) appears twice
+program tryopen
+args filename_duplicate_empty.zip
+return 0
+file filename_duplicate_empty.zip filename_duplicate_empty.zip filename_duplicate_empty.zip
+stdout opening 'filename_duplicate_empty.zip' succeeded, 2 entries
diff --git a/regress/open_filename_duplicate_empty_consistency.test b/regress/open_filename_duplicate_empty_consistency.test
new file mode 100644 (file)
index 0000000..43bb43e
--- /dev/null
@@ -0,0 +1,6 @@
+# zip_open: file opens fine even though same file name (empty file name) appears twice
+program tryopen
+args -c filename_duplicate_empty.zip
+return 1
+file filename_duplicate_empty.zip filename_duplicate_empty.zip filename_duplicate_empty.zip
+stdout some error about duplicate file names
diff --git a/regress/open_filename_empty.test b/regress/open_filename_empty.test
new file mode 100644 (file)
index 0000000..96f3efc
--- /dev/null
@@ -0,0 +1,6 @@
+# zip_open: file opens fine even though file name has length 0
+program tryopen
+args filename_empty.zip
+return 0
+file filename_empty.zip filename_empty.zip filename_empty.zip
+stdout opening 'filename_empty.zip' succeeded, 1 entries
diff --git a/regress/open_incons.test b/regress/open_incons.test
new file mode 100644 (file)
index 0000000..6aecb19
--- /dev/null
@@ -0,0 +1,83 @@
+# zip_open: various inconsistent files
+setenv LANG C
+program tryopen
+file incons-archive-comment-longer.zzip incons-archive-comment-longer.zip incons-archive-comment-longer.zip
+file incons-archive-comment-shorter.zzip incons-archive-comment-shorter.zip incons-archive-comment-shorter.zip
+file incons-cdoffset.zzip incons-cdoffset.zip incons-cdoffset.zip
+file incons-central-compression-method.zzip incons-central-compression-method.zip incons-central-compression-method.zip
+file incons-central-compsize-larger.zzip incons-central-compsize-larger.zip incons-central-compsize-larger.zip
+file incons-central-compsize-larger-toolarge.zzip incons-central-compsize-larger-toolarge.zip incons-central-compsize-larger-toolarge.zip
+file incons-central-compsize-smaller.zzip incons-central-compsize-smaller.zip incons-central-compsize-smaller.zip
+file incons-central-crc.zzip incons-central-crc.zip incons-central-crc.zip
+file incons-central-date.zzip incons-central-date.zip incons-central-date.zip
+file incons-central-file-comment-longer.zzip incons-central-file-comment-longer.zip incons-central-file-comment-longer.zip
+file incons-central-file-comment-shorter.zzip incons-central-file-comment-shorter.zip incons-central-file-comment-shorter.zip
+file incons-central-magic-bad.zzip incons-central-magic-bad.zip incons-central-magic-bad.zip
+file incons-central-magic-bad2.zzip incons-central-magic-bad2.zip incons-central-magic-bad2.zip
+file incons-central-size-larger.zzip incons-central-size-larger.zip incons-central-size-larger.zip
+file incons-data.zzip incons-data.zip incons-data.zip
+file incons-ef-central-size-wrong.zzip incons-ef-central-size-wrong.zip incons-ef-central-size-wrong.zip 
+file incons-ef-local-id-size.zzip incons-ef-local-id-size.zip incons-ef-local-id-size.zip
+file incons-ef-local-id.zzip incons-ef-local-id.zip incons-ef-local-id.zip
+file incons-ef-local-incomplete1.zzip incons-ef-local-incomplete1.zip incons-ef-local-incomplete1.zip
+file incons-ef-local-incomplete2.zzip incons-ef-local-incomplete2.zip incons-ef-local-incomplete2.zip
+file incons-ef-local-incomplete3.zzip incons-ef-local-incomplete3.zip incons-ef-local-incomplete3.zip
+file incons-ef-local-incomplete4.zzip incons-ef-local-incomplete4.zip incons-ef-local-incomplete4.zip
+file incons-ef-local-size.zzip incons-ef-local-size.zip incons-ef-local-size.zip
+file incons-eocd-magic-bad.zzip incons-eocd-magic-bad.zip incons-eocd-magic-bad.zip
+file incons-file-count-high.zzip incons-file-count-high.zip incons-file-count-high.zip
+file incons-file-count-low.zzip incons-file-count-low.zip incons-file-count-low.zip
+file incons-file-count-overflow.zzip incons-file-count-overflow.zip incons-file-count-overflow.zip
+file incons-local-compression-method.zzip incons-local-compression-method.zip incons-local-compression-method.zip
+file incons-local-compsize-larger.zzip incons-local-compsize-larger.zip incons-local-compsize-larger.zip
+file incons-local-compsize-smaller.zzip incons-local-compsize-smaller.zip incons-local-compsize-smaller.zip
+file incons-local-crc.zzip incons-local-crc.zip incons-local-crc.zip
+file incons-local-filename-long.zzip incons-local-filename-long.zip incons-local-filename-long.zip
+file incons-local-filename-missing.zzip incons-local-filename-missing.zip incons-local-filename-missing.zip
+file incons-local-filename-short.zzip incons-local-filename-short.zip incons-local-filename-short.zip
+file incons-local-filename.zzip incons-local-filename.zip incons-local-filename.zip
+file incons-local-magic-bad.zzip incons-local-magic-bad.zip incons-local-magic-bad.zip
+file incons-local-size-larger.zzip incons-local-size-larger.zip incons-local-size-larger.zip
+args -c incons-archive-comment-longer.zzip incons-archive-comment-shorter.zzip incons-cdoffset.zzip incons-central-compression-method.zzip incons-central-compsize-larger-toolarge.zzip incons-central-compsize-larger.zzip incons-central-compsize-smaller.zzip incons-central-crc.zzip incons-central-date.zzip incons-central-file-comment-longer.zzip incons-central-file-comment-shorter.zzip incons-central-magic-bad.zzip incons-central-magic-bad2.zzip incons-central-size-larger.zzip incons-data.zzip incons-ef-central-size-wrong.zzip incons-ef-local-id-size.zzip incons-ef-local-id.zzip incons-ef-local-incomplete1.zzip incons-ef-local-incomplete2.zzip incons-ef-local-incomplete3.zzip incons-ef-local-incomplete4.zzip incons-ef-local-size.zzip incons-eocd-magic-bad.zzip incons-file-count-high.zzip incons-file-count-low.zzip incons-file-count-overflow.zzip incons-local-compression-method.zzip incons-local-compsize-larger.zzip incons-local-compsize-smaller.zzip incons-local-crc.zzip incons-local-filename-long.zzip incons-local-filename-missing.zzip incons-local-filename-short.zzip incons-local-filename.zzip incons-local-magic-bad.zzip incons-local-size-larger.zzip
+return 1
+stdout opening 'incons-archive-comment-longer.zzip' returned error 21
+stdout opening 'incons-archive-comment-shorter.zzip' returned error 21
+stdout opening 'incons-cdoffset.zzip' returned error 21
+stdout opening 'incons-central-compression-method.zzip' returned error 21
+stdout opening 'incons-central-compsize-larger-toolarge.zzip' returned error 19
+stdout opening 'incons-central-compsize-larger.zzip' returned error 21
+stdout opening 'incons-central-compsize-smaller.zzip' returned error 21
+stdout opening 'incons-central-crc.zzip' returned error 21
+stdout opening 'incons-central-date.zzip' returned error 21
+stdout opening 'incons-central-file-comment-longer.zzip' returned error 21
+stdout opening 'incons-central-file-comment-shorter.zzip' returned error 21
+stdout opening 'incons-central-magic-bad.zzip' returned error 19
+stdout opening 'incons-central-magic-bad2.zzip' returned error 19
+stdout opening 'incons-central-size-larger.zzip' returned error 21
+# tryopen does not test checksums, so this is fine.
+stdout opening 'incons-data.zzip' succeeded, 1 entries
+stdout opening 'incons-ef-central-size-wrong.zzip' returned error 21
+stdout opening 'incons-ef-local-id-size.zzip' returned error 21
+# different extra fields local vs. central is fine
+stdout opening 'incons-ef-local-id.zzip' succeeded, 1 entries
+stdout opening 'incons-ef-local-incomplete1.zzip' returned error 21
+stdout opening 'incons-ef-local-incomplete2.zzip' returned error 21
+stdout opening 'incons-ef-local-incomplete3.zzip' returned error 21
+# EF consisting of 4 zero bytes is technically ok
+stdout opening 'incons-ef-local-incomplete4.zzip' succeeded, 1 entries
+stdout opening 'incons-ef-local-size.zzip' returned error 21
+stdout opening 'incons-eocd-magic-bad.zzip' returned error 19
+stdout opening 'incons-file-count-high.zzip' returned error 21
+stdout opening 'incons-file-count-low.zzip' returned error 21
+stdout opening 'incons-file-count-overflow.zzip' returned error 14
+stdout opening 'incons-local-compression-method.zzip' returned error 21
+stdout opening 'incons-local-compsize-larger.zzip' returned error 21
+stdout opening 'incons-local-compsize-smaller.zzip' returned error 21
+stdout opening 'incons-local-crc.zzip' returned error 21
+stdout opening 'incons-local-filename-long.zzip' returned error 17
+stdout opening 'incons-local-filename-missing.zzip' returned error 21
+stdout opening 'incons-local-filename-short.zzip' returned error 21
+stdout opening 'incons-local-filename.zzip' returned error 21
+stdout opening 'incons-local-magic-bad.zzip' returned error 19
+stdout opening 'incons-local-size-larger.zzip' returned error 21
+stderr 34 errors
index c843fb1..8a9c7ce 100644 (file)
@@ -3,4 +3,4 @@ program tryopen
 args manyfiles.zip
 return 0
 file manyfiles.zip manyfiles.zip manyfiles.zip
-stdout opening `manyfiles.zip' succeeded, 70000 entries
+stdout opening 'manyfiles.zip' succeeded, 70000 entries
index 612c8c9..002ccb4 100644 (file)
@@ -3,4 +3,5 @@ program tryopen
 args -e test.zip
 return 1
 file test.zip test.zip test.zip
-stdout opening `test.zip' returned error 10/0
+stdout opening 'test.zip' returned error 10
+stderr 1 errors
index 04a453a..b1452c7 100644 (file)
@@ -2,4 +2,4 @@
 program tryopen
 args -n new.zip
 return 0
-stdout opening `new.zip' succeeded, 0 entries
+stdout opening 'new.zip' succeeded, 0 entries
index b523abf..c81b542 100644 (file)
@@ -3,4 +3,5 @@ program tryopen
 file Makefile.am Makefile.am Makefile.am
 args Makefile.am
 return 1
-stdout opening `Makefile.am' returned error 19/2
+stdout opening 'Makefile.am' returned error 19
+stderr 1 errors
index bd70a74..6932164 100644 (file)
@@ -2,4 +2,5 @@
 program tryopen
 args nosuchfile
 return 1
-stdout opening `nosuchfile' returned error 11/2
+stdout opening 'nosuchfile' returned error 9
+stderr 1 errors
index ca3498a..dd1f38e 100644 (file)
@@ -3,4 +3,4 @@ program tryopen
 args test.zip
 return 0
 file test.zip test.zip test.zip
-stdout opening `test.zip' succeeded, 3 entries
+stdout opening 'test.zip' succeeded, 3 entries
diff --git a/regress/open_too_short.test b/regress/open_too_short.test
new file mode 100644 (file)
index 0000000..b7434ba
--- /dev/null
@@ -0,0 +1,7 @@
+# zip_open: file is too short for even a central directory entry
+program tryopen
+args test.piz
+return 1
+file test.piz bogus.zip bogus.zip
+stdout opening 'test.piz' returned error 19
+stderr 1 errors
diff --git a/regress/open_truncate.test b/regress/open_truncate.test
new file mode 100644 (file)
index 0000000..7ef7537
--- /dev/null
@@ -0,0 +1,6 @@
+# zip_open: file opens fine and gets truncated
+program tryopen
+args -t test.zip
+return 0
+file-del test.zip test.zip
+stdout opening 'test.zip' succeeded, 0 entries
diff --git a/regress/open_zip64_ok.test b/regress/open_zip64_ok.test
new file mode 100644 (file)
index 0000000..ac33f9a
--- /dev/null
@@ -0,0 +1,6 @@
+# zip_open: ZIP64 file opens fine
+program tryopen
+args test.zip
+return 0
+file test.zip zip64.zip zip64.zip
+stdout opening 'test.zip' succeeded, 1 entries
diff --git a/regress/rename_ascii.test b/regress/rename_ascii.test
new file mode 100644 (file)
index 0000000..bab7301
--- /dev/null
@@ -0,0 +1,5 @@
+# rename file to ASCII name in zip archive
+program modify
+return 0
+args testfile rename 0 testfile.txt
+file testfile testfile-UTF8.zip testfile.zip
diff --git a/regress/rename_cp437.test b/regress/rename_cp437.test
new file mode 100644 (file)
index 0000000..5445608
--- /dev/null
@@ -0,0 +1,5 @@
+# rename file to CP437 name in zip archive (fails)
+program modify
+return 0
+args testfile.zip rename 0 \81\82\83\84\85\86\87\88\89\8a\8b\8c\8d\8e\8f\90
+file testfile.zip testfile.zip testfile-cp437.zip
diff --git a/regress/rename_deleted.test b/regress/rename_deleted.test
new file mode 100644 (file)
index 0000000..c323e16
--- /dev/null
@@ -0,0 +1,6 @@
+# rename deleted entry in zip archive (fails)
+program modify
+return 1
+args testfile.zip delete 1 delete 3 rename 1 othername
+file testfile.zip testcomment.zip testcomment13.zip
+stderr can't rename file at index '1' to `othername': Entry has been deleted
diff --git a/regress/rename_fail.test b/regress/rename_fail.test
new file mode 100644 (file)
index 0000000..ccff307
--- /dev/null
@@ -0,0 +1,6 @@
+# rename file inside zip archive, but file name already exists
+program modify
+return 1
+args rename.zip   rename 0 file4
+file rename.zip testcomment.zip testcomment.zip
+stderr can't rename file at index '0' to `file4': File already exists
diff --git a/regress/rename_ok.test b/regress/rename_ok.test
new file mode 100644 (file)
index 0000000..9d9871b
--- /dev/null
@@ -0,0 +1,5 @@
+# rename file inside zip archive
+program modify
+return 0
+args rename.zip  rename 1 notfile2
+file rename.zip testcomment.zip rename_ok.zip
diff --git a/regress/rename_ok.zip b/regress/rename_ok.zip
new file mode 100644 (file)
index 0000000..ad07306
Binary files /dev/null and b/regress/rename_ok.zip differ
diff --git a/regress/rename_utf8.test b/regress/rename_utf8.test
new file mode 100644 (file)
index 0000000..25b92f0
--- /dev/null
@@ -0,0 +1,5 @@
+# rename file to UTF-8 name in zip archive
+program modify
+return 0
+args testfile rename 0 ÄÖÜßäöü
+file testfile testfile.zip testfile-UTF8.zip
diff --git a/regress/rename_utf8_encmismatch.test b/regress/rename_utf8_encmismatch.test
new file mode 100644 (file)
index 0000000..12cc537
--- /dev/null
@@ -0,0 +1,5 @@
+# rename file to UTF-8 name in zip archive with CP437 comment (sets InfoZIP UTF-8 Name Extension)
+program modify
+return 0
+args testfile rename 0 ÄÖÜßäöü
+file testfile test-cp437-fc.zip test-cp437-fc-utf-8-filename.zip
diff --git a/regress/runtest b/regress/runtest
deleted file mode 100755 (executable)
index a104251..0000000
+++ /dev/null
@@ -1,363 +0,0 @@
-#!/bin/sh
-
-#  from ckmame:runtest,v 1.22 2005/12/27 09:41:51 dillo Exp
-#
-#  runtest -- run regression tests
-#  Copyright (C) 2002-2007 Dieter Baron and Thomas Klausner
-#
-#  This file is part of libzip, a library to manipulate ZIP archives.
-#  The authors can be contacted at <libzip@nih.at>
-#
-#  Redistribution and use in source and binary forms, with or without
-#  modification, are permitted provided that the following conditions
-#  are met:
-#  1. Redistributions of source code must retain the above copyright
-#     notice, this list of conditions and the following disclaimer.
-#  2. Redistributions in binary form must reproduce the above copyright
-#     notice, this list of conditions and the following disclaimer in
-#     the documentation and/or other materials provided with the
-#     distribution.
-#  3. The names of the authors may not be used to endorse or promote
-#     products derived from this software without specific prior
-#     written permission.
-# 
-#  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-#  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-#  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-#  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-#  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-#  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-#  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-#  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-#  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# runtest TESTNAME
-#
-# files: 
-#   TESTNAME.test: test scenario
-#
-# test scenario:
-#    Lines beginning with # are comments.
-#
-#    The following commands are recognized; return and args must
-#    appear exactly once, the others are optional.
-#
-#      args ARGS
-#          run program with command line arguments ARGS
-#      
-#      description TEXT
-#          description of what test is for
-#
-#      file TEST IN OUT
-#          copy file IN as TEST, compare against OUT after program run.
-#
-#      file-del TEST IN
-#          copy file IN as TEST, check that it is removed by program.
-#
-#      file-new TEST OUT
-#          check that file TEST is created by program and compare
-#          against OUT.
-#
-#      mkdir MODE NAME
-#          create directory NAME with permissions MODE.
-#
-#      program PRG
-#          run PRG.
-#
-#      return RET
-#          RET is the expected exit code
-#
-#      stderr TEXT
-#          program is expected to produce the error message TEXT.  If
-#          multiple stderr commands are used, the messages are
-#          expected in the order given.
-#
-#      stdout TEXT
-#          program is expected to print TEXT to stdout.  If multiple
-#          stdout commands are used, the messages are expected in
-#          the order given. 
-#   
-# exit status
-#      runtest uses the following exit codes:
-#          0: test passed
-#          1: test failed
-#          2: other error
-#         77: test was skipped
-# 
-# environment variables:
-#   VERBOSE: if set, be more verbose (e. g., output diffs)
-#   NOCLEANUP: if set, don't delete directory test is run in
-
-die() {
-       echo "$0: $*" >&2;
-       cleanup;
-       exit 2;
-}
-
-fail() {
-       if [ ! -z "${VERBOSE}" ]
-       then
-           echo "${TEST} -- FAILED: $*";
-       fi;
-       cleanup;
-       exit 1;
-}
-
-skip() {
-       if [ ! -z "${VERBOSE}" ]
-       then
-               echo "${TEST} -- skipped: $*";
-       fi;
-       cleanup;
-       exit 77;
-}
-
-succeed() {
-       if [ ! -z "${VERBOSE}" ]
-       then
-               echo "${TEST} -- passed";
-       fi
-       cleanup;
-       exit 0;
-}
-
-cleanup() {
-       cd ..;
-       if [ -z "${NOCLEANUP}" ]
-       then
-               chmod -R u+rw ${DIR};
-               rm -r ${DIR};
-       fi
-}
-
-check_in_out_exists() {
-    if [ ! -f "$2" ]
-    then
-       fail "missing output file: '$2'"
-    elif [ ! -f "$1" ]
-    then
-       die "cannot find input file '$1'"
-    fi
-}
-
-checkdb() {
-    check_in_out_exists "$1" "$2"
-    out=`../dbdump "$2" | sort | diff ${DIFF_FLAGS} "$1" -`
-    if [ $? -ne 0 ]
-    then
-       if [ $VERBOSE ]
-       then
-           echo "$out"
-       fi
-       fail "$3"
-    fi
-
-}
-
-checkfile() {
-    check_in_out_exists "$1" "$2"
-    out=`diff ${DIFF_FLAGS} "$1" "$2"`
-    if [ $? -ne 0 ]
-    then
-       if [ $VERBOSE ]
-       then
-           echo "$out"
-       fi
-       fail "$3"
-    fi
-}
-
-checkzip() {
-    check_in_out_exists "$1" "$2"
-    # quiet CRC errors
-    ${ZIPCMP} -t ${ZIPCMP_FLAGS} "$1" "$2" 2>/dev/null
-    if [ $? -ne 0 ]
-    then
-       fail "$3"
-    fi
-}
-
-test_empty() {
-    if [ ! -z "$1" ]
-    then
-       die "directive $2 appeared twice in test file"
-    fi
-}
-
-test_set() {
-    if [ -z "$1" ]
-    then
-       die "required directive $2 missing in test file"
-    fi
-}
-
-copy_file() {
-    src="${srcdir}/$1"
-
-    if [ ! -f "$src" ]
-    then
-       die "source file '$src' does not exist"
-    fi
-    dir=`dirname "$2"`
-    if [ ! -d "$dir" ]
-    then
-       mkdir -p "$dir"
-    fi
-    cp "$src" "$2"
-}
-
-# GNU sort behaves differently on locales other than C, breaking tests
-LC_ALL=C
-export LC_ALL
-
-#testdir=`dirname $1`
-TEST=`echo $1 | sed -e s',.*/,,' -e 's/\.test$//'`
-shift
-
-DIR=${TEST}.d$$
-if [ -z "${srcdir}" ]
-then
-    srcdir=..
-else
-    # XXX: fix for absolute srcdir?
-    srcdir=../${srcdir}
-fi
-
-if [ -z "${ZIPCMP}" ]
-then
-    ZIPCMP=zipcmp
-else
-    if expr "${ZIPCMP}" : '[^/].*/' > /dev/null
-    then
-       ZIPCMP="../${ZIPCMP}"
-    fi
-fi
-
-if [ -z "${VERBOSE}" ]
-then
-    DIFF_FLAGS=''
-    ZIPCMP_FLAGS='-q'
-else
-    DIFF_FLAGS='-u'
-    ZIPCMP_FLAGS='-v'
-fi
-
-# XXX: set up trap to cleanup
-
-mkdir ${DIR} || ( die "cannot create test directory ${DIR}" )
-cd ${DIR} || ( die "cannot cd to test directory ${DIR}" )
-
-{
-
-RET=''
-ARGS=''
-FILES=''
-FILES_SHOULD=''
-DESCR=''
-
-touch stderr stdout
-
-while read cmd arg
-do
-  case $cmd in
-  \#*) ;;
-  args)
-    test_empty "${ARGS}" args
-    ARGS="$arg";;
-  description)
-    test_empty "${DESCR}" description
-    DESCR="$arg";;
-  file)
-    set $arg
-    copy_file "$2" "$1"
-    FILES="${FILES} ${srcdir}/$3!$1";;
-  file-del)
-    set $arg
-    copy_file "$2" "$1";;
-  file-new)
-    set $arg
-    FILES="${FILES} ${srcdir}/$2!$1";;
-  mkdir)
-    set $arg
-    mkdir "$2" && chmod "$1" "$2";;
-  program)
-    PROGRAM=../"$arg";;
-  return)
-    test_empty "${RET}" return
-    RET="$arg";;
-  stderr)
-    echo "${PROGRAM}: $arg" >> stderr;;
-  stdout)
-    echo "$arg" >> stdout;;
-  *)
-    die "unknown directive '$cmd'"
-  esac
-done
-
-test_set "${RET}" return
-test_set "${ARGS}" args
-
-if [ -z "${PROGRAM}" ]
-then
-    die no program to run given
-fi
-
-if [ ! -z "${SETUP_ONLY}" ]
-then
-    echo ${DIR}
-    exit 0
-fi
-
-if [ ! -z "${VERBOSE}" ]
-then
-       echo "${TEST}: ${DESCR}"
-       echo "running: ${PROGRAM} ${ARGS}"
-fi
-
-${PROGRAM} ${ARGS} > gotout 2> goterr
-ret=$?
-
-if [ $ret -ne ${RET} ]
-then
-    if [ ! -z "${VERBOSE}" ]
-    then
-       cat gotout
-       cat goterr
-    fi
-    fail "unexpected exit status: got $ret, expected ${RET}"
-fi
-
-FILES_SHOULD="${FILES_SHOULD} stderr stdout gotout goterr"
-
-checkfile stderr goterr "unexpected error output"
-checkfile stdout gotout "unexpected output"
-
-if [ ! -z "${FILES}" ]
-then
-    for fs in ${FILES}
-    do
-        set -- `echo ${fs} | tr '!' ' '`
-       FILES_SHOULD="${FILES_SHOULD} $2"
-       case "$2" in
-       *.db)
-           checkdb "$1" "$2" "database $2 wrong";;
-       *.zip)
-           checkzip "$1" "$2" "zip file $2 wrong";;
-       *)
-           checkfile "$1" "$2" "file $2 wrong";;
-       esac 
-    done
-fi
-
-# check that no additional files exist
-echo gotfiles shouldfiles ${FILES_SHOULD} | tr ' ' '\012' | sort > shouldfiles
-touch gotfiles
-find . -type f -print | sed 's!^./!!' | sort > gotfiles
-
-checkfile shouldfiles gotfiles "unexpected/missing files"
-
-succeed
-
-} < ${srcdir}/${TEST}.test
diff --git a/regress/runtest.in b/regress/runtest.in
new file mode 100755 (executable)
index 0000000..1e1fde1
--- /dev/null
@@ -0,0 +1,43 @@
+#!/usr/bin/env perl
+
+#  runtest -- run regression tests
+#  Copyright (C) 2002-2014 Dieter Baron and Thomas Klausner
+#
+#  This file is part of ckmame, a program to check rom sets for MAME.
+#  The authors can be contacted at <ckmame@nih.at>
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions
+#  are met:
+#  1. Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#  2. Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#  3. The names of the authors may not be used to endorse or promote
+#     products derived from this software without specific prior
+#     written permission.
+# 
+#  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+#  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+#  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+#  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+#  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+#  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+#  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+#  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+use strict;
+
+BEGIN { push @INC, '@abs_srcdir@'; }
+
+use NiHTest;
+
+my $test = NiHTest::new({ default_program => 'modify', srcdir => '@srcdir@', zipcmp => '../../src/zipcmp', zipcmp_flags => '-p' });
+
+$test->run(@ARGV);
diff --git a/regress/set_comment_all.c b/regress/set_comment_all.c
deleted file mode 100644 (file)
index 489a272..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
-  set_comment_all.c -- set global and file comments
-  Copyright (C) 2006 Dieter Baron and Thomas Klausner
-
-  This file is part of libzip, a library to manipulate ZIP archives.
-  The authors can be contacted at <libzip@nih.at>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
-  1. Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-  2. Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in
-     the documentation and/or other materials provided with the
-     distribution.
-  3. The names of the authors may not be used to endorse or promote
-     products derived from this software without specific prior
-     written permission.
-  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-\f
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "zip.h"
-
-const char *prg;
-const char *new_archive_comment="This is the new,\r\n"
-"multiline archive comment.\r\n"
-"Ain't it nice?";
-
-int
-main(int argc, char *argv[])
-{
-    const char *archive;
-    struct zip *za;
-    char buf[100];
-    int err;
-    int i;
-
-    prg = argv[0];
-
-    if (argc != 2) {
-       fprintf(stderr, "usage: %s archive\n", prg);
-       return 1;
-    }
-
-    archive = argv[1];
-    
-    if ((za=zip_open(archive, 0, &err)) == NULL) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't open zip archive `%s': %s\n", prg,
-               archive, buf);
-       return 1;
-    }
-
-    if (zip_set_archive_comment(za, new_archive_comment,
-                               strlen(new_archive_comment)) < 0) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: zip_set_archive_comment failed: %s\n",
-               prg, buf);
-    }
-
-    for (i=0; i<zip_get_num_files(za); i++) {
-       snprintf(buf, sizeof(buf), "File comment no %d", i);
-       if (zip_set_file_comment(za, i, buf, strlen(buf)) < 0) {
-           zip_error_to_str(buf, sizeof(buf), err, errno);
-           fprintf(stderr, "%s: zip_set_file_comment on file %d failed: %s\n",
-                   prg, i, buf);
-       }
-    }
-
-    if (zip_close(za) == -1) {
-       fprintf(stderr, "%s: can't close zip archive `%s'\n", prg, archive);
-       return 1;
-    }
-
-    return 0;
-}
index 2369ae8..38c5e3f 100644 (file)
@@ -1,7 +1,5 @@
 # change local and global comments in a zip archive
-program set_comment_all
+program modify
 return 0
-# need filename extension != zip to avoid using zipcmp,
-# which doesn't look at comments
-args testcomment.reg
-file testcomment.reg testcomment.zip testchanged.zip
+args testcomment.zip  set_archive_comment "This is the new,\r\nmultiline archive comment.\r\nAin't it nice?"  set_file_comment 0 "File comment no 0"  set_file_comment 1 "File comment no 1"  set_file_comment 2 "File comment no 2"  set_file_comment 3 "File comment no 3"
+file testcomment.zip testcomment.zip testchanged.zip
diff --git a/regress/set_comment_localonly.c b/regress/set_comment_localonly.c
deleted file mode 100644 (file)
index 55e25d3..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-  set_comment_localonly.c -- set file comments
-  Copyright (C) 2006 Dieter Baron and Thomas Klausner
-
-  This file is part of libzip, a library to manipulate ZIP archives.
-  The authors can be contacted at <libzip@nih.at>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
-  1. Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-  2. Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in
-     the documentation and/or other materials provided with the
-     distribution.
-  3. The names of the authors may not be used to endorse or promote
-     products derived from this software without specific prior
-     written permission.
-  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-\f
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "zip.h"
-
-const char *prg;
-
-int
-main(int argc, char *argv[])
-{
-    const char *archive;
-    struct zip *za;
-    char buf[100];
-    int err;
-    int i;
-
-    prg = argv[0];
-
-    if (argc != 2) {
-       fprintf(stderr, "usage: %s archive\n", prg);
-       return 1;
-    }
-
-    archive = argv[1];
-    
-    if ((za=zip_open(archive, 0, &err)) == NULL) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't open zip archive `%s': %s\n", prg,
-               archive, buf);
-       return 1;
-    }
-
-    for (i=0; i<zip_get_num_files(za); i++) {
-       snprintf(buf, sizeof(buf), "File comment no %d", i);
-       if (zip_set_file_comment(za, i, buf, strlen(buf)) < 0) {
-           zip_error_to_str(buf, sizeof(buf), err, errno);
-           fprintf(stderr, "%s: zip_set_file_comment on file %d failed: %s\n",
-                   prg, i, buf);
-       }
-    }
-    /* remove comment for third file */
-    if (zip_set_file_comment(za, 2, NULL, 0) < 0) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: zip_set_file_comment on file %d failed: %s\n",
-               prg, i, buf);
-    }
-
-    if (zip_close(za) == -1) {
-       fprintf(stderr, "%s: can't close zip archive `%s'\n", prg, archive);
-       return 1;
-    }
-
-    return 0;
-}
index 8ff58eb..6d7f20b 100644 (file)
@@ -1,7 +1,5 @@
-# change local comments in a zip archive
-program set_comment_localonly
+# change file comments in a zip archive
+program modify
 return 0
-# need filename extension != zip to avoid using zipcmp,
-# which doesn't look at comments
-args testcomment.reg
-file testcomment.reg testcomment.zip testchangedlocal.zip
+args testcomment.zip  set_file_comment 0 "File comment no 0"  set_file_comment 1 "File comment no 1"  set_file_comment 3 "File comment no 3"  set_file_comment 2 ""  
+file testcomment.zip testcomment.zip testchangedlocal.zip
diff --git a/regress/set_comment_removeglobal.c b/regress/set_comment_removeglobal.c
deleted file mode 100644 (file)
index c8ff6c5..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-  set_comment_removeglobal.c -- remove archive comment
-  Copyright (C) 2006 Dieter Baron and Thomas Klausner
-
-  This file is part of libzip, a library to manipulate ZIP archives.
-  The authors can be contacted at <libzip@nih.at>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
-  1. Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-  2. Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in
-     the documentation and/or other materials provided with the
-     distribution.
-  3. The names of the authors may not be used to endorse or promote
-     products derived from this software without specific prior
-     written permission.
-  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-\f
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "zip.h"
-
-const char *prg;
-
-int
-main(int argc, char *argv[])
-{
-    const char *archive;
-    struct zip *za;
-    char buf[100];
-    int err;
-
-    prg = argv[0];
-
-    if (argc != 2) {
-       fprintf(stderr, "usage: %s archive\n", prg);
-       return 1;
-    }
-
-    archive = argv[1];
-    
-    if ((za=zip_open(archive, 0, &err)) == NULL) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't open zip archive `%s': %s\n", prg,
-               archive, buf);
-       return 1;
-    }
-
-    if (zip_set_archive_comment(za, NULL, 0) < 0) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: zip_set_archive_comment failed: %s\n",
-               prg, buf);
-    }
-
-    if (zip_close(za) == -1) {
-       fprintf(stderr, "%s: can't close zip archive `%s'\n", prg, archive);
-       return 1;
-    }
-
-    return 0;
-}
index 14c504e..f00cf8a 100644 (file)
@@ -1,7 +1,5 @@
 # remove archive comment
-program set_comment_removeglobal
+program modify
 return 0
-# need filename extension != zip to avoid using zipcmp,
-# which doesn't look at comments
-args testcomment.reg
-file testcomment.reg testcomment.zip testcommentremoved.zip
+args testcomment.zip  set_archive_comment ""
+file testcomment.zip testcomment.zip testcommentremoved.zip
diff --git a/regress/set_comment_revert.c b/regress/set_comment_revert.c
deleted file mode 100644 (file)
index 46a1b85..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
-  set_comment_revert.c -- set global and file comments, but revert
-  Copyright (C) 2006 Dieter Baron and Thomas Klausner
-
-  This file is part of libzip, a library to manipulate ZIP archives.
-  The authors can be contacted at <libzip@nih.at>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
-  1. Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-  2. Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in
-     the documentation and/or other materials provided with the
-     distribution.
-  3. The names of the authors may not be used to endorse or promote
-     products derived from this software without specific prior
-     written permission.
-  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-\f
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "zip.h"
-
-const char *prg;
-const char *new_archive_comment="This is the new,\r\n"
-"multiline archive comment.\r\n"
-"Ain't it nice?";
-
-int
-main(int argc, char *argv[])
-{
-    const char *archive;
-    struct zip *za;
-    char buf[100];
-    int err;
-    int i;
-
-    prg = argv[0];
-
-    if (argc != 2) {
-       fprintf(stderr, "usage: %s archive\n", prg);
-       return 1;
-    }
-
-    archive = argv[1];
-    
-    if ((za=zip_open(archive, 0, &err)) == NULL) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: can't open zip archive `%s': %s\n", prg,
-               archive, buf);
-       return 1;
-    }
-
-    if (zip_set_archive_comment(za, new_archive_comment,
-                               strlen(new_archive_comment)) < 0) {
-       zip_error_to_str(buf, sizeof(buf), err, errno);
-       fprintf(stderr, "%s: zip_set_archive_comment failed: %s\n",
-               prg, buf);
-    }
-
-    for (i=0; i<zip_get_num_files(za); i++) {
-       snprintf(buf, sizeof(buf), "File comment no %d", i);
-       if (zip_set_file_comment(za, i, buf, strlen(buf)) < 0) {
-           zip_error_to_str(buf, sizeof(buf), err, errno);
-           fprintf(stderr, "%s: zip_set_file_comment on file %d failed: %s\n",
-                   prg, i, buf);
-       }
-    }
-
-    if (zip_unchange_all(za) == -1) {
-       fprintf(stderr, "%s: can't revert changes to archive `%s'\n",
-               prg, archive);
-       return 1;
-    }
-
-    if (zip_close(za) == -1) {
-       fprintf(stderr, "%s: can't close zip archive `%s'\n", prg, archive);
-       return 1;
-    }
-
-    return 0;
-}
index d702060..10baf5a 100644 (file)
@@ -1,7 +1,5 @@
 # start changing local and global comments, but revert before closing
-program set_comment_revert
+program modify
 return 0
-# need filename extension != zip to avoid using zipcmp,
-# which doesn't look at comments
-args testcomment.reg
-file testcomment.reg testcomment.zip testcomment.zip
+args testcomment.zip  set_archive_comment "some long string, a bit longer than this at least"  set_file_comment 0 "File comment no 0"  set_file_comment 1 "File comment no 1"  set_file_comment 3 "File comment no 3"  set_file_comment 2 ""   unchange_all
+file testcomment.zip testcomment.zip testcomment.zip
diff --git a/regress/set_compression_deflate_to_deflate.test b/regress/set_compression_deflate_to_deflate.test
new file mode 100644 (file)
index 0000000..1025cb6
--- /dev/null
@@ -0,0 +1,5 @@
+# change method from deflated to deflated (no change)
+program modify
+return 0
+args test.zip  set_file_compression 0 deflate 0
+file test.zip testdeflated.zip testdeflated.zip
diff --git a/regress/set_compression_deflate_to_store.test b/regress/set_compression_deflate_to_store.test
new file mode 100644 (file)
index 0000000..e94bcce
--- /dev/null
@@ -0,0 +1,5 @@
+# change method from deflated to stored
+program modify
+return 0
+args test.zip  set_file_compression 0 store 0
+file test.zip testdeflated.zip teststored.zip
diff --git a/regress/set_compression_store_to_deflate.test b/regress/set_compression_store_to_deflate.test
new file mode 100644 (file)
index 0000000..17ba9ee
--- /dev/null
@@ -0,0 +1,5 @@
+# change method from stored to deflated
+program modify
+return 0
+args test.zip  set_file_compression 0 deflate 0
+file test.zip teststored.zip testdeflated.zip
diff --git a/regress/set_compression_store_to_store.test b/regress/set_compression_store_to_store.test
new file mode 100644 (file)
index 0000000..250d21a
--- /dev/null
@@ -0,0 +1,5 @@
+# change method from stored to stored (no change)
+program modify
+return 0
+args test.zip  set_file_compression 0 store 0
+file test.zip teststored.zip teststored.zip
diff --git a/regress/set_compression_unknown.test b/regress/set_compression_unknown.test
new file mode 100644 (file)
index 0000000..5848075
--- /dev/null
@@ -0,0 +1,6 @@
+# change method to unknown
+program modify
+return 1
+args test.zip  set_file_compression 0 unknown 0
+file test.zip teststored.zip teststored.zip
+stderr can't set file compression method at index '0' to `unknown', flags `0': Compression method not supported
diff --git a/regress/source_hole.c b/regress/source_hole.c
new file mode 100644 (file)
index 0000000..400b3fd
--- /dev/null
@@ -0,0 +1,587 @@
+/*
+ modify_hole.c -- source for handling huge files that are mostly NULs
+ Copyright (C) 2014-2015 Dieter Baron and Thomas Klausner
+ This file is part of libzip, a library to manipulate ZIP archives.
+ The authors can be contacted at <libzip@nih.at>
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 3. The names of the authors may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "zip.h"
+
+/* public API */
+
+zip_source_t *source_hole_create(const char *, int flags, zip_error_t *);
+
+
+#ifndef EFTYPE
+#define EFTYPE EINVAL
+#endif
+
+
+#define MY_MIN(a, b)   ((a) < (b) ? (a) : (b))
+
+#define FRAGMENT_SIZE   (8*1024)
+
+#define MARK_BEGIN  "NiH0"
+#define MARK_DATA   "NiH1"
+#define MARK_NUL    "NiH2"
+
+
+typedef struct buffer {
+    zip_uint64_t fragment_size;
+    zip_uint8_t **fragment;
+    zip_uint64_t nfragments;
+    zip_uint64_t size;
+    zip_uint64_t offset;
+} buffer_t;
+
+static void buffer_free(buffer_t *buffer);
+static buffer_t *buffer_from_file(const char *fname, int flags, zip_error_t *error);
+static buffer_t *buffer_new(void);
+static zip_int64_t buffer_read(buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length, zip_error_t *error);
+static int buffer_read_file(buffer_t *buffer, FILE *f, zip_error_t *error);
+static zip_int64_t buffer_seek(buffer_t *buffer, void *data, zip_uint64_t length, zip_error_t *error);
+static int buffer_to_file(buffer_t *buffer, const char *fname, zip_error_t *error);
+static zip_int64_t buffer_write(buffer_t *buffer, const zip_uint8_t *data, zip_uint64_t length, zip_error_t *error);
+static zip_uint64_t get_u64(const zip_uint8_t *b);
+static int only_nul(const zip_uint8_t *data, zip_uint64_t length);
+static int write_nuls(zip_uint64_t n, FILE *f);
+static int write_u64(zip_uint64_t u64, FILE *f);
+
+
+typedef struct hole {
+    zip_error_t error;
+    char *fname;
+    buffer_t *in;
+    buffer_t *out;
+} hole_t;
+
+static hole_t *hole_new(const char *fname, int flags, zip_error_t *error);
+static zip_int64_t source_hole_cb(void *ud, void *data, zip_uint64_t length, zip_source_cmd_t command);
+
+
+zip_source_t *source_hole_create(const char *fname, int flags, zip_error_t *error)
+{
+    hole_t *ud = hole_new(fname, flags, error);
+    
+    if (ud == NULL) {
+        return NULL;
+    }
+    return zip_source_function_create(source_hole_cb, ud, error);
+}
+
+
+static void
+buffer_free(buffer_t *buffer)
+{
+    zip_uint64_t i;
+    
+    if (buffer == NULL) {
+        return;
+    }
+    
+    if (buffer->fragment) {
+        for (i=0; i<buffer->nfragments; i++) {
+            free(buffer->fragment[i]);
+        }
+        free(buffer->fragment);
+    }
+    free(buffer);
+}
+
+
+static buffer_t *
+buffer_from_file(const char *fname, int flags, zip_error_t *error)
+{
+    buffer_t *buffer;
+    FILE *f;
+    
+    if ((buffer = buffer_new()) == NULL) {
+        zip_error_set(error, ZIP_ER_MEMORY, 0);
+        return NULL;
+        
+    }
+    
+    if ((flags & ZIP_TRUNCATE) == 0) {
+        if ((f = fopen(fname, "rb")) == NULL) {
+            if (!(errno == ENOENT && (flags & ZIP_CREATE))) {
+                buffer_free(buffer);
+                return NULL;
+            }
+        }
+        else {
+            if (buffer_read_file(buffer, f, error) < 0) {
+                buffer_free(buffer);
+               fclose(f);
+                return NULL;
+            }
+           fclose(f);
+        }
+    }
+    
+    return buffer;
+}
+
+
+static buffer_t *
+buffer_new(void)
+{
+    buffer_t *buffer;
+    
+    if ((buffer = (buffer_t *)malloc(sizeof(*buffer))) == NULL) {
+        return NULL;
+    }
+    
+    buffer->fragment = NULL;
+    buffer->nfragments = 0;
+    buffer->fragment_size = FRAGMENT_SIZE;
+    buffer->size = 0;
+    buffer->offset = 0;
+    
+    return buffer;
+}
+
+
+static zip_int64_t
+buffer_read(buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length, zip_error_t *error)
+{
+    zip_uint64_t n, i, fragment_offset;
+    
+    length = MY_MIN(length, buffer->size - buffer->offset);
+    
+    if (length == 0) {
+        return 0;
+    }
+    if (length > ZIP_INT64_MAX) {
+        return -1;
+    }
+    
+    i = buffer->offset / buffer->fragment_size;
+    fragment_offset = buffer->offset % buffer->fragment_size;
+    n = 0;
+    while (n < length) {
+        zip_uint64_t left = MY_MIN(length - n, buffer->fragment_size - fragment_offset);
+        
+        if (buffer->fragment[i]) {
+            memcpy(data + n, buffer->fragment[i] + fragment_offset, left);
+        }
+        else {
+            memset(data + n, 0, left);
+        }
+        
+        n += left;
+        i++;
+        fragment_offset = 0;
+    }
+    
+    buffer->offset += n;
+    return (zip_int64_t)n;
+}
+
+
+static int
+buffer_read_file(buffer_t *buffer, FILE *f, zip_error_t *error)
+{
+    zip_uint8_t b[20];
+    zip_uint64_t i;
+    
+    if (fread(b, 20, 1, f) != 1) {
+        zip_error_set(error, ZIP_ER_READ, errno);
+        return -1;
+    }
+
+    if (memcmp(b, MARK_BEGIN, 4) != 0) {
+        zip_error_set(error, ZIP_ER_READ, EFTYPE);
+        return -1;
+    }
+    
+    buffer->fragment_size = get_u64(b+4);
+    buffer->size = get_u64(b+12);
+
+    if (buffer->size + buffer->fragment_size < buffer->size) {
+        zip_error_set(error, ZIP_ER_MEMORY, 0);
+       return -1;
+    }
+    buffer->nfragments = (buffer->size + buffer->fragment_size - 1) / buffer->fragment_size;
+    if ((buffer->nfragments > SIZE_MAX/sizeof(buffer->fragment[0]))
+       || ((buffer->fragment = (zip_uint8_t **)malloc(sizeof(buffer->fragment[0]) * buffer->nfragments)) == NULL)) {
+        zip_error_set(error, ZIP_ER_MEMORY, 0);
+        return -1;
+    }
+    
+    for (i = 0; i < buffer->nfragments; i++) {
+        buffer->fragment[i] = NULL;
+    }
+    
+    i = 0;
+    while (i < buffer->nfragments) {
+        if (fread(b, 4, 1, f) != 1) {
+            zip_error_set(error, ZIP_ER_READ, errno);
+            return -1;
+        }
+        
+        if (memcmp(b, MARK_DATA, 4) == 0) {
+            if (buffer->fragment_size > SIZE_MAX) {
+                zip_error_set(error, ZIP_ER_MEMORY, 0);
+                return -1;
+            }
+            if ((buffer->fragment[i] = (zip_uint8_t *)malloc(buffer->fragment_size)) == NULL) {
+                zip_error_set(error, ZIP_ER_MEMORY, 0);
+                return -1;
+            }
+            if (fread(buffer->fragment[i], buffer->fragment_size, 1, f) != 1) {
+                zip_error_set(error, ZIP_ER_READ, errno);
+                return -1;
+            }
+            i++;
+        }
+        else if (memcmp(b, MARK_NUL, 4) == 0) {
+            if (fread(b, 8, 1, f) != 1) {
+                zip_error_set(error, ZIP_ER_READ, errno);
+                return -1;
+            }
+            i += get_u64(b);
+        }
+        else {
+            zip_error_set(error, ZIP_ER_READ, EFTYPE);
+            return -1;
+        }
+    }
+    
+    return 0;
+}
+
+static zip_int64_t
+buffer_seek(buffer_t *buffer, void *data, zip_uint64_t length, zip_error_t *error)
+{
+    zip_int64_t new_offset = zip_source_seek_compute_offset(buffer->offset, buffer->size, data, length, error);
+
+    if (new_offset < 0) {
+        return -1;
+    }
+    
+    buffer->offset = (zip_uint64_t)new_offset;
+    return 0;
+}
+
+
+static int
+buffer_to_file(buffer_t *buffer, const char *fname, zip_error_t *error)
+{
+    FILE *f = fopen(fname, "wb");
+    zip_uint64_t i;
+    zip_uint64_t nul_run;
+    
+    if (f == NULL) {
+        zip_error_set(error, ZIP_ER_OPEN, errno);
+        return -1;
+    }
+    
+    fwrite(MARK_BEGIN, 4, 1, f);
+    write_u64(buffer->fragment_size, f);
+    write_u64(buffer->size, f);
+    
+    nul_run = 0;
+    for (i=0; i * buffer->fragment_size <buffer->size; i++) {
+        if (buffer->fragment[i] == NULL || only_nul(buffer->fragment[i], buffer->fragment_size)) {
+            nul_run++;
+        }
+        else {
+            if (nul_run > 0) {
+                write_nuls(nul_run, f);
+                nul_run = 0;
+            }
+            fwrite(MARK_DATA, 4, 1, f);
+            
+            fwrite(buffer->fragment[i], 1, buffer->fragment_size, f);
+        }
+    }
+    
+    if (nul_run > 0) {
+        write_nuls(nul_run, f);
+    }
+    
+    if (fclose(f) != 0) {
+        zip_error_set(error, ZIP_ER_WRITE, errno);
+        return -1;
+    }
+
+    return 0;
+}
+
+
+static zip_int64_t
+buffer_write(buffer_t *buffer, const zip_uint8_t *data, zip_uint64_t length, zip_error_t *error)
+{
+    if (buffer->offset + length > buffer->nfragments * buffer->fragment_size) {
+        zip_uint64_t needed_fragments = (buffer->offset + length + buffer->fragment_size - 1) / buffer->fragment_size;
+        zip_uint64_t new_capacity = buffer->nfragments;
+        zip_uint64_t i;
+        
+        if (new_capacity == 0) {
+            new_capacity = 4;
+        }
+        while (new_capacity < needed_fragments) {
+            new_capacity *= 2;
+        }
+        
+        zip_uint8_t **fragment = realloc(buffer->fragment, new_capacity * sizeof(*fragment));
+        
+        if (fragment == NULL) {
+            zip_error_set(error, ZIP_ER_MEMORY, 0);
+            return -1;
+        }
+        
+        for (i = buffer->nfragments; i < new_capacity; i++) {
+            fragment[i] = NULL;
+        }
+        
+        buffer->fragment = fragment;
+        buffer->nfragments = new_capacity;
+    }
+
+    if (!only_nul(data, length)) {
+        zip_uint64_t idx, n, fragment_offset;
+        
+        idx = buffer->offset / buffer->fragment_size;
+        fragment_offset = buffer->offset % buffer->fragment_size;
+        n = 0;
+        
+        while (n < length) {
+            zip_uint64_t left = MY_MIN(length - n, buffer->fragment_size - fragment_offset);
+            
+            if (buffer->fragment[idx] == NULL) {
+                if ((buffer->fragment[idx] = (zip_uint8_t *)malloc(buffer->fragment_size)) == NULL) {
+                    zip_error_set(error, ZIP_ER_MEMORY, 0);
+                    return -1;
+                }
+                memset(buffer->fragment[idx], 0, buffer->fragment_size);
+            }
+            memcpy(buffer->fragment[idx] + fragment_offset, data + n, left);
+            
+            n += left;
+            idx++;
+            fragment_offset = 0;
+        }
+    }
+    
+    buffer->offset += length;
+    if (buffer->offset > buffer->size) {
+        buffer->size = buffer->offset;
+    }
+    
+    return (zip_int64_t)length;
+}
+
+
+static zip_uint64_t
+get_u64(const zip_uint8_t *b)
+{
+    zip_uint64_t i;
+    
+    i = (zip_uint64_t)b[0] << 56 | (zip_uint64_t)b[1] << 48 | (zip_uint64_t)b[2] << 40 | (zip_uint64_t)b[3] << 32 | (zip_uint64_t)b[4] << 24 | (zip_uint64_t)b[5] << 16 | (zip_uint64_t)b[6] << 8 | (zip_uint64_t)b[7];
+    
+    return i;
+}
+
+
+static int
+only_nul(const zip_uint8_t *data, zip_uint64_t length)
+{
+    zip_uint64_t i;
+    
+    for (i=0; i< length; i++) {
+        if (data[i] != '\0') {
+            return 0;
+        }
+    }
+    
+    return 1;
+}
+
+
+static int
+write_nuls(zip_uint64_t n, FILE *f)
+{
+    if (fwrite(MARK_NUL, 4, 1, f) != 1) {
+        return -1;
+    }
+    return write_u64(n, f);
+}
+
+
+static int
+write_u64(zip_uint64_t u64, FILE *f)
+{
+    zip_uint8_t b[8];
+    
+    b[0] = (zip_uint8_t)((u64 >> 56) & 0xff);
+    b[1] = (zip_uint8_t)((u64 >> 48) & 0xff);
+    b[2] = (zip_uint8_t)((u64 >> 40) & 0xff);
+    b[3] = (zip_uint8_t)((u64 >> 32) & 0xff);
+    b[4] = (zip_uint8_t)((u64 >> 24) & 0xff);
+    b[5] = (zip_uint8_t)((u64 >> 16) & 0xff);
+    b[6] = (zip_uint8_t)((u64 >> 8) & 0xff);
+    b[7] = (zip_uint8_t)(u64 & 0xff);
+    
+    return fwrite(b, 8, 1, f) == 1 ? 0 : -1;
+}
+
+
+static void
+hole_free(hole_t *hole) {
+    if (hole == NULL) {
+        return;
+    }
+    zip_error_fini(&hole->error);
+    buffer_free(hole->in);
+    buffer_free(hole->out);
+    free(hole->fname);
+    free(hole);
+}
+
+
+static hole_t *
+hole_new(const char *fname, int flags, zip_error_t *error)
+{
+    hole_t *ctx = (hole_t *)malloc(sizeof(*ctx));
+    
+    if (ctx == NULL) {
+        zip_error_set(error, ZIP_ER_MEMORY, 0);
+        return NULL;
+    }
+
+    if ((ctx->fname = strdup(fname)) == NULL) {
+        free(ctx);
+        zip_error_set(error, ZIP_ER_MEMORY, 0);
+        return NULL;
+    }
+    
+    if ((ctx->in = buffer_from_file(fname, flags, error)) == NULL) {
+        free(ctx);
+        return NULL;
+    }
+    
+    zip_error_init(&ctx->error);
+    ctx->out = NULL;
+    
+    return ctx;
+}
+
+
+static zip_int64_t
+source_hole_cb(void *ud, void *data, zip_uint64_t length, zip_source_cmd_t command)
+{
+    hole_t *ctx = (hole_t *)ud;
+    
+    switch (command) {
+        case ZIP_SOURCE_BEGIN_WRITE:
+            ctx->out = buffer_new();
+            return 0;
+            
+        case ZIP_SOURCE_CLOSE:
+            return 0;
+            
+        case ZIP_SOURCE_COMMIT_WRITE:
+            if (buffer_to_file(ctx->out, ctx->fname, &ctx->error) < 0) {
+                return -1;
+            }
+            buffer_free(ctx->in);
+            ctx->in = ctx->out;
+            ctx->out = NULL;
+            return 0;
+            
+        case ZIP_SOURCE_ERROR:
+            return zip_error_to_data(&ctx->error, data, length);
+            
+        case ZIP_SOURCE_FREE:
+            hole_free(ctx);
+            return 0;
+            
+        case ZIP_SOURCE_OPEN:
+            ctx->in->offset = 0;
+            return 0;
+           
+        case ZIP_SOURCE_READ:
+            return buffer_read(ctx->in, data, length, &ctx->error);
+
+        case ZIP_SOURCE_REMOVE:
+            buffer_free(ctx->in);
+            ctx->in = buffer_new();
+            buffer_free(ctx->out);
+            ctx->out = NULL;
+            (void)remove(ctx->fname);
+            return 0;
+            
+        case ZIP_SOURCE_ROLLBACK_WRITE:
+            buffer_free(ctx->out);
+            ctx->out = NULL;
+            return 0;
+            
+        case ZIP_SOURCE_SEEK:
+            return buffer_seek(ctx->in, data, length, &ctx->error);
+            
+        case ZIP_SOURCE_SEEK_WRITE:
+            return buffer_seek(ctx->out, data, length, &ctx->error);
+        
+        case ZIP_SOURCE_STAT: {
+            zip_stat_t *st = ZIP_SOURCE_GET_ARGS(zip_stat_t, data, length, &ctx->error);
+            
+            if (st == NULL) {
+                return -1;
+            }
+            
+            /* TODO: return ENOENT if fname doesn't exist */
+            
+            st->valid |= ZIP_STAT_SIZE;
+            st->size = ctx->in->size;
+            return 0;
+        }
+            
+        case ZIP_SOURCE_TELL:
+            return (zip_int64_t)ctx->in->offset;
+
+        case ZIP_SOURCE_TELL_WRITE:
+            return (zip_int64_t)ctx->out->offset;
+            
+        case ZIP_SOURCE_WRITE:
+            return buffer_write(ctx->out, data, length, &ctx->error);
+            
+        case ZIP_SOURCE_SUPPORTS:
+            return zip_source_make_command_bitmap(ZIP_SOURCE_BEGIN_WRITE, ZIP_SOURCE_COMMIT_WRITE, ZIP_SOURCE_CLOSE, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_REMOVE, ZIP_SOURCE_ROLLBACK_WRITE, ZIP_SOURCE_SEEK, ZIP_SOURCE_SEEK_WRITE, ZIP_SOURCE_STAT, ZIP_SOURCE_TELL, ZIP_SOURCE_TELL_WRITE, ZIP_SOURCE_WRITE, -1);
+            
+        default:
+            zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0);
+            return -1;
+    }
+}
diff --git a/regress/stat_index_cp437_guess.test b/regress/stat_index_cp437_guess.test
new file mode 100644 (file)
index 0000000..34c4d0f
--- /dev/null
@@ -0,0 +1,149 @@
+# guess CP437 file names and autoconvert them
+program modify
+args test-cp437.zip stat 0 stat 1 stat 2 stat 3 stat 4 stat 5 stat 6 stat 7 stat 8 stat 9 stat 10 stat 11 stat 12 stat 13 stat 14 stat 15
+return 0
+file test-cp437.zip test-cp437.zip test-cp437.zip
+stdout name: '☺☻♥♦♣♠•○◘◙♂♀♪♫☼►'
+stdout index: '0'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:51:50'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '◄↕‼¶§▬↨↑↓→←∟↔▲▼ '
+stdout index: '1'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:51:54'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '!"#$%&'()*+,-./0'
+stdout index: '2'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:51:58'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '123456789:;<=>?@'
+stdout index: '3'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:04'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'ABCDEFGHIJKLMNOP'
+stdout index: '4'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:08'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'QRSTUVWXYZ[\]^_`'
+stdout index: '5'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:12'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'abcdefghijklmnop'
+stdout index: '6'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:18'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'qrstuvwxyz{|}~~Ç'
+stdout index: '7'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:22'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'üéâäàåçêëèïîìÄÅÉ'
+stdout index: '8'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:26'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'æÆôöòûùÿÖÜ¢£¥₧ƒá'
+stdout index: '9'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:30'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'íóúñѪº¿⌐¬½¼¡«»░'
+stdout index: '10'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:36'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '▒▓│┤╡╢╖╕╣║╗╝╜╛┐└'
+stdout index: '11'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:40'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '┴┬├─┼╞╟╚╔╩╦╠═╬╧╨'
+stdout index: '12'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:44'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '╤╥╙╘╒╓╫╪┘┌█▄▌▐▀α'
+stdout index: '13'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:50'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'ßΓπΣσµτΦΘΩδ∞φε∩≡'
+stdout index: '14'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:54'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '±≥≤⌠⌡÷≈°∙·√ⁿ²■  '
+stdout index: '15'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:53:02'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
diff --git a/regress/stat_index_cp437_raw.test b/regress/stat_index_cp437_raw.test
new file mode 100644 (file)
index 0000000..8239b45
--- /dev/null
@@ -0,0 +1,150 @@
+# get raw file names them from archive
+program modify
+args -r test-cp437.zip stat 0 stat 1 stat 2 stat 3 stat 4 stat 5 stat 6 stat 7 stat 8 stat 9 stat 10 stat 11 stat 12 stat 13 stat 14 stat 15
+return 0
+file test-cp437.zip test-cp437.zip test-cp437.zip
+stdout name: '\ 1\ 2\ 3\ 4\ 5\ 6\a  \b
+stdout \v\f\r\ e\ f\10'
+stdout index: '0'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:51:50'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '\11\12\13\14\15\16\17\18\19\1a\e\1c\1d\1e\1f '
+stdout index: '1'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:51:54'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '!"#$%&'()*+,-./0'
+stdout index: '2'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:51:58'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '123456789:;<=>?@'
+stdout index: '3'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:04'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'ABCDEFGHIJKLMNOP'
+stdout index: '4'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:08'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'QRSTUVWXYZ[\]^_`'
+stdout index: '5'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:12'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'abcdefghijklmnop'
+stdout index: '6'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:18'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'qrstuvwxyz{|}~~\80'
+stdout index: '7'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:22'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '\81\82\83\84\85\86\87\88\89\8a\8b\8c\8d\8e\8f\90'
+stdout index: '8'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:26'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '\91\92\93\94\95\96\97\98\99\9a\9b\9c\9d\9e\9f '
+stdout index: '9'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:30'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '¡¢£¤¥¦§¨©ª«¬­®¯°'
+stdout index: '10'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:36'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '±²³´µ¶·¸¹º»¼½¾¿À'
+stdout index: '11'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:40'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐ'
+stdout index: '12'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:44'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'ÑÒÓÔÕÖ×ØÙÚÛÜÝÞßà'
+stdout index: '13'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:50'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'áâãäåæçèéêëìíîïð'
+stdout index: '14'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:54'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'ñòóôõö÷øùúûüýþÿÿ'
+stdout index: '15'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:53:02'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
diff --git a/regress/stat_index_cp437_strict.test b/regress/stat_index_cp437_strict.test
new file mode 100644 (file)
index 0000000..ab5da3d
--- /dev/null
@@ -0,0 +1,149 @@
+# strictly follow ZIP spec and expect CP437 file names, and autoconvert them
+program modify
+args -s test-cp437.zip stat 0 stat 1 stat 2 stat 3 stat 4 stat 5 stat 6 stat 7 stat 8 stat 9 stat 10 stat 11 stat 12 stat 13 stat 14 stat 15
+return 0
+file test-cp437.zip test-cp437.zip test-cp437.zip
+stdout name: '☺☻♥♦♣♠•○◘◙♂♀♪♫☼►'
+stdout index: '0'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:51:50'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '◄↕‼¶§▬↨↑↓→←∟↔▲▼ '
+stdout index: '1'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:51:54'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '!"#$%&'()*+,-./0'
+stdout index: '2'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:51:58'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '123456789:;<=>?@'
+stdout index: '3'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:04'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'ABCDEFGHIJKLMNOP'
+stdout index: '4'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:08'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'QRSTUVWXYZ[\]^_`'
+stdout index: '5'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:12'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'abcdefghijklmnop'
+stdout index: '6'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:18'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'qrstuvwxyz{|}~~Ç'
+stdout index: '7'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:22'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'üéâäàåçêëèïîìÄÅÉ'
+stdout index: '8'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:26'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'æÆôöòûùÿÖÜ¢£¥₧ƒá'
+stdout index: '9'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:30'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'íóúñѪº¿⌐¬½¼¡«»░'
+stdout index: '10'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:36'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '▒▓│┤╡╢╖╕╣║╗╝╜╛┐└'
+stdout index: '11'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:40'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '┴┬├─┼╞╟╚╔╩╦╠═╬╧╨'
+stdout index: '12'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:44'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '╤╥╙╘╒╓╫╪┘┌█▄▌▐▀α'
+stdout index: '13'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:50'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'ßΓπΣσµτΦΘΩδ∞φε∩≡'
+stdout index: '14'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:52:54'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: '±≥≤⌠⌡÷≈°∙·√ⁿ²■  '
+stdout index: '15'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Fri Feb 17 2012 20:53:02'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
diff --git a/regress/stat_index_fileorder.test b/regress/stat_index_fileorder.test
new file mode 100644 (file)
index 0000000..e9f065c
--- /dev/null
@@ -0,0 +1,23 @@
+# zip_open: entries ordered by central directory order
+program modify
+args fileorder.zzip stat 0 stat 1
+return 0
+file fileorder.zzip fileorder.zip fileorder.zip
+stdout name: 'file1'
+stdout index: '0'
+stdout size: '5'
+stdout compressed size: '5'
+stdout mtime: 'Fri Apr 27 2012 23:21:42'
+stdout crc: '9ee760e5'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
+stdout name: 'file2'
+stdout index: '1'
+stdout size: '5'
+stdout compressed size: '5'
+stdout mtime: 'Fri Apr 27 2012 23:21:44'
+stdout crc: '7ee315f'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
diff --git a/regress/stat_index_streamed.test b/regress/stat_index_streamed.test
new file mode 100644 (file)
index 0000000..bda69dc
--- /dev/null
@@ -0,0 +1,14 @@
+# stat file in streamed zip file
+program modify
+args streamed stat 0
+file streamed streamed.zip streamed.zip
+return 0
+stdout name: '-'
+stdout index: '0'
+stdout size: '2'
+stdout compressed size: '4'
+stdout mtime: 'Wed Apr 25 2012 10:20:38'
+stdout crc: 'ddeaa107'
+stdout compression method: '8'
+stdout encryption method: '0'
+stdout
diff --git a/regress/stat_index_streamed_zip64.test b/regress/stat_index_streamed_zip64.test
new file mode 100644 (file)
index 0000000..c9dca38
--- /dev/null
@@ -0,0 +1,14 @@
+# stat file in streamed zip file
+program modify
+args streamed stat 0
+file streamed streamed-zip64.zip streamed-zip64.zip
+return 0
+stdout name: '-'
+stdout index: '0'
+stdout size: '2'
+stdout compressed size: '4'
+stdout mtime: 'Wed Apr 25 2012 10:20:38'
+stdout crc: 'ddeaa107'
+stdout compression method: '8'
+stdout encryption method: '0'
+stdout
diff --git a/regress/stat_index_utf8_guess.test b/regress/stat_index_utf8_guess.test
new file mode 100644 (file)
index 0000000..baabbce
--- /dev/null
@@ -0,0 +1,14 @@
+# guess UTF-8 file names
+program modify
+args test-utf8.zip stat 0
+return 0
+file test-utf8.zip test-utf8.zip test-utf8.zip
+stdout name: 'ÄÖÜäöüßćçĉéèêëē'
+stdout index: '0'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Sat Feb 18 2012 00:15:08'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
diff --git a/regress/stat_index_utf8_raw.test b/regress/stat_index_utf8_raw.test
new file mode 100644 (file)
index 0000000..95fd85e
--- /dev/null
@@ -0,0 +1,14 @@
+# print UTF-8 file names
+program modify
+args -r test-utf8.zip stat 0
+return 0
+file test-utf8.zip test-utf8.zip test-utf8.zip
+stdout name: 'ÄÖÜäöüßćçĉéèêëē'
+stdout index: '0'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Sat Feb 18 2012 00:15:08'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
diff --git a/regress/stat_index_utf8_strict.test b/regress/stat_index_utf8_strict.test
new file mode 100644 (file)
index 0000000..f1c5558
--- /dev/null
@@ -0,0 +1,15 @@
+# follow strict rules and convert UTF-8 as if it was CP437, but not
+# if the files are marked as having UTF-8 names
+program modify
+args -s test-utf8.zip stat 0
+return 0
+file test-utf8.zip test-utf8.zip test-utf8.zip
+stdout name: 'ÄÖÜäöüßćçĉéèêëē'
+stdout index: '0'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Sat Feb 18 2012 00:15:08'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
diff --git a/regress/stat_index_utf8_unmarked_strict.test b/regress/stat_index_utf8_unmarked_strict.test
new file mode 100644 (file)
index 0000000..341e64e
--- /dev/null
@@ -0,0 +1,15 @@
+# follow strict rules and convert UTF-8 as if it was CP437,
+# if not marked otherwise (in this case: not marked)
+program modify
+args -s test-utf8-unmarked.zip stat 0
+return 0
+file test-utf8-unmarked.zip test-utf8-unmarked.zip test-utf8-unmarked.zip
+stdout name: '├ä├û├£├ñ├╢├╝├ƒ─ç├º─ë├⌐├¿├¬├½─ô'
+stdout index: '0'
+stdout size: '0'
+stdout compressed size: '0'
+stdout mtime: 'Sat Feb 18 2012 00:15:08'
+stdout crc: '0'
+stdout compression method: '0'
+stdout encryption method: '0'
+stdout 
diff --git a/regress/stat_index_zip64.test b/regress/stat_index_zip64.test
new file mode 100644 (file)
index 0000000..14ff74b
--- /dev/null
@@ -0,0 +1,14 @@
+# stat file in zip64 zip file
+program modify
+args bigzero stat 0
+file bigzero bigzero.zip bigzero.zip
+return 0
+stdout name: 'bigzero'
+stdout index: '0'
+stdout size: '4294967296'
+stdout compressed size: '4168157'
+stdout mtime: 'Thu Mar 15 2012 14:54:06'
+stdout crc: 'd202ef8d'
+stdout compression method: '8'
+stdout encryption method: '0'
+stdout
diff --git a/regress/streamed-zip64.zip b/regress/streamed-zip64.zip
new file mode 100644 (file)
index 0000000..8588619
Binary files /dev/null and b/regress/streamed-zip64.zip differ
diff --git a/regress/streamed.zip b/regress/streamed.zip
new file mode 100644 (file)
index 0000000..737d56f
Binary files /dev/null and b/regress/streamed.zip differ
diff --git a/regress/test-cp437-comment-utf-8.zip b/regress/test-cp437-comment-utf-8.zip
new file mode 100644 (file)
index 0000000..04fbaac
Binary files /dev/null and b/regress/test-cp437-comment-utf-8.zip differ
diff --git a/regress/test-cp437-fc-utf-8-filename.zip b/regress/test-cp437-fc-utf-8-filename.zip
new file mode 100644 (file)
index 0000000..7aeb809
Binary files /dev/null and b/regress/test-cp437-fc-utf-8-filename.zip differ
diff --git a/regress/test-cp437-fc.zip b/regress/test-cp437-fc.zip
new file mode 100644 (file)
index 0000000..0c4f04d
Binary files /dev/null and b/regress/test-cp437-fc.zip differ
diff --git a/regress/test-cp437.zip b/regress/test-cp437.zip
new file mode 100644 (file)
index 0000000..066531e
Binary files /dev/null and b/regress/test-cp437.zip differ
diff --git a/regress/test-utf8-unmarked.zip b/regress/test-utf8-unmarked.zip
new file mode 100644 (file)
index 0000000..1bcb703
Binary files /dev/null and b/regress/test-utf8-unmarked.zip differ
diff --git a/regress/test-utf8.zip b/regress/test-utf8.zip
new file mode 100644 (file)
index 0000000..3045e20
Binary files /dev/null and b/regress/test-utf8.zip differ
diff --git a/regress/test2.zip b/regress/test2.zip
new file mode 100644 (file)
index 0000000..ed2f60f
Binary files /dev/null and b/regress/test2.zip differ
index e474989..91e7d8a 100644 (file)
Binary files a/regress/testbuffer.zip and b/regress/testbuffer.zip differ
diff --git a/regress/testcomment13.zip b/regress/testcomment13.zip
new file mode 100644 (file)
index 0000000..bd6e1c3
Binary files /dev/null and b/regress/testcomment13.zip differ
diff --git a/regress/testdeflated.zip b/regress/testdeflated.zip
new file mode 100644 (file)
index 0000000..7f6ab1c
Binary files /dev/null and b/regress/testdeflated.zip differ
diff --git a/regress/testdeflated2.zip b/regress/testdeflated2.zip
new file mode 100644 (file)
index 0000000..b5ded7d
Binary files /dev/null and b/regress/testdeflated2.zip differ
index 7e6e7b9..b1e13e1 100644 (file)
Binary files a/regress/testdir.zip and b/regress/testdir.zip differ
diff --git a/regress/testempty.zip b/regress/testempty.zip
new file mode 100644 (file)
index 0000000..15cb0ec
Binary files /dev/null and b/regress/testempty.zip differ
diff --git a/regress/testextrabytes.zip b/regress/testextrabytes.zip
new file mode 100644 (file)
index 0000000..f2a3fb2
Binary files /dev/null and b/regress/testextrabytes.zip differ
diff --git a/regress/testfile-UTF8.zip b/regress/testfile-UTF8.zip
new file mode 100644 (file)
index 0000000..7279615
Binary files /dev/null and b/regress/testfile-UTF8.zip differ
diff --git a/regress/testfile-cp437.zip b/regress/testfile-cp437.zip
new file mode 100644 (file)
index 0000000..169a903
Binary files /dev/null and b/regress/testfile-cp437.zip differ
diff --git a/regress/testfile-plus-extra.zip b/regress/testfile-plus-extra.zip
new file mode 100644 (file)
index 0000000..09a6c03
Binary files /dev/null and b/regress/testfile-plus-extra.zip differ
old mode 100644 (file)
new mode 100755 (executable)
index b46d298..2fa5ba0 100644 (file)
Binary files a/regress/testfile.zip and b/regress/testfile.zip differ
diff --git a/regress/testfile2014.zip b/regress/testfile2014.zip
new file mode 100644 (file)
index 0000000..1d91853
Binary files /dev/null and b/regress/testfile2014.zip differ
diff --git a/regress/testnottorrent.zip b/regress/testnottorrent.zip
deleted file mode 100644 (file)
index e79f243..0000000
Binary files a/regress/testnottorrent.zip and /dev/null differ
diff --git a/regress/teststdin.zip b/regress/teststdin.zip
new file mode 100644 (file)
index 0000000..e1a40a8
Binary files /dev/null and b/regress/teststdin.zip differ
index 04bf517..138c6ad 100644 (file)
Binary files a/regress/teststored.zip and b/regress/teststored.zip differ
diff --git a/regress/testtorrent.tzip b/regress/testtorrent.tzip
deleted file mode 100644 (file)
index 1da3859..0000000
Binary files a/regress/testtorrent.tzip and /dev/null differ
diff --git a/regress/torrent-already.test b/regress/torrent-already.test
deleted file mode 100644 (file)
index 8bd15b3..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-# add directories to zip
-program ../src/ziptorrent
-return 0
-args -v test.zip
-file test.zip  testtorrent.tzip testtorrent.tzip
-stdout test.zip: already torrentzipped
diff --git a/regress/torrent-new.test b/regress/torrent-new.test
deleted file mode 100644 (file)
index 0224208..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-# add directories to zip
-program ../src/ziptorrent
-return 0
-args -v test.zip
-file test.zip  testnottorrent.zip testtorrent.tzip
-stdout test.zip: torrentzipping
index fcc280f..b41eea8 100644 (file)
@@ -1,6 +1,6 @@
 /*
   tryopen.c -- tool for tests that try opening zip archives
-  Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
+#include "config.h"
 
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
 #ifndef HAVE_GETOPT
 #include "getopt.h"
 #endif
 
 #include "zip.h"
+#include "compat.h"
 
-const char *prg;
+const char *usage = "usage: %s [-cent] file\n\n"
+    "\t-c\tcheck consistency\n"
+    "\t-e\texclusively open archive\n"
+    "\t-n\tcreate new file\n"
+    "\t-t\ttruncate file to size 0\n";
 
-const char *usage = "usage: %s [-cen] file\n";
-
-\f
 
 int
 main(int argc, char *argv[])
 {
     const char *fname;
-    struct zip *z;
-    int c, count, flags, ze;
+    zip_t *z;
+    int c, flags, ze;
+    zip_int64_t count;
+    int error;
 
     flags = 0;
-    prg = argv[0];
 
-    while ((c=getopt(argc, argv, "cen")) != -1) {
+    while ((c=getopt(argc, argv, "cent")) != -1) {
        switch (c) {
        case 'c':
            flags |= ZIP_CHECKCONS;
@@ -69,28 +76,37 @@ main(int argc, char *argv[])
        case 'n':
            flags |= ZIP_CREATE;
            break;
+       case 't':
+           flags |= ZIP_TRUNCATE;
+           break;
 
        default:
-           fprintf(stderr, usage, prg);
+           fprintf(stderr, usage, argv[0]);
            return 1;
        }
     }
-    if (argc != optind+1) {
-       fprintf(stderr, usage, prg);
-       return 1;
-    }
 
-    fname = argv[optind];
-    errno = 0;
+    error = 0;
+    for (; optind < argc; optind++) {
+       fname = argv[optind];
+       errno = 0;
 
-    if ((z=zip_open(fname, flags, &ze)) != NULL) {
-       count = zip_get_num_files(z);
-       printf("opening `%s' succeeded, %d entries\n", fname, count);
-       zip_close(z);
-       return 0;
+       if ((z=zip_open(fname, flags, &ze)) != NULL) {
+           count = zip_get_num_entries(z, 0);
+           printf("opening '%s' succeeded, %"PRIu64" entries\n", fname, count);
+           zip_close(z);
+           continue;
+       }
+       
+       printf("opening '%s' returned error %d", fname, ze);
+       if (zip_error_get_sys_type(ze) == ZIP_ET_SYS)
+           printf("/%d", errno);
+       printf("\n");
+       error++;
     }
 
-    printf("opening `%s' returned error %d/%d\n",
-          fname, ze, errno);
-    return 1;
+    if (error > 0)
+       fprintf(stderr, "%d errors\n", error);
+
+    return error ? 1 : 0;
 }
diff --git a/regress/utf-8-standardization-input.zip b/regress/utf-8-standardization-input.zip
new file mode 100644 (file)
index 0000000..67e3acf
Binary files /dev/null and b/regress/utf-8-standardization-input.zip differ
diff --git a/regress/utf-8-standardization-output.zip b/regress/utf-8-standardization-output.zip
new file mode 100644 (file)
index 0000000..375489e
Binary files /dev/null and b/regress/utf-8-standardization-output.zip differ
diff --git a/regress/utf-8-standardization.test b/regress/utf-8-standardization.test
new file mode 100644 (file)
index 0000000..3f89dbb
--- /dev/null
@@ -0,0 +1,5 @@
+# replace file contents and make UTF-8 name
+program modify
+return 0
+args testfile replace_file_contents 0 "Some new content for the file." set_file_mtime 0 1406885162
+file testfile utf-8-standardization-input.zip utf-8-standardization-output.zip
diff --git a/regress/zip64.zip b/regress/zip64.zip
new file mode 100644 (file)
index 0000000..c1ba76b
Binary files /dev/null and b/regress/zip64.zip differ
diff --git a/regress/zip64_creation.test b/regress/zip64_creation.test
new file mode 100644 (file)
index 0000000..dfc90b6
--- /dev/null
@@ -0,0 +1,5 @@
+# create big zip64 zip file from scratch
+program modify
+args bigzero.zip  add_nul bigzero 4294967296
+file-new bigzero.zip bigzero.zip
+return 0
diff --git a/regress/zip64_stored_creation.test b/regress/zip64_stored_creation.test
new file mode 100644 (file)
index 0000000..d554635
--- /dev/null
@@ -0,0 +1,5 @@
+# create big zip64 zip file from scratch
+program modify
+args -H bigstored.zh  add_nul bigzero 4294967296  set_file_compression 0 0 0  set_file_mtime 0 0  add_nul smallzero 16384  set_file_compression 1 0 0  set_file_mtime 1 0
+file-new bigstored.zh bigstored.zh
+return 0
diff --git a/regress/ziptest.c b/regress/ziptest.c
deleted file mode 100644 (file)
index 7d37be5..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-#include "zip.h"
-#include "error.h"
-
-
-int
-main(int argc, char *argv[])
-{
-#if 0
-    int i;
-#endif
-    struct zip *za, *destza;
-#if 0
-#define BUFSIZE 65536
-    struct zip_file *zf1, *zf2;
-    char buf1[BUFSIZE], buf2[BUFSIZE];
-#endif
-    
-#if 0
-    if (argc != 2) {
-       fprintf(stderr, "%s: call with one option: the zip-file to destroy"
-               "^H^H^H^H^H^H^Htest\n", argv[0]);
-       return 1;
-    }
-#endif
-    if (argc != 3) {
-       fprintf(stderr, "%s: call with two options: src dest\n", argv[0]);
-       return 1;
-    }
-
-    if ((za=zip_open(argv[1], ZIP_CHECKCONS))==NULL) {
-       fprintf(stderr, "%s: %s: can't open file: %s\n", argv[0], argv[1],
-               zip_err_str[zip_err]);
-       return 1;
-    }
-
-    if ((destza=zip_open(argv[2], ZIP_CREATE))==NULL) {
-       fprintf(stderr, "%s: %s: can't open file: %s\n", argv[0], argv[2],
-               zip_err_str[zip_err]);
-       return 1;
-    }
-
-#if 0
-    for (i=0; i<za->nentry; i++) {
-       printf("%8d %s\n", za->entry[i].uncomp_size, za->entry[i].fn);
-       zip_add_zip(destza, za->entry[i].fn, za, i, 0, 0);
-    }
-#endif
-
-    if (zip_add_zip(destza, NULL, NULL, za, 0, 0, 0) == -1)
-       fprintf(stderr, "%s: %s: can't add file to zip '%s': %s\n", argv[0],
-               za->entry[0].fn, argv[1], zip_err_str[zip_err]);
-
-#if 0
-    zf1= zf_open_index(za, 1);
-    if (!zf1) {
-       fprintf(stderr, "boese, boese\n");
-       exit(100);
-    }
-    
-    i = zf_read(zf1, buf1, 100);
-    if (i < 0)
-       fprintf(stderr, "read error: %s\n", zip_err_str[zf1->flags]);
-    else {
-       buf1[i] = 0;
-       printf("read %d bytes: '%s'\n", i, buf1);
-    }
-    zf2 = zf_open_index(za, 1);
-    i = zf_read(zf2, buf2, 200);
-    if (i < 0)
-       fprintf(stderr, "read error: %s\n", zip_err_str[zf2->flags]);
-    else {
-       buf2[i] = 0;
-       printf("read %d bytes: '%s'\n", i, buf2);
-    }
-    i = zf_read(zf1, buf1, 100);
-    if (i < 0)
-       fprintf(stderr, "read error: %s\n", zip_err_str[zf1->flags]);
-    else {
-       buf1[i] = 0;
-       printf("read %d bytes: '%s'\n", i, buf1);
-    }
-    zf_close(zf1);
-    zf_close(zf2);
-#endif
-    
-    if (zip_close(destza)!=0) {
-       fprintf(stderr, "%s: %s: can't close file: %s\n", argv[0], argv[2],
-               zip_err_str[zip_err]);
-       return 1;
-    }
-
-    if (zip_close(za)!=0) {
-       fprintf(stderr, "%s: %s: can't close file: %s\n", argv[0], argv[1],
-               zip_err_str[zip_err]);
-       return 1;
-    }
-    
-    return 0;
-}
index de80164..8906e81 100644 (file)
@@ -13,7 +13,3 @@ INSTALL(TARGETS zipcmp RUNTIME DESTINATION bin)
 ADD_EXECUTABLE(zipmerge zipmerge.c ${SRC_EXTRA_FILES})
 TARGET_LINK_LIBRARIES(zipmerge zip)
 INSTALL(TARGETS zipmerge RUNTIME DESTINATION bin)
-
-ADD_EXECUTABLE(ziptorrent ziptorrent.c ${SRC_EXTRA_FILES})
-TARGET_LINK_LIBRARIES(ziptorrent zip)
-INSTALL(TARGETS ziptorrent RUNTIME DESTINATION bin)
index 7fa4b8e..16ade70 100644 (file)
@@ -1,10 +1,10 @@
-bin_PROGRAMS=zipcmp zipmerge ziptorrent
+bin_PROGRAMS=zipcmp zipmerge
 
-zipcmp_CPPFLAGS=-I${top_srcdir}/lib
+zipcmp_SOURCES=zipcmp.c
+
+zipcmp_CPPFLAGS=-I${top_srcdir}/lib -I../lib
 zipcmp_LDADD=${top_builddir}/lib/libzip.la
-zipmerge_CPPFLAGS=-I${top_srcdir}/lib
+zipmerge_CPPFLAGS=-I${top_srcdir}/lib -I../lib
 zipmerge_LDADD=${top_builddir}/lib/libzip.la
-ziptorrent_CPPFLAGS=-I${top_srcdir}/lib
-ziptorrent_LDADD=${top_builddir}/lib/libzip.la
 
-EXTRA_DIST=    CMakeLists.txt getopt.c getopt.h
+EXTRA_DIST=    CMakeLists.txt getopt.c getopt.h compat.h
index 0c064d9..a09b585 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -34,51 +78,97 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-bin_PROGRAMS = zipcmp$(EXEEXT) zipmerge$(EXEEXT) ziptorrent$(EXEEXT)
+bin_PROGRAMS = zipcmp$(EXEEXT) zipmerge$(EXEEXT)
 subdir = src
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+       $(top_srcdir)/depcomp
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
 PROGRAMS = $(bin_PROGRAMS)
-zipcmp_SOURCES = zipcmp.c
-zipcmp_OBJECTS = zipcmp-zipcmp.$(OBJEXT)
+am_zipcmp_OBJECTS = zipcmp-zipcmp.$(OBJEXT)
+zipcmp_OBJECTS = $(am_zipcmp_OBJECTS)
 zipcmp_DEPENDENCIES = ${top_builddir}/lib/libzip.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
 zipmerge_SOURCES = zipmerge.c
 zipmerge_OBJECTS = zipmerge-zipmerge.$(OBJEXT)
 zipmerge_DEPENDENCIES = ${top_builddir}/lib/libzip.la
-ziptorrent_SOURCES = ziptorrent.c
-ziptorrent_OBJECTS = ziptorrent-ziptorrent.$(OBJEXT)
-ziptorrent_DEPENDENCIES = ${top_builddir}/lib/libzip.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-       --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-       --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-       $(LDFLAGS) -o $@
-SOURCES = zipcmp.c zipmerge.c ziptorrent.c
-DIST_SOURCES = zipcmp.c zipmerge.c ziptorrent.c
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(zipcmp_SOURCES) zipmerge.c
+DIST_SOURCES = $(zipcmp_SOURCES) zipmerge.c
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -87,11 +177,13 @@ AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -101,6 +193,7 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -116,6 +209,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MANFMT = @MANFMT@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -131,6 +225,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG_RPATH = @PKG_CONFIG_RPATH@
 RANLIB = @RANLIB@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
@@ -141,6 +236,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
@@ -173,7 +269,6 @@ libdir = @libdir@
 libexecdir = @libexecdir@
 localedir = @localedir@
 localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
@@ -189,13 +284,12 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-zipcmp_CPPFLAGS = -I${top_srcdir}/lib
+zipcmp_SOURCES = zipcmp.c
+zipcmp_CPPFLAGS = -I${top_srcdir}/lib -I../lib
 zipcmp_LDADD = ${top_builddir}/lib/libzip.la
-zipmerge_CPPFLAGS = -I${top_srcdir}/lib
+zipmerge_CPPFLAGS = -I${top_srcdir}/lib -I../lib
 zipmerge_LDADD = ${top_builddir}/lib/libzip.la
-ziptorrent_CPPFLAGS = -I${top_srcdir}/lib
-ziptorrent_LDADD = ${top_builddir}/lib/libzip.la
-EXTRA_DIST = CMakeLists.txt getopt.c getopt.h
+EXTRA_DIST = CMakeLists.txt getopt.c getopt.h compat.h
 all: all-am
 
 .SUFFIXES:
@@ -232,14 +326,19 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 install-binPROGRAMS: $(bin_PROGRAMS)
        @$(NORMAL_INSTALL)
-       test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
        @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+       fi; \
        for p in $$list; do echo "$$p $$p"; done | \
        sed 's/$(EXEEXT)$$//' | \
-       while read p p1; do if test -f $$p || test -f $$p1; \
-         then echo "$$p"; echo "$$p"; else :; fi; \
+       while read p p1; do if test -f $$p \
+        || test -f $$p1 \
+         ; then echo "$$p"; echo "$$p"; else :; fi; \
        done | \
-       sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+       sed -e 'p;s,.*/,,;n;h' \
+           -e 's|.*|.|' \
            -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
        sed 'N;N;N;s,\n, ,g' | \
        $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
@@ -260,7 +359,8 @@ uninstall-binPROGRAMS:
        @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
        files=`for p in $$list; do echo "$$p"; done | \
          sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
-             -e 's/$$/$(EXEEXT)/' `; \
+             -e 's/$$/$(EXEEXT)/' \
+       `; \
        test -n "$$list" || exit 0; \
        echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
        cd "$(DESTDIR)$(bindir)" && rm -f $$files
@@ -273,15 +373,14 @@ clean-binPROGRAMS:
        list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
        echo " rm -f" $$list; \
        rm -f $$list
-zipcmp$(EXEEXT): $(zipcmp_OBJECTS) $(zipcmp_DEPENDENCIES) 
+
+zipcmp$(EXEEXT): $(zipcmp_OBJECTS) $(zipcmp_DEPENDENCIES) $(EXTRA_zipcmp_DEPENDENCIES) 
        @rm -f zipcmp$(EXEEXT)
-       $(LINK) $(zipcmp_OBJECTS) $(zipcmp_LDADD) $(LIBS)
-zipmerge$(EXEEXT): $(zipmerge_OBJECTS) $(zipmerge_DEPENDENCIES) 
+       $(AM_V_CCLD)$(LINK) $(zipcmp_OBJECTS) $(zipcmp_LDADD) $(LIBS)
+
+zipmerge$(EXEEXT): $(zipmerge_OBJECTS) $(zipmerge_DEPENDENCIES) $(EXTRA_zipmerge_DEPENDENCIES) 
        @rm -f zipmerge$(EXEEXT)
-       $(LINK) $(zipmerge_OBJECTS) $(zipmerge_LDADD) $(LIBS)
-ziptorrent$(EXEEXT): $(ziptorrent_OBJECTS) $(ziptorrent_DEPENDENCIES) 
-       @rm -f ziptorrent$(EXEEXT)
-       $(LINK) $(ziptorrent_OBJECTS) $(ziptorrent_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(zipmerge_OBJECTS) $(zipmerge_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -291,70 +390,55 @@ distclean-compile:
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zipcmp-zipcmp.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zipmerge-zipmerge.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ziptorrent-ziptorrent.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .c.lo:
-@am__fastdepCC_TRUE@   $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LTCOMPILE) -c -o $@ $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
 zipcmp-zipcmp.o: zipcmp.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipcmp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zipcmp-zipcmp.o -MD -MP -MF $(DEPDIR)/zipcmp-zipcmp.Tpo -c -o zipcmp-zipcmp.o `test -f 'zipcmp.c' || echo '$(srcdir)/'`zipcmp.c
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/zipcmp-zipcmp.Tpo $(DEPDIR)/zipcmp-zipcmp.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='zipcmp.c' object='zipcmp-zipcmp.o' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipcmp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zipcmp-zipcmp.o -MD -MP -MF $(DEPDIR)/zipcmp-zipcmp.Tpo -c -o zipcmp-zipcmp.o `test -f 'zipcmp.c' || echo '$(srcdir)/'`zipcmp.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/zipcmp-zipcmp.Tpo $(DEPDIR)/zipcmp-zipcmp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='zipcmp.c' object='zipcmp-zipcmp.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipcmp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zipcmp-zipcmp.o `test -f 'zipcmp.c' || echo '$(srcdir)/'`zipcmp.c
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipcmp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zipcmp-zipcmp.o `test -f 'zipcmp.c' || echo '$(srcdir)/'`zipcmp.c
 
 zipcmp-zipcmp.obj: zipcmp.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipcmp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zipcmp-zipcmp.obj -MD -MP -MF $(DEPDIR)/zipcmp-zipcmp.Tpo -c -o zipcmp-zipcmp.obj `if test -f 'zipcmp.c'; then $(CYGPATH_W) 'zipcmp.c'; else $(CYGPATH_W) '$(srcdir)/zipcmp.c'; fi`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/zipcmp-zipcmp.Tpo $(DEPDIR)/zipcmp-zipcmp.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='zipcmp.c' object='zipcmp-zipcmp.obj' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipcmp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zipcmp-zipcmp.obj -MD -MP -MF $(DEPDIR)/zipcmp-zipcmp.Tpo -c -o zipcmp-zipcmp.obj `if test -f 'zipcmp.c'; then $(CYGPATH_W) 'zipcmp.c'; else $(CYGPATH_W) '$(srcdir)/zipcmp.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/zipcmp-zipcmp.Tpo $(DEPDIR)/zipcmp-zipcmp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='zipcmp.c' object='zipcmp-zipcmp.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipcmp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zipcmp-zipcmp.obj `if test -f 'zipcmp.c'; then $(CYGPATH_W) 'zipcmp.c'; else $(CYGPATH_W) '$(srcdir)/zipcmp.c'; fi`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipcmp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zipcmp-zipcmp.obj `if test -f 'zipcmp.c'; then $(CYGPATH_W) 'zipcmp.c'; else $(CYGPATH_W) '$(srcdir)/zipcmp.c'; fi`
 
 zipmerge-zipmerge.o: zipmerge.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipmerge_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zipmerge-zipmerge.o -MD -MP -MF $(DEPDIR)/zipmerge-zipmerge.Tpo -c -o zipmerge-zipmerge.o `test -f 'zipmerge.c' || echo '$(srcdir)/'`zipmerge.c
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/zipmerge-zipmerge.Tpo $(DEPDIR)/zipmerge-zipmerge.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='zipmerge.c' object='zipmerge-zipmerge.o' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipmerge_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zipmerge-zipmerge.o -MD -MP -MF $(DEPDIR)/zipmerge-zipmerge.Tpo -c -o zipmerge-zipmerge.o `test -f 'zipmerge.c' || echo '$(srcdir)/'`zipmerge.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/zipmerge-zipmerge.Tpo $(DEPDIR)/zipmerge-zipmerge.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='zipmerge.c' object='zipmerge-zipmerge.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipmerge_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zipmerge-zipmerge.o `test -f 'zipmerge.c' || echo '$(srcdir)/'`zipmerge.c
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipmerge_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zipmerge-zipmerge.o `test -f 'zipmerge.c' || echo '$(srcdir)/'`zipmerge.c
 
 zipmerge-zipmerge.obj: zipmerge.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipmerge_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zipmerge-zipmerge.obj -MD -MP -MF $(DEPDIR)/zipmerge-zipmerge.Tpo -c -o zipmerge-zipmerge.obj `if test -f 'zipmerge.c'; then $(CYGPATH_W) 'zipmerge.c'; else $(CYGPATH_W) '$(srcdir)/zipmerge.c'; fi`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/zipmerge-zipmerge.Tpo $(DEPDIR)/zipmerge-zipmerge.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='zipmerge.c' object='zipmerge-zipmerge.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipmerge_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zipmerge-zipmerge.obj `if test -f 'zipmerge.c'; then $(CYGPATH_W) 'zipmerge.c'; else $(CYGPATH_W) '$(srcdir)/zipmerge.c'; fi`
-
-ziptorrent-ziptorrent.o: ziptorrent.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ziptorrent_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ziptorrent-ziptorrent.o -MD -MP -MF $(DEPDIR)/ziptorrent-ziptorrent.Tpo -c -o ziptorrent-ziptorrent.o `test -f 'ziptorrent.c' || echo '$(srcdir)/'`ziptorrent.c
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/ziptorrent-ziptorrent.Tpo $(DEPDIR)/ziptorrent-ziptorrent.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='ziptorrent.c' object='ziptorrent-ziptorrent.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ziptorrent_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ziptorrent-ziptorrent.o `test -f 'ziptorrent.c' || echo '$(srcdir)/'`ziptorrent.c
-
-ziptorrent-ziptorrent.obj: ziptorrent.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ziptorrent_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ziptorrent-ziptorrent.obj -MD -MP -MF $(DEPDIR)/ziptorrent-ziptorrent.Tpo -c -o ziptorrent-ziptorrent.obj `if test -f 'ziptorrent.c'; then $(CYGPATH_W) 'ziptorrent.c'; else $(CYGPATH_W) '$(srcdir)/ziptorrent.c'; fi`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/ziptorrent-ziptorrent.Tpo $(DEPDIR)/ziptorrent-ziptorrent.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='ziptorrent.c' object='ziptorrent-ziptorrent.obj' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipmerge_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zipmerge-zipmerge.obj -MD -MP -MF $(DEPDIR)/zipmerge-zipmerge.Tpo -c -o zipmerge-zipmerge.obj `if test -f 'zipmerge.c'; then $(CYGPATH_W) 'zipmerge.c'; else $(CYGPATH_W) '$(srcdir)/zipmerge.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/zipmerge-zipmerge.Tpo $(DEPDIR)/zipmerge-zipmerge.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='zipmerge.c' object='zipmerge-zipmerge.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ziptorrent_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ziptorrent-ziptorrent.obj `if test -f 'ziptorrent.c'; then $(CYGPATH_W) 'ziptorrent.c'; else $(CYGPATH_W) '$(srcdir)/ziptorrent.c'; fi`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zipmerge_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zipmerge-zipmerge.obj `if test -f 'zipmerge.c'; then $(CYGPATH_W) 'zipmerge.c'; else $(CYGPATH_W) '$(srcdir)/zipmerge.c'; fi`
 
 mostlyclean-libtool:
        -rm -f *.lo
@@ -362,26 +446,15 @@ mostlyclean-libtool:
 clean-libtool:
        -rm -rf .libs _libs
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -393,15 +466,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -410,6 +479,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -461,10 +545,15 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -548,19 +637,19 @@ uninstall-am: uninstall-binPROGRAMS
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
-       clean-generic clean-libtool ctags distclean distclean-compile \
-       distclean-generic distclean-libtool distclean-tags distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-binPROGRAMS install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-       pdf pdf-am ps ps-am tags uninstall uninstall-am \
-       uninstall-binPROGRAMS
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+       clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+       ctags ctags-am distclean distclean-compile distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-binPROGRAMS \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-ps install-ps-am install-strip \
+       installcheck installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags tags-am uninstall uninstall-am uninstall-binPROGRAMS
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/src/compat.h b/src/compat.h
new file mode 100644 (file)
index 0000000..0c703ed
--- /dev/null
@@ -0,0 +1,61 @@
+#ifndef HAD_COMPAT_H
+#define HAD_COMPAT_H
+
+/*
+  compat.h -- compatibility defines
+  Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <libzip@nih.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef _HAD_ZIP_H
+#error zip.h has to be included first
+#endif
+
+#ifndef PRId64
+#ifdef _MSC_VER
+#define PRId64 "I64d"
+#else
+#define PRId64 "lld"
+#endif
+#endif
+
+#ifndef PRIu64
+#ifdef _MSC_VER
+#define PRIu64 "I64u"
+#else
+#define PRIu64 "llu"
+#endif
+#endif
+
+#ifndef S_ISDIR
+#define S_ISDIR(mode)  (((mode) & S_IFMT) == S_IFDIR)
+#endif
+
+#endif
index 75a3e4e..0457a86 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zipcmp.c -- compare zip files
-  Copyright (C) 2003-2010 Dieter Baron and Thomas Klausner
+  Copyright (C) 2003-2015 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include "config.h"
 
+#include <sys/stat.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
+#ifdef HAVE_FTS_H
+#include <fts.h>
+#endif
 #include <zlib.h>
 
 #ifndef HAVE_GETOPT
 #include "getopt.h"
 #endif
 
+/* include zipint.h for Windows compatibility */
+#include "zipint.h"
 #include "zip.h"
+#include "compat.h"
+
+struct archive {
+    const char *name;
+    zip_t *za;
+    zip_uint64_t nentry;
+    struct entry *entry;
+    const char *comment;
+    size_t comment_length;
+};
+
+struct ef {
+    const char *name;
+    zip_uint16_t flags;
+    zip_uint16_t id;
+    zip_uint16_t size;
+    const zip_uint8_t *data;
+};
 
 struct entry {
     char *name;
-    unsigned int size;
-    unsigned int crc;
+    zip_uint64_t size;
+    zip_uint32_t crc;
+    zip_uint32_t comp_method;
+    struct ef *extra_fields;
+    zip_uint16_t n_extra_fields;
+    const char *comment;
+    zip_uint32_t comment_length;
 };
 
-\f
 
 const char *prg;
 
-#define PROGRAM        "zipmerge"
+#define PROGRAM        "zipcmp"
 
-char *usage = "usage: %s [-hiqtVv] zip1 zip2\n";
+#define USAGE "usage: %s [-hipqtVv] archive1 archive2\n"
 
 char help_head[] =
     PROGRAM " (" PACKAGE ") by Dieter Baron and Thomas Klausner\n\n";
 
 char help[] = "\n\
   -h       display this help message\n\
-  -V       display version number\n\
   -i       compare names ignoring case distinctions\n\
+  -p       compare as many details as possible\n\
   -q       be quiet\n\
-  -t       test zip files\n\
+  -t       test zip files (compare file contents to checksum)\n\
+  -V       display version number\n\
   -v       be verbose (print differences, default)\n\
 \n\
 Report bugs to <libzip@nih.at>.\n";
 
 char version_string[] = PROGRAM " (" PACKAGE " " VERSION ")\n\
-Copyright (C) 2010 Dieter Baron and Thomas Klausner\n\
+Copyright (C) 2003-2015 Dieter Baron and Thomas Klausner\n\
 " PACKAGE " comes with ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n";
 
-#define OPTIONS "hViqtv"
+#define OPTIONS "hVipqtv"
+
 
-\f
+#define BOTH_ARE_ZIPS(a)       (a[0].za && a[1].za)
 
+static int comment_compare(const char *c1, size_t l1, const char *c2, size_t l2);
+static int compare_list(char * const name[],
+                       const void *l[], const zip_uint64_t n[], int size,
+                       int (*cmp)(const void *, const void *),
+                       int (*checks)(char *const name[2], const void *, const void *),
+                       void (*print)(const void *));
+static int compare_zip(char * const zn[]);
+static int ef_compare(char *const name[2], const struct entry *e1, const struct entry *e2);
+static int ef_order(const void *a, const void *b);
+static void ef_print(const void *p);
+static int ef_read(zip_t *za, zip_uint64_t idx, struct entry *e);
 static int entry_cmp(const void *p1, const void *p2);
+static int entry_paranoia_checks(char *const name[2], const void *p1, const void *p2);
 static void entry_print(const void *p);
-static int compare_list(char * const name[], int verbose,
-                const void *l[], const int n[], int size,
-                int (*cmp)(const void *, const void *),
-                void print(const void *));
-static int compare_zip(char * const zn[], int verbose);
-static int test_file(struct zip *za, int idx, off_t size, unsigned int crc);
+static int is_directory(const char *name);
+#ifdef HAVE_FTS_H
+static int list_directory(const char *name, struct archive *a);
+#endif
+static int list_zip(const char *name, struct archive *a);
+static int test_file(zip_t *za, zip_uint64_t idx, zip_uint64_t size, zip_uint32_t crc);
 
-int ignore_case, test_files;
+int ignore_case, test_files, paranoid, verbose;
+int header_done;
 
-\f
 
 int
 main(int argc, char * const argv[])
 {
-    int verbose;
     int c;
 
     prg = argv[0];
 
     ignore_case = 0;
     test_files = 0;
+    paranoid = 0;
     verbose = 1;
 
     while ((c=getopt(argc, argv, OPTIONS)) != -1) {
@@ -115,6 +159,9 @@ main(int argc, char * const argv[])
        case 'i':
            ignore_case = 1;
            break;
+       case 'p':
+           paranoid = 1;
+           break;
        case 'q':
            verbose = 0;
            break;
@@ -127,7 +174,7 @@ main(int argc, char * const argv[])
 
        case 'h':
            fputs(help_head, stdout);
-           printf(usage, prg);
+           printf(USAGE, prg);
            fputs(help, stdout);
            exit(0);
        case 'V':
@@ -135,64 +182,77 @@ main(int argc, char * const argv[])
            exit(0);
 
        default:
-           fprintf(stderr, usage, prg);
+           fprintf(stderr, USAGE, prg);
            exit(2);
        }
     }
 
     if (argc != optind+2) {
-       fprintf(stderr, usage, prg);
+       fprintf(stderr, USAGE, prg);
        exit(2);
     }
 
-    exit((compare_zip(argv+optind, verbose) == 0) ? 0 : 1);
+    exit((compare_zip(argv+optind) == 0) ? 0 : 1);
 }
 
-\f
 
 static int
-compare_zip(char * const zn[], int verbose)
+compare_zip(char * const zn[])
 {
-    struct zip *za;
-    struct zip_stat st;
+    struct archive a[2];
     struct entry *e[2];
-    int n[2];
-    int i, j;
-    int err;
-    char errstr[1024];
+    zip_uint64_t n[2];
+    int i;
+    int res;
 
     for (i=0; i<2; i++) {
-       if ((za=zip_open(zn[i], 0, &err)) == NULL) {
-           zip_error_to_str(errstr, sizeof(errstr), err, errno);
-           fprintf(stderr, "%s: cannot open zip archive `%s': %s\n",
-                   prg, zn[i], errstr);
-           return -1;
+       a[i].name = zn[i];
+       a[i].entry = NULL;
+       a[i].nentry = 0;
+       a[i].za = NULL;
+       a[i].comment = NULL;
+       a[i].comment_length =0;
+
+       if (is_directory(zn[i])) {
+#ifndef HAVE_FTS_H
+           fprintf(stderr, "%s: reading directories not supported\n", prg);
+           exit(2);
+#else
+           if (list_directory(zn[i], a+i) < 0)
+               exit(2);
+           paranoid = 0; /* paranoid checks make no sense for directories, since they compare zip metadata */
+#endif
        }
-
-       n[i] = zip_get_num_files(za);
-
-       if ((e[i]=malloc(sizeof(*e[i]) * n[i])) == NULL) {
-           fprintf(stderr, "%s: malloc failure\n", prg);
-           exit(1);
+       else {
+           if (list_zip(zn[i], a+i) < 0)
+               exit(2);
        }
+       qsort(a[i].entry, a[i].nentry, sizeof(a[i].entry[0]), entry_cmp);
+    }
 
-       for (j=0; j<n[i]; j++) {
-           zip_stat_index(za, j, 0, &st);
-           e[i][j].name = strdup(st.name);
-           e[i][j].size = st.size;
-           e[i][j].crc = st.crc;
-           if (test_files)
-               test_file(za, j, st.size, st.crc);
+    header_done = 0;
+
+    e[0] = a[0].entry;
+    e[1] = a[1].entry;
+    n[0] = a[0].nentry;
+    n[1] = a[1].nentry;
+    res = compare_list(zn, (const void **)e, n, sizeof(e[i][0]), entry_cmp, paranoid ? entry_paranoia_checks : NULL, entry_print);
+
+    if (paranoid) {
+       if (comment_compare(a[0].comment, a[0].comment_length, a[1].comment, a[1].comment_length) != 0) {
+           if (verbose) {
+               printf("--- archive comment (%zd)\n", a[0].comment_length);
+               printf("+++ archive comment (%zd)\n", a[1].comment_length);
+           }
+           res = 1;
        }
-
-       zip_close(za);
-
-       qsort(e[i], n[i], sizeof(e[i][0]), entry_cmp);
     }
 
-    switch (compare_list(zn, verbose,
-                        (void *)e, n, sizeof(e[i][0]),
-                        entry_cmp, entry_print)) {
+    for (i=0; i<2; i++)
+       if (a[i].za)
+           zip_close(a[i].za);
+
+    switch (res) {
     case 0:
        exit(0);
 
@@ -202,30 +262,226 @@ compare_zip(char * const zn[], int verbose)
     default:
        exit(2);
     }
+}
+
+#ifdef HAVE_FTS_H
+static zip_int64_t
+compute_crc(const char *fname)
+{
+    FILE *f;
+    uLong crc = crc32(0L, Z_NULL, 0);
+    size_t n;
+    Bytef buffer[8192];
+
+
+    if ((f=fopen(fname, "r")) == NULL) {
+       fprintf(stderr, "%s: can't open %s: %s\n", prg, fname, strerror(errno));
+       return -1;
+    }
+
+    while ((n=fread(buffer, 1, sizeof(buffer), f)) > 0) {
+       crc = crc32(crc, buffer, (unsigned int)n);
+    }
+
+    if (ferror(f)) {
+       fprintf(stderr, "%s: read error on %s: %s\n", prg, fname, strerror(errno));
+       fclose(f);
+       return -1;
+    }
+
+    fclose(f);
+
+    return (zip_int64_t)crc;
+}
+#endif
+
+
+static int
+is_directory(const char *name)
+{
+    struct stat st;
+
+    if (stat(name, &st) < 0)
+       return 0;
+
+    return S_ISDIR(st.st_mode);
+}
+
+
+#ifdef HAVE_FTS_H
+static int
+list_directory(const char *name, struct archive *a)
+{
+    FTS *fts;
+    FTSENT *ent;
+    zip_uint64_t nalloc;
+
+    char * const names[2] = { (char *)name, NULL };
+
+
+    if ((fts = fts_open(names, FTS_NOCHDIR|FTS_LOGICAL, NULL)) == NULL) {
+       fprintf(stderr, "%s: can't open directory '%s': %s\n", prg, name, strerror(errno));
+       return -1;
+    }
+    size_t prefix_length = strlen(name)+1;
+
+    nalloc = 0;
+
+    while ((ent = fts_read(fts))) {
+       zip_int64_t crc;
+
+       switch (ent->fts_info) {
+       case FTS_D:
+       case FTS_DOT:
+       case FTS_DP:
+       case FTS_DEFAULT:
+       case FTS_SL:
+       case FTS_NSOK:
+           break;
+
+       case FTS_DC:
+       case FTS_DNR:
+       case FTS_ERR:
+       case FTS_NS:
+       case FTS_SLNONE:
+           /* TODO: error */
+           fts_close(fts);
+           return -1;
+
+       case FTS_F:
+           if (a->nentry >= nalloc) {
+               nalloc += 16;
+               if (nalloc > SIZE_MAX/sizeof(a->entry[0])) {
+                   fprintf(stderr, "%s: malloc failure\n", prg);
+                   exit(1);
+               }
+               a->entry = realloc(a->entry, sizeof(a->entry[0])*nalloc);
+               if (a->entry == NULL) {
+                   fprintf(stderr, "%s: malloc failure\n", prg);
+                   exit(1);
+               }
+           }
+           
+           a->entry[a->nentry].name = strdup(ent->fts_path+prefix_length);
+           a->entry[a->nentry].size = (zip_uint64_t)ent->fts_statp->st_size;
+           if ((crc = compute_crc(ent->fts_accpath)) < 0) {
+               fts_close(fts);
+               return -1;
+           }
+           
+           a->entry[a->nentry].crc = (zip_uint32_t)crc;
+           a->nentry++;
+           break;
+       }
+    }
+
+    if (fts_close(fts)) {
+       fprintf(stderr, "%s: error closing directory '%s': %s\n", prg, a->name, strerror(errno));
+       return -1;
+    }
 
     return 0;
 }
+#endif
 
-\f
 
 static int
-compare_list(char * const name[2], int verbose,
-            const void *l[2], const int n[2], int size,
+list_zip(const char *name, struct archive *a)
+{
+    zip_t *za;
+    int err;
+    struct zip_stat st;
+    unsigned int i;
+
+    if ((za=zip_open(name, paranoid ? ZIP_CHECKCONS : 0, &err)) == NULL) {
+       zip_error_t error;
+       zip_error_init_with_code(&error, err);
+       fprintf(stderr, "%s: cannot open zip archive '%s': %s\n", prg, name, zip_error_strerror(&error));
+       zip_error_fini(&error);
+       return -1;
+    }
+
+    a->za = za;
+    a->nentry = (zip_uint64_t)zip_get_num_entries(za, 0);
+    
+    if (a->nentry == 0)
+       a->entry = NULL;
+    else {
+       if ((a->nentry > SIZE_MAX/sizeof(a->entry[0])) || (a->entry=(struct entry *)malloc(sizeof(a->entry[0]) * a->nentry)) == NULL) {
+           fprintf(stderr, "%s: malloc failure\n", prg);
+           exit(1);
+       }
+
+       for (i=0; i<a->nentry; i++) {
+           zip_stat_index(za, i, 0, &st);
+           a->entry[i].name = strdup(st.name);
+           a->entry[i].size = st.size;
+           a->entry[i].crc = st.crc;
+           if (test_files)
+               test_file(za, i, st.size, st.crc);
+           if (paranoid) {
+               a->entry[i].comp_method = st.comp_method;
+               ef_read(za, i, a->entry+i);
+               a->entry[i].comment = zip_file_get_comment(za, i, &a->entry[i].comment_length, 0);
+           }
+           else {
+               a->entry[i].comp_method = 0;
+               a->entry[i].n_extra_fields = 0;
+           }
+        }
+
+        if (paranoid) {
+            int length;
+           a->comment = zip_get_archive_comment(za, &length, 0);
+            a->comment_length = (size_t)length;
+        }
+        else {
+            a->comment = NULL;
+            a->comment_length = 0;
+        }
+    }
+
+    return 0;
+}
+
+
+static int
+comment_compare(const char *c1, size_t l1, const char *c2, size_t l2) {
+    if (l1 != l2)
+       return 1;
+
+    if (l1 == 0)
+       return 0;
+
+    if (c1 == NULL || c2 == NULL)
+        return c1 == c2;
+    
+    return memcmp(c1, c2, (size_t)l2);
+}
+
+
+static int
+compare_list(char * const name[2],
+            const void *l[2], const zip_uint64_t n[2], int size,
             int (*cmp)(const void *, const void *),
-            void print(const void *))
+            int (*check)(char *const name[2], const void *, const void *),
+            void (*print)(const void *))
 {
-    int i[2], j, c;
+    unsigned int i[2];
+    int j, c;
     int diff;
 
 #define INC(k) (i[k]++, l[k]=((const char *)l[k])+size)
-#define PRINT(k)       do {                                                  \
-                           if (diff==0 && verbose)                           \
+#define PRINT(k)       do {                                            \
+                           if (header_done==0 && verbose) {            \
                                printf("--- %s\n+++ %s\n", name[0], name[1]); \
-                           if (verbose) {                                    \
-                               printf("%c ", (k)?'+':'-');                   \
-                               print(l[k]);                                  \
-                           }                                                 \
-                           diff = 1;                                         \
+                               header_done = 1;                        \
+                           }                                           \
+                           if (verbose) {                              \
+                               printf("%c ", (k)?'+':'-');             \
+                               print(l[k]);                            \
+                           }                                           \
+                           diff = 1;                                   \
                        } while (0)
 
     i[0] = i[1] = 0;
@@ -234,6 +490,8 @@ compare_list(char * const name[2], int verbose,
        c = cmp(l[0], l[1]);
 
        if (c == 0) {
+           if (check)
+               diff |= check(name, l[0], l[1]);
            INC(0);
            INC(1);
        }
@@ -257,7 +515,90 @@ compare_list(char * const name[2], int verbose,
     return diff;
 }
 
-\f
+
+static int
+ef_read(zip_t *za, zip_uint64_t idx, struct entry *e)
+{
+    zip_int16_t n_local, n_central;
+    zip_uint16_t i;
+
+    if ((n_local = zip_file_extra_fields_count(za, idx, ZIP_FL_LOCAL)) < 0
+        || (n_central = zip_file_extra_fields_count(za, idx, ZIP_FL_CENTRAL)) < 0) {
+        return -1;
+    }
+    
+    e->n_extra_fields = (zip_uint16_t)(n_local + n_central);
+    
+    if ((e->extra_fields=(struct ef *)malloc(sizeof(e->extra_fields[0])*e->n_extra_fields)) == NULL)
+       return -1;
+
+    for (i=0; i<n_local; i++) {
+       e->extra_fields[i].name = e->name;
+       e->extra_fields[i].data = zip_file_extra_field_get(za, idx, i, &e->extra_fields[i].id, &e->extra_fields[i].size, ZIP_FL_LOCAL);
+       if (e->extra_fields[i].data == NULL)
+           return -1;
+       e->extra_fields[i].flags = ZIP_FL_LOCAL;
+    }
+    for (; i<e->n_extra_fields; i++) {
+       e->extra_fields[i].name = e->name;
+       e->extra_fields[i].data=zip_file_extra_field_get(za, idx, (zip_uint16_t)(i-n_local), &e->extra_fields[i].id, &e->extra_fields[i].size, ZIP_FL_CENTRAL);
+       if (e->extra_fields[i].data == NULL)
+           return -1;
+       e->extra_fields[i].flags = ZIP_FL_CENTRAL;
+    }
+
+    qsort(e->extra_fields, e->n_extra_fields, sizeof(e->extra_fields[0]), ef_order);
+
+    return 0;
+}
+
+
+static int
+ef_compare(char *const name[2], const struct entry *e1, const struct entry *e2)
+{
+    struct ef *ef[2];
+    zip_uint64_t n[2];
+
+    ef[0] = e1->extra_fields;
+    ef[1] = e2->extra_fields;
+    n[0] = e1->n_extra_fields;
+    n[1] = e2->n_extra_fields;
+
+    return compare_list(name, (const void **)ef, n, sizeof(struct ef), ef_order, NULL, ef_print);
+}
+
+
+
+static int
+ef_order(const void *ap, const void *bp) {
+    const struct ef *a, *b;
+
+    a = (struct ef *)ap;
+    b = (struct ef *)bp;
+
+    if (a->flags != b->flags)
+       return a->flags - b->flags;
+    if (a->id != b->id)
+       return a->id - b->id;
+    if (a->size != b->size)
+       return a->size - b->size;
+    return memcmp(a->data, b->data, a->size);
+}
+
+
+static void
+ef_print(const void *p)
+{
+    const struct ef *ef = (struct ef *)p;
+    int i;
+
+    printf("                    %s  ", ef->name);
+    printf("%04x %c <", ef->id, ef->flags == ZIP_FL_LOCAL ? 'l' : 'c');
+    for (i=0; i<ef->size; i++)
+       printf("%s%02x", i ? " " : "", ef->data[i]);
+    printf(">\n");
+}
+
 
 static int
 entry_cmp(const void *p1, const void *p2)
@@ -265,58 +606,105 @@ entry_cmp(const void *p1, const void *p2)
     const struct entry *e1, *e2;
     int c;
 
-    e1 = p1;
-    e2 = p2;
+    e1 = (struct entry *)p1;
+    e2 = (struct entry *)p2;
 
     if ((c=(ignore_case ? strcasecmp : strcmp)(e1->name, e2->name)) != 0)
        return c;
-    if (e1->size != e2->size)
-       return e1->size - e2->size;
+    if (e1->size != e2->size) {
+        if (e1->size > e2->size)
+            return 1;
+        else
+            return -1;
+    }
     if (e1->crc != e2->crc)
-       return e1->crc - e2->crc;
+       return (int)e1->crc - (int)e2->crc;
 
     return 0;
 }
 
-\f
+
+static int
+entry_paranoia_checks(char *const name[2], const void *p1, const void *p2) {
+    const struct entry *e1, *e2;
+    int ret;
+
+    e1 = (struct entry *)p1;
+    e2 = (struct entry *)p2;
+
+    ret = 0;
+
+    if (ef_compare(name, e1, e2) != 0)
+       ret = 1;
+
+    if (e1->comp_method != e2->comp_method) {
+       if (verbose) {
+           if (header_done==0) {
+               printf("--- %s\n+++ %s\n", name[0], name[1]);
+               header_done = 1;
+           }
+           printf("---                     %s  ", e1->name);
+           printf("method %u\n", e1->comp_method);
+           printf("+++                     %s  ", e1->name);
+           printf("method %u\n", e2->comp_method);
+       }
+       ret =  1;
+    }
+    if (comment_compare(e1->comment, e1->comment_length, e2->comment, e2->comment_length) != 0) {
+       if (verbose) {
+           if (header_done==0) {
+               printf("--- %s\n+++ %s\n", name[0], name[1]);
+               header_done = 1;
+           }
+           printf("---                     %s  ", e1->name);
+           printf("comment %d\n", e1->comment_length);
+           printf("+++                     %s  ", e1->name);
+           printf("comment %d\n", e2->comment_length);
+       }
+       ret = 1;
+    }
+
+    return ret;
+}
+
+
 
 static void
 entry_print(const void *p)
 {
     const struct entry *e;
 
-    e = p;
+    e = (struct entry *)p;
 
-    printf("%10u %08x %s\n", e->size, e->crc, e->name);
+    /* TODO PRId64 */
+    printf("%10lu %08x %s\n", (unsigned long)e->size, e->crc, e->name);
 }
 
-\f
 
 static int
-test_file(struct zip *za, int idx, off_t size, unsigned int crc)
+test_file(zip_t *za, zip_uint64_t idx, zip_uint64_t size, zip_uint32_t crc)
 {
-    struct zip_file *zf;
+    zip_file_t *zf;
     char buf[8192];
-    int n, nsize;
-    unsigned int ncrc;
+    zip_uint64_t nsize;
+    zip_int64_t n;
+    zip_uint32_t ncrc;
     
     if ((zf=zip_fopen_index(za, idx, 0)) == NULL) {
-       fprintf(stderr, "%s: cannot open file %d in archive: %s\n",
-               prg, idx, zip_strerror(za));
+       fprintf(stderr, "%s: cannot open file %" PRIu64 " in archive: %s\n", prg, idx, zip_strerror(za));
        return -1;
     }
 
-    ncrc = crc32(0, NULL, 0);
+    ncrc = (zip_uint32_t)crc32(0, NULL, 0);
     nsize = 0;
     
     while ((n=zip_fread(zf, buf, sizeof(buf))) > 0) {
-       nsize += n;
-       ncrc = crc32(ncrc, (const Bytef *)buf, n);
+       nsize += (zip_uint64_t)n;
+       ncrc = (zip_uint32_t)crc32(ncrc, (const Bytef *)buf, (unsigned int)n);
     }
 
     if (n < 0) {
-       fprintf(stderr, "%s: error reading file %d in archive: %s\n",
-               prg, idx, zip_file_strerror(zf));
+       fprintf(stderr, "%s: error reading file %" PRIu64 " in archive: %s\n",  prg, idx, zip_file_strerror(zf));
        zip_fclose(zf);
        return -1;
     }
@@ -324,14 +712,11 @@ test_file(struct zip *za, int idx, off_t size, unsigned int crc)
     zip_fclose(zf);
 
     if (nsize != size) {
-       /* XXX: proper printf identifier */
-       fprintf(stderr, "%s: file %d: unexpected length %ld (should be %ld)\n",
-               prg, idx, (long)nsize, (long)size);
+       fprintf(stderr, "%s: file %" PRIu64 ": unexpected length %" PRId64 " (should be %" PRId64 ")\n", prg, idx, nsize, size);
        return -2;
     }
     if (ncrc != crc) {
-       fprintf(stderr, "%s: file %d: unexpected length %x (should be %x)\n",
-               prg, idx, ncrc, crc);
+       fprintf(stderr, "%s: file %" PRIu64 ": unexpected length %x (should be %x)\n", prg, idx, ncrc, crc);
        return -2;
     }
 
index 1e79b7c..d3f1aaf 100644 (file)
@@ -1,6 +1,6 @@
 /*
   zipmerge.c -- merge zip archives
-  Copyright (C) 2004-2008 Dieter Baron and Thomas Klausner
+  Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -31,7 +31,6 @@
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-\f
 
 #include <ctype.h>
 #include <errno.h>
 #endif
 
 #include "zip.h"
-
-\f
+#include "compat.h"
 
 char *prg;
 
 #define PROGRAM        "zipmerge"
 
-char *usage = "usage: %s [-DhIiSsV] target-zip zip...\n";
+#define USAGE "usage: %s [-DhIiSsV] target-zip zip...\n"
 
 char help_head[] =
     PROGRAM " (" PACKAGE ") by Dieter Baron and Thomas Klausner\n\n";
@@ -71,10 +69,10 @@ char help[] = "\n\
   -S       don't overwrite identical files\n\
   -s       overwrite identical files without asking\n\
 \n\
-Report bugs to <libizp@nih.at>.\n";
+Report bugs to <libzip@nih.at>.\n";
 
 char version_string[] = PROGRAM " (" PACKAGE " " VERSION ")\n\
-Copyright (C) 2008 Dieter Baron and Thomas Klausner\n\
+Copyright (C) 2004-2014 Dieter Baron and Thomas Klausner\n\
 " PACKAGE " comes with ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n";
 
 #define OPTIONS "hVDiIsS"
@@ -85,21 +83,21 @@ Copyright (C) 2008 Dieter Baron and Thomas Klausner\n\
 #define CONFIRM_SAME_NO                0x020
 
 int confirm;
-int name_flags;
+zip_flags_t name_flags;
 
-static int confirm_replace(struct zip *, const char *, int,
-                          struct zip *, const char *, int);
-static int merge_zip(struct zip *za, const char *, const char *, struct zip **);
+static int confirm_replace(zip_t *, const char *, zip_uint64_t,
+                          zip_t *, const char *, zip_uint64_t);
+static zip_t *merge_zip(zip_t *, const char *, const char *);
 
-\f
 
 int
 main(int argc, char *argv[])
 {
-    struct zip *za;
-    struct zip **zs;
-    int c, err, i;
-    char errstr[1024], *tname;
+    zip_t *za;
+    zip_t **zs;
+    int c, err;
+    unsigned int i, n;
+    char *tname;
 
     prg = argv[0];
 
@@ -128,7 +126,7 @@ main(int argc, char *argv[])
 
        case 'h':
            fputs(help_head, stdout);
-           printf(usage, prg);
+           printf(USAGE, prg);
            fputs(help, stdout);
            exit(0);
        case 'V':
@@ -136,52 +134,54 @@ main(int argc, char *argv[])
            exit(0);
 
        default:
-           fprintf(stderr, usage, prg);
+           fprintf(stderr, USAGE, prg);
            exit(2);
        }
     }
 
     if (argc < optind+2) {
-       fprintf(stderr, usage, prg);
+       fprintf(stderr, USAGE, prg);
        exit(2);
     }
 
     tname = argv[optind++];
+    argv += optind;
 
-    if ((zs=malloc(sizeof(zs[0])*(argc-optind))) == NULL) {
+    n = (unsigned int)(argc-optind);
+    if ((zs=(zip_t **)malloc(sizeof(zs[0])*n)) == NULL) {
        fprintf(stderr, "%s: out of memory\n", prg);
        exit(1);
     }
 
     if ((za=zip_open(tname, ZIP_CREATE, &err)) == NULL) {
-       zip_error_to_str(errstr, sizeof(errstr), err, errno);
-       fprintf(stderr, "%s: cannot open zip archive `%s': %s\n",
-               prg, tname, errstr);
+       zip_error_t error;
+       zip_error_init_with_code(&error, err);
+       fprintf(stderr, "%s: can't open zip archive '%s': %s\n", prg, tname, zip_error_strerror(&error));
+       zip_error_fini(&error);
        exit(1);
     }
 
-    for (i=0; i<argc-optind; i++) {
-       if (merge_zip(za, tname, argv[optind+i], zs+i) < 0)
+    for (i=0; i<n; i++) {
+       if ((zs[i]=merge_zip(za, tname, argv[i])) == NULL)
            exit(1);
     }
 
     if (zip_close(za) < 0) {
-       fprintf(stderr, "%s: cannot write zip archive `%s': %s\n",
+       fprintf(stderr, "%s: cannot write zip archive '%s': %s\n",
                prg, tname, zip_strerror(za));
        exit(1);
     }
 
-    for (i=0; i<argc-optind; i++)
+    for (i=0; i<n; i++)
        zip_close(zs[i]);
 
     exit(0);
 }
 
-\f
 
 static int
-confirm_replace(struct zip *za, const char *tname, int it,
-               struct zip *zs, const char *sname, int is)
+confirm_replace(zip_t *za, const char *tname, zip_uint64_t it,
+               zip_t *zs, const char *sname, zip_uint64_t is)
 {
     char line[1024];
     struct zip_stat st, ss;
@@ -192,12 +192,12 @@ confirm_replace(struct zip *za, const char *tname, int it,
        return 0;
 
     if (zip_stat_index(za, it, ZIP_FL_UNCHANGED, &st) < 0) {
-       fprintf(stderr, "%s: cannot stat file %d in `%s': %s\n",
+       fprintf(stderr, "%s: cannot stat file %"PRIu64" in '%s': %s\n",
                prg, it, tname, zip_strerror(za));
        return -1;
     }
     if (zip_stat_index(zs, is, 0, &ss) < 0) {
-       fprintf(stderr, "%s: cannot stat file %d in `%s': %s\n",
+       fprintf(stderr, "%s: cannot stat file %"PRIu64" in '%s': %s\n",
                prg, is, sname, zip_strerror(zs));
        return -1;
     }
@@ -209,8 +209,8 @@ confirm_replace(struct zip *za, const char *tname, int it,
            return 0;
     }
 
-    printf("replace `%s' (%llu / %08x) in `%s'\n"
-          "   with `%s' (%llu / %08x) from `%s'? ",
+    printf("replace '%s' (%"PRIu64" / %08x) in `%s'\n"
+          "   with '%s' (%"PRIu64" / %08x) from `%s'? ",
           st.name, st.size, st.crc, tname,
           ss.name, ss.size, ss.crc, sname);
     fflush(stdout);
@@ -227,54 +227,60 @@ confirm_replace(struct zip *za, const char *tname, int it,
     return 0;
 }
 
-\f
 
-static int
-merge_zip(struct zip *za, const char *tname, const char *sname,
-         struct zip **zsp)
+static zip_t *
+merge_zip(zip_t *za, const char *tname, const char *sname)
 {
-    struct zip *zs;
-    struct zip_source *source;
-    int i, idx, err;
-    char errstr[1024];
+    zip_t *zs;
+    zip_source_t *source;
+    zip_int64_t ret, idx;
+    zip_uint64_t i;
+    int err;
     const char *fname;
     
     if ((zs=zip_open(sname, 0, &err)) == NULL) {
-       zip_error_to_str(errstr, sizeof(errstr), err, errno);
-       fprintf(stderr, "%s: cannot open zip archive `%s': %s\n",
-               prg, sname, errstr);
-       return -1;
+       zip_error_t error;
+       zip_error_init_with_code(&error, err);
+       fprintf(stderr, "%s: can't open zip archive '%s': %s\n", prg, sname, zip_error_strerror(&error));
+       zip_error_fini(&error);
+       return NULL;
     }
 
-    for (i=0; i<zip_get_num_files(zs); i++) {
+    ret = zip_get_num_entries(zs, 0);
+    if (ret < 0) {
+        fprintf(stderr, "%s: cannot get number of entries for '%s': %s\n", prg, sname, zip_strerror(za));
+        return NULL;
+    }
+    for (i=0; i<(zip_uint64_t)ret; i++) {
        fname = zip_get_name(zs, i, 0);
 
-       if ((idx=zip_name_locate(za, fname, name_flags)) != -1) {
-           switch (confirm_replace(za, tname, idx, zs, sname, i)) {
+       if ((idx=zip_name_locate(za, fname, name_flags)) >= 0) {
+           switch (confirm_replace(za, tname, (zip_uint64_t)idx, zs, sname, i)) {
            case 0:
                break;
                
            case 1:
                if ((source=zip_source_zip(za, zs, i, 0, 0, 0)) == NULL
-                   || zip_replace(za, idx, source) < 0) {
+                   || zip_replace(za, (zip_uint64_t)idx, source) < 0) {
                    zip_source_free(source);
                    fprintf(stderr,
-                           "%s: cannot replace `%s' in `%s': %s\n",
+                           "%s: cannot replace '%s' in `%s': %s\n",
                            prg, fname, tname, zip_strerror(za));
-                   return -1;
+                    zip_close(zs);
+                   return NULL;
                }
                break;
 
            case -1:
                zip_close(zs);
-               return -1;
+               return NULL;
                
            default:
                fprintf(stderr, "%s: internal error: "
                        "unexpected return code from confirm (%d)\n",
                        prg, err);
                zip_close(zs);
-               return -1;
+               return NULL;
            }
        }
        else {
@@ -282,14 +288,13 @@ merge_zip(struct zip *za, const char *tname, const char *sname,
                || zip_add(za, fname, source) < 0) {
                zip_source_free(source);
                fprintf(stderr,
-                       "%s: cannot add `%s' to `%s': %s\n",
+                       "%s: cannot add '%s' to `%s': %s\n",
                        prg, fname, tname, zip_strerror(za));
                zip_close(zs);
-               return -1;
+               return NULL;
            }
        }
     }
 
-    *zsp = zs;
-    return 0;
+    return zs;
 }
diff --git a/src/ziptorrent.c b/src/ziptorrent.c
deleted file mode 100644 (file)
index 7a6029a..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
-  zipcmp.c -- compare zip files
-  Copyright (C) 2008-2010 Dieter Baron and Thomas Klausner
-
-  This file is part of libzip, a library to manipulate ZIP archives.
-  The authors can be contacted at <libzip@nih.at>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
-  1. Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-  2. Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in
-     the documentation and/or other materials provided with the
-     distribution.
-  3. The names of the authors may not be used to endorse or promote
-     products derived from this software without specific prior
-     written permission.
-  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-\f
-
-#include "config.h"
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <zlib.h>
-
-#ifndef HAVE_GETOPT
-#include "getopt.h"
-#endif
-
-#include "zip.h"
-
-\f
-
-#define FLAG_DRYRUN    1
-#define FLAG_VERBOSE   2
-
-const char *prg;
-
-#define PROGRAM        "ziptorrent"
-
-char *usage = "usage: %s [-hnVv] zip [...]\n";
-
-char help_head[] =
-    PROGRAM " (" PACKAGE ") by Dieter Baron and Thomas Klausner\n\n";
-
-char help[] = "\n\
-  -h       display this help message\n\
-  -n       don't actually change archives, just print what would be done\n\
-  -V       display version number\n\
-  -v       verbose\n\
-\n\
-Report bugs to <libzip@nih.at>.\n";
-
-char version_string[] = PROGRAM " (" PACKAGE " " VERSION ")\n\
-Copyright (C) 2010 Dieter Baron and Thomas Klausner\n\
-" PACKAGE " comes with ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n";
-
-#define OPTIONS "hnVv"
-
-static int torrentzip(const char *, int);
-
-\f
-
-int
-main(int argc, char * const argv[])
-{
-    int err;
-    int c;
-    int flags;
-
-    prg = argv[0];
-    flags = 0;
-
-    while ((c=getopt(argc, argv, OPTIONS)) != -1) {
-       switch (c) {
-       case 'h':
-           fputs(help_head, stdout);
-           printf(usage, prg);
-           fputs(help, stdout);
-           exit(0);
-       case 'n':
-           flags |= FLAG_DRYRUN|FLAG_VERBOSE;
-           break;
-       case 'V':
-           fputs(version_string, stdout);
-           exit(0);
-       case 'v':
-           flags |= FLAG_VERBOSE;
-           break;
-
-       default:
-           fprintf(stderr, usage, prg);
-           exit(2);
-       }
-    }
-
-    if (argc == optind) {
-       fprintf(stderr, usage, prg);
-       exit(2);
-    }
-
-    err = 0;
-    while (optind < argc) {
-       err |= torrentzip(argv[optind++], flags);
-    }
-
-    return (err ? 1 : 0);
-}
-
-\f
-
-static int
-torrentzip(const char *fname, int flags)
-{
-    struct zip *za;
-    int err;
-    char errstr[1024];
-
-    if ((za=zip_open(fname, 0, &err)) == NULL) {
-       zip_error_to_str(errstr, sizeof(errstr), err, errno);
-       fprintf(stderr, "%s: cannot open zip archive `%s': %s\n",
-               prg, fname, errstr);
-       return -1;
-    }
-
-    if (flags & FLAG_VERBOSE) {
-       if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0))
-           printf("%s: already torrentzipped\n", fname);
-       else
-           printf("%s: torrentzipping\n", fname);
-    }
-
-    if ((flags & FLAG_DRYRUN) == 0) {
-        if (zip_set_archive_flag(za, ZIP_AFL_TORRENT, 1) < 0) {
-           fprintf(stderr,     "%s: cannot set torrentzip flag in `%s': %s\n",
-                   prg, fname, zip_strerror(za));
-           zip_close(za);
-           return -1;
-        }
-    }
-
-    if (zip_close(za) < 0) {
-       fprintf(stderr, "%s: cannot torrentzip `%s': %s\n",
-               prg, fname, zip_strerror(za));
-       zip_unchange_all(za);
-       zip_close(za);
-       return -1;
-    }
-
-    return 0;
-}
diff --git a/test-driver b/test-driver
new file mode 100755 (executable)
index 0000000..d306056
--- /dev/null
@@ -0,0 +1,139 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2013-07-13.22; # UTC
+
+# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+# Make unconditional expansion of undefined variables an error.  This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+  echo "$0: $*" >&2
+  print_usage >&2
+  exit 2
+}
+
+print_usage ()
+{
+  cat <<END
+Usage:
+  test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
+              [--expect-failure={yes|no}] [--color-tests={yes|no}]
+              [--enable-hard-errors={yes|no}] [--]
+              TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+END
+}
+
+test_name= # Used for reporting.
+log_file=  # Where to save the output of the test script.
+trs_file=  # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+  case $1 in
+  --help) print_usage; exit $?;;
+  --version) echo "test-driver $scriptversion"; exit $?;;
+  --test-name) test_name=$2; shift;;
+  --log-file) log_file=$2; shift;;
+  --trs-file) trs_file=$2; shift;;
+  --color-tests) color_tests=$2; shift;;
+  --expect-failure) expect_failure=$2; shift;;
+  --enable-hard-errors) enable_hard_errors=$2; shift;;
+  --) shift; break;;
+  -*) usage_error "invalid option: '$1'";;
+   *) break;;
+  esac
+  shift
+done
+
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file"  = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file"  = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+  usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+  usage_error "missing argument"
+fi
+
+if test $color_tests = yes; then
+  # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+  red='\e[0;31m' # Red.
+  grn='\e[0;32m' # Green.
+  lgn='\e[1;32m' # Light green.
+  blu='\e[1;34m' # Blue.
+  mgn='\e[0;35m' # Magenta.
+  std='\e[m'     # No color.
+else
+  red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here.
+"$@" >$log_file 2>&1
+estatus=$?
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+  estatus=1
+fi
+
+case $estatus:$expect_failure in
+  0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+  0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
+  77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
+  99:*)  col=$mgn res=ERROR recheck=yes gcopy=yes;;
+  *:yes) col=$lgn res=XFAIL recheck=no  gcopy=yes;;
+  *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
+esac
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/xcode/Info.plist b/xcode/Info.plist
new file mode 100644 (file)
index 0000000..650add7
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>CFBundleDevelopmentRegion</key>
+       <string>English</string>
+       <key>CFBundleExecutable</key>
+       <string>${EXECUTABLE_NAME}</string>
+       <key>CFBundleIconFile</key>
+       <string></string>
+       <key>CFBundleIdentifier</key>
+       <string>at.nih.${PRODUCT_NAME:rfc1034identifier}</string>
+       <key>CFBundleInfoDictionaryVersion</key>
+       <string>6.0</string>
+       <key>CFBundleName</key>
+       <string>${PRODUCT_NAME}</string>
+       <key>CFBundlePackageType</key>
+       <string>BNDL</string>
+       <key>CFBundleShortVersionString</key>
+       <string>PACKAGE_VERSION</string>
+       <key>CFBundleSignature</key>
+       <string>????</string>
+       <key>CFBundleVersion</key>
+       <string>1</string>
+       <key>CFPlugInDynamicRegisterFunction</key>
+       <string></string>
+       <key>CFPlugInDynamicRegistration</key>
+       <string>NO</string>
+       <key>CFPlugInFactories</key>
+       <dict>
+               <key>00000000-0000-0000-0000-000000000000</key>
+               <string>MyFactoryFunction</string>
+       </dict>
+       <key>CFPlugInTypes</key>
+       <dict>
+               <key>00000000-0000-0000-0000-000000000000</key>
+               <array>
+                       <string>00000000-0000-0000-0000-000000000000</string>
+               </array>
+       </dict>
+       <key>CFPlugInUnloadFunction</key>
+       <string></string>
+       <key>NSHumanReadableCopyright</key>
+       <string>Copyright © 2014 Dieter Baron and Thomas Klausner</string>
+</dict>
+</plist>
diff --git a/xcode/config.h b/xcode/config.h
new file mode 100644 (file)
index 0000000..e849b2f
--- /dev/null
@@ -0,0 +1,223 @@
+/* config.h.  Generated from config.h.in by configure.  */
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't.
+   */
+/* #undef HAVE_DECL_TZNAME */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the `fseeko' function. */
+#define HAVE_FSEEKO 1
+
+/* Define to 1 if you have the `ftello' function. */
+#define HAVE_FTELLO 1
+
+/* Define to 1 if you have the <fts.h> header file. */
+#define HAVE_FTS_H 1
+
+/* Define to 1 if you have the `getopt' function. */
+#define HAVE_GETOPT 1
+
+/* Define to 1 if the system has the type `int16_t'. */
+#define HAVE_INT16_T 1
+
+/* Define to 1 if the system has the type `int32_t'. */
+#define HAVE_INT32_T 1
+
+/* Define to 1 if the system has the type `int64_t'. */
+#define HAVE_INT64_T 1
+
+/* Define to 1 if the system has the type `int8_t'. */
+#define HAVE_INT8_T 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `z' library (-lz). */
+#define HAVE_LIBZ 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `mkstemp' function. */
+#define HAVE_MKSTEMP 1
+
+/* Define to 1 if you have the `MoveFileExA' function. */
+/* #undef HAVE_MOVEFILEEXA */
+
+/* Define to 1 if you have the `open' function. */
+#define HAVE_OPEN 1
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if the system has the type `ssize_t'. */
+#define HAVE_SSIZE_T 1
+
+/* Define to 1 if you have the <stdbool.h> header file. */
+#define HAVE_STDBOOL_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#define HAVE_STRCASECMP 1
+
+/* Define to 1 if you have the `strdup' function. */
+#define HAVE_STRDUP 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if `tm_zone' is a member of `struct tm'. */
+#define HAVE_STRUCT_TM_TM_ZONE 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use
+   `HAVE_STRUCT_TM_TM_ZONE' instead. */
+#define HAVE_TM_ZONE 1
+
+/* Define to 1 if you don't have `tm_zone' but do have the external array
+   `tzname'. */
+/* #undef HAVE_TZNAME */
+
+/* Define to 1 if the system has the type `uint16_t'. */
+#define HAVE_UINT16_T 1
+
+/* Define to 1 if the system has the type `uint32_t'. */
+#define HAVE_UINT32_T 1
+
+/* Define to 1 if the system has the type `uint64_t'. */
+#define HAVE_UINT64_T 1
+
+/* Define to 1 if the system has the type `uint8_t'. */
+#define HAVE_UINT8_T 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 or 0, depending whether the compiler supports simple visibility
+   declarations. */
+#define HAVE_VISIBILITY 1
+
+/* Define to 1 if you have the `_close' function. */
+/* #undef HAVE__CLOSE */
+
+/* Define to 1 if you have the `_dup' function. */
+/* #undef HAVE__DUP */
+
+/* Define to 1 if you have the `_fdopen' function. */
+/* #undef HAVE__FDOPEN */
+
+/* Define to 1 if you have the `_fileno' function. */
+/* #undef HAVE__FILENO */
+
+/* Define to 1 if you have the `_open' function. */
+/* #undef HAVE__OPEN */
+
+/* Define to 1 if you have the `_snprintf' function. */
+/* #undef HAVE__SNPRINTF */
+
+/* Define to 1 if you have the `_strdup' function. */
+/* #undef HAVE__STRDUP */
+
+/* Define to 1 if you have the `_stricmp' function. */
+/* #undef HAVE__STRICMP */
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#define LT_OBJDIR ".libs/"
+
+/* Name of package */
+#define PACKAGE "libzip"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "libzip@nih.at"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "libzip"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "libzip 1.0.1"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "libzip"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "1.0.1"
+
+/* The size of `int', as computed by sizeof. */
+#define SIZEOF_INT 4
+
+/* The size of `long', as computed by sizeof. */
+#ifndef __LP64__
+#define SIZEOF_LONG 4
+#else /* __LP64__ */
+#define SIZEOF_LONG 8
+#endif /* __LP64__ */
+
+/* The size of `long long', as computed by sizeof. */
+#define SIZEOF_LONG_LONG 8
+
+/* The size of `off_t', as computed by sizeof. */
+#define SIZEOF_OFF_T 8
+
+/* The size of `short', as computed by sizeof. */
+#define SIZEOF_SHORT 2
+
+/* The size of `size_t', as computed by sizeof. */
+#ifndef __LP64__
+#define SIZEOF_SIZE_T 4
+#else /* __LP64__ */
+#define SIZEOF_SIZE_T 8
+#endif /* __LP64__ */
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+/* #undef TM_IN_SYS_TIME */
+
+/* Version number of package */
+#define VERSION "1.0.1"
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+
+#ifndef HAVE_SSIZE_T
+#  if SIZEOF_SIZE_T == SIZEOF_INT
+typedef int ssize_t;
+#  elif SIZEOF_SIZE_T == SIZEOF_LONG
+typedef long ssize_t;
+#  elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG
+typedef long long ssize_t;
+#  else
+#error no suitable type for ssize_t found
+#  endif
+#endif
+
diff --git a/xcode/extract-version.sh b/xcode/extract-version.sh
new file mode 100755 (executable)
index 0000000..85e83fc
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# Replace the value for PLIST_KEY with the resolved definition from the header file that was passed in.
+
+SOURCE_HEADER_FILE_PATH=$1
+SOURCE_PLIST_PATH=$2
+
+PLIST_KEY="CFBundleShortVersionString"
+
+VERSION_KEY=`/usr/libexec/PlistBuddy -c "Print :${PLIST_KEY}" "${SOURCE_PLIST_PATH}"`
+
+#echo "Key: ${VERSION_KEY}"
+
+VERSION_NUM=`cat "${SOURCE_HEADER_FILE_PATH}" | sed -n "s|#define ${VERSION_KEY} \"\(.*\)\".*|\1|p"`
+
+#echo "Value: ${VERSION_NUM}"
+
+TARGET_PLIST_PATH="${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
+
+/usr/libexec/PlistBuddy -c "Set :${PLIST_KEY} ${VERSION_NUM}" "${TARGET_PLIST_PATH}"
diff --git a/xcode/libzip.xcodeproj/project.pbxproj b/xcode/libzip.xcodeproj/project.pbxproj
new file mode 100644 (file)
index 0000000..2c3a25c
--- /dev/null
@@ -0,0 +1,2596 @@
+// !$*UTF8*$!
+{
+       archiveVersion = 1;
+       classes = {
+       };
+       objectVersion = 46;
+       objects = {
+
+/* Begin PBXAggregateTarget section */
+               4B01D72815B2F5A2002D5007 /* command line tools */ = {
+                       isa = PBXAggregateTarget;
+                       buildConfigurationList = 4B01D72915B2F5A2002D5007 /* Build configuration list for PBXAggregateTarget "command line tools" */;
+                       buildPhases = (
+                       );
+                       dependencies = (
+                               4B01D72D15B2F5AC002D5007 /* PBXTargetDependency */,
+                               4B01D72F15B2F5AC002D5007 /* PBXTargetDependency */,
+                       );
+                       name = "command line tools";
+                       productName = "command line tools";
+               };
+               4B54447915C977A20067BA33 /* all */ = {
+                       isa = PBXAggregateTarget;
+                       buildConfigurationList = 4B54447C15C977A20067BA33 /* Build configuration list for PBXAggregateTarget "all" */;
+                       buildPhases = (
+                       );
+                       dependencies = (
+                               4B54447F15C977AF0067BA33 /* PBXTargetDependency */,
+                               4B54448115C977B10067BA33 /* PBXTargetDependency */,
+                       );
+                       name = all;
+                       productName = all;
+               };
+               4BACD5A715BC2D8200920691 /* test programs */ = {
+                       isa = PBXAggregateTarget;
+                       buildConfigurationList = 4BACD5AE15BC2D8200920691 /* Build configuration list for PBXAggregateTarget "test programs" */;
+                       buildPhases = (
+                       );
+                       dependencies = (
+                               4BD6CB6E19E71D0800710654 /* PBXTargetDependency */,
+                               4BACD65515BC303B00920691 /* PBXTargetDependency */,
+                               4BACD65715BC303B00920691 /* PBXTargetDependency */,
+                               4BACD65915BC303B00920691 /* PBXTargetDependency */,
+                               4BACD5B215BC2DB300920691 /* PBXTargetDependency */,
+                               4BACD66915BC303B00920691 /* PBXTargetDependency */,
+                       );
+                       name = "test programs";
+                       productName = "command line tools";
+               };
+               4BDC72A115B1B6EA00236D3C /* Build iOS Framework */ = {
+                       isa = PBXAggregateTarget;
+                       buildConfigurationList = 4BDC72A215B1B6EA00236D3C /* Build configuration list for PBXAggregateTarget "Build iOS Framework" */;
+                       buildPhases = (
+                               4BDC72A515B1B71500236D3C /* ShellScript */,
+                       );
+                       dependencies = (
+                       );
+                       name = "Build iOS Framework";
+                       productName = "Build iOS Framework";
+               };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+               4B01D6A615B2F46B002D5007 /* zip_add_dir.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F115B1B25E00236D3C /* zip_add_dir.c */; };
+               4B01D6A715B2F46B002D5007 /* zip_add_entry.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F215B1B25E00236D3C /* zip_add_entry.c */; };
+               4B01D6A815B2F46B002D5007 /* zip_add.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F315B1B25E00236D3C /* zip_add.c */; };
+               4B01D6A915B2F46B002D5007 /* zip_close.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F415B1B25E00236D3C /* zip_close.c */; };
+               4B01D6AA15B2F46B002D5007 /* zip_delete.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F515B1B25E00236D3C /* zip_delete.c */; };
+               4B01D6AB15B2F46B002D5007 /* zip_dir_add.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F615B1B25E00236D3C /* zip_dir_add.c */; };
+               4B01D6AC15B2F46B002D5007 /* zip_dirent.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F715B1B25E00236D3C /* zip_dirent.c */; };
+               4B01D6AD15B2F46B002D5007 /* zip_discard.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F815B1B25E00236D3C /* zip_discard.c */; };
+               4B01D6AE15B2F46B002D5007 /* zip_entry.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F915B1B25E00236D3C /* zip_entry.c */; };
+               4B01D6AF15B2F46B002D5007 /* zip_err_str.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FA15B1B25E00236D3C /* zip_err_str.c */; };
+               4B01D6B015B2F46B002D5007 /* zip_error_clear.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FB15B1B25E00236D3C /* zip_error_clear.c */; };
+               4B01D6B115B2F46B002D5007 /* zip_error_get_sys_type.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FC15B1B25E00236D3C /* zip_error_get_sys_type.c */; };
+               4B01D6B215B2F46B002D5007 /* zip_error_get.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FD15B1B25E00236D3C /* zip_error_get.c */; };
+               4B01D6B315B2F46B002D5007 /* zip_error_strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FE15B1B25E00236D3C /* zip_error_strerror.c */; };
+               4B01D6B415B2F46B002D5007 /* zip_error_to_str.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FF15B1B25E00236D3C /* zip_error_to_str.c */; };
+               4B01D6B515B2F46B002D5007 /* zip_error.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720015B1B25E00236D3C /* zip_error.c */; };
+               4B01D6B615B2F46B002D5007 /* zip_extra_field_api.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720115B1B25E00236D3C /* zip_extra_field_api.c */; };
+               4B01D6B715B2F46B002D5007 /* zip_extra_field.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720215B1B25E00236D3C /* zip_extra_field.c */; };
+               4B01D6B815B2F46B002D5007 /* zip_fclose.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720315B1B25E00236D3C /* zip_fclose.c */; };
+               4B01D6B915B2F46B002D5007 /* zip_fdopen.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720415B1B25E00236D3C /* zip_fdopen.c */; };
+               4B01D6BA15B2F46B002D5007 /* zip_file_add.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720515B1B25E00236D3C /* zip_file_add.c */; };
+               4B01D6BB15B2F46B002D5007 /* zip_file_error_clear.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720615B1B25E00236D3C /* zip_file_error_clear.c */; };
+               4B01D6BC15B2F46B002D5007 /* zip_file_error_get.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720715B1B25E00236D3C /* zip_file_error_get.c */; };
+               4B01D6BD15B2F46B002D5007 /* zip_file_get_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720815B1B25E00236D3C /* zip_file_get_comment.c */; };
+               4B01D6BE15B2F46B002D5007 /* zip_file_get_offset.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720915B1B25E00236D3C /* zip_file_get_offset.c */; };
+               4B01D6BF15B2F46B002D5007 /* zip_file_rename.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720A15B1B25E00236D3C /* zip_file_rename.c */; };
+               4B01D6C015B2F46B002D5007 /* zip_file_replace.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720B15B1B25E00236D3C /* zip_file_replace.c */; };
+               4B01D6C115B2F46B002D5007 /* zip_file_set_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720C15B1B25E00236D3C /* zip_file_set_comment.c */; };
+               4B01D6C215B2F46B002D5007 /* zip_file_strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720D15B1B25E00236D3C /* zip_file_strerror.c */; };
+               4B01D6C315B2F46B002D5007 /* zip_filerange_crc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720E15B1B25E00236D3C /* zip_filerange_crc.c */; };
+               4B01D6C415B2F46B002D5007 /* zip_fopen_encrypted.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720F15B1B25E00236D3C /* zip_fopen_encrypted.c */; };
+               4B01D6C515B2F46B002D5007 /* zip_fopen_index_encrypted.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721015B1B25E00236D3C /* zip_fopen_index_encrypted.c */; };
+               4B01D6C615B2F46B002D5007 /* zip_fopen_index.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721115B1B25E00236D3C /* zip_fopen_index.c */; };
+               4B01D6C715B2F46B002D5007 /* zip_fopen.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721215B1B25E00236D3C /* zip_fopen.c */; };
+               4B01D6C815B2F46B002D5007 /* zip_fread.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721315B1B25E00236D3C /* zip_fread.c */; };
+               4B01D6C915B2F46B002D5007 /* zip_get_archive_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721415B1B25E00236D3C /* zip_get_archive_comment.c */; };
+               4B01D6CA15B2F46B002D5007 /* zip_get_archive_flag.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721515B1B25E00236D3C /* zip_get_archive_flag.c */; };
+               4B01D6CB15B2F46B002D5007 /* zip_get_compression_implementation.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721615B1B25E00236D3C /* zip_get_compression_implementation.c */; };
+               4B01D6CC15B2F46B002D5007 /* zip_get_encryption_implementation.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721715B1B25E00236D3C /* zip_get_encryption_implementation.c */; };
+               4B01D6CD15B2F46B002D5007 /* zip_get_file_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721815B1B25E00236D3C /* zip_get_file_comment.c */; };
+               4B01D6CE15B2F46B002D5007 /* zip_get_name.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721915B1B25E00236D3C /* zip_get_name.c */; };
+               4B01D6CF15B2F46B002D5007 /* zip_get_num_entries.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721A15B1B25E00236D3C /* zip_get_num_entries.c */; };
+               4B01D6D015B2F46B002D5007 /* zip_get_num_files.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721B15B1B25E00236D3C /* zip_get_num_files.c */; };
+               4B01D6D115B2F46B002D5007 /* zip_memdup.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721C15B1B25E00236D3C /* zip_memdup.c */; };
+               4B01D6D215B2F46B002D5007 /* zip_name_locate.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721D15B1B25E00236D3C /* zip_name_locate.c */; };
+               4B01D6D315B2F46B002D5007 /* zip_new.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721E15B1B25E00236D3C /* zip_new.c */; };
+               4B01D6D415B2F46B002D5007 /* zip_open.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721F15B1B25E00236D3C /* zip_open.c */; };
+               4B01D6D515B2F46B002D5007 /* zip_rename.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722015B1B25E00236D3C /* zip_rename.c */; };
+               4B01D6D615B2F46B002D5007 /* zip_replace.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722115B1B25E00236D3C /* zip_replace.c */; };
+               4B01D6D715B2F46B002D5007 /* zip_set_archive_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722215B1B25E00236D3C /* zip_set_archive_comment.c */; };
+               4B01D6D815B2F46B002D5007 /* zip_set_archive_flag.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722315B1B25E00236D3C /* zip_set_archive_flag.c */; };
+               4B01D6D915B2F46B002D5007 /* zip_set_default_password.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722415B1B25E00236D3C /* zip_set_default_password.c */; };
+               4B01D6DA15B2F46B002D5007 /* zip_set_file_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722515B1B25E00236D3C /* zip_set_file_comment.c */; };
+               4B01D6DB15B2F46B002D5007 /* zip_set_file_compression.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722615B1B25E00236D3C /* zip_set_file_compression.c */; };
+               4B01D6DC15B2F46B002D5007 /* zip_set_name.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722715B1B25E00236D3C /* zip_set_name.c */; };
+               4B01D6DD15B2F46B002D5007 /* zip_source_buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722815B1B25E00236D3C /* zip_source_buffer.c */; };
+               4B01D6DE15B2F46B002D5007 /* zip_source_close.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722915B1B25E00236D3C /* zip_source_close.c */; };
+               4B01D6DF15B2F46B002D5007 /* zip_source_crc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722A15B1B25E00236D3C /* zip_source_crc.c */; };
+               4B01D6E015B2F46B002D5007 /* zip_source_deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722B15B1B25E00236D3C /* zip_source_deflate.c */; };
+               4B01D6E115B2F46B002D5007 /* zip_source_error.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722C15B1B25E00236D3C /* zip_source_error.c */; };
+               4B01D6E215B2F46B002D5007 /* zip_source_file.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722D15B1B25E00236D3C /* zip_source_file.c */; };
+               4B01D6E315B2F46B002D5007 /* zip_source_filep.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722E15B1B25E00236D3C /* zip_source_filep.c */; };
+               4B01D6E415B2F46B002D5007 /* zip_source_free.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722F15B1B25E00236D3C /* zip_source_free.c */; };
+               4B01D6E515B2F46B002D5007 /* zip_source_function.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723015B1B25E00236D3C /* zip_source_function.c */; };
+               4B01D6E615B2F46B002D5007 /* zip_source_layered.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723115B1B25E00236D3C /* zip_source_layered.c */; };
+               4B01D6E715B2F46B002D5007 /* zip_source_open.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723215B1B25E00236D3C /* zip_source_open.c */; };
+               4B01D6E815B2F46B002D5007 /* zip_source_pkware.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723315B1B25E00236D3C /* zip_source_pkware.c */; };
+               4B01D6EA15B2F46B002D5007 /* zip_source_read.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723515B1B25E00236D3C /* zip_source_read.c */; };
+               4B01D6EB15B2F46B002D5007 /* zip_source_stat.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723615B1B25E00236D3C /* zip_source_stat.c */; };
+               4B01D6EC15B2F46B002D5007 /* zip_source_window.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723715B1B25E00236D3C /* zip_source_window.c */; };
+               4B01D6ED15B2F46B002D5007 /* zip_source_zip_new.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723815B1B25E00236D3C /* zip_source_zip_new.c */; };
+               4B01D6EE15B2F46B002D5007 /* zip_source_zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723915B1B25E00236D3C /* zip_source_zip.c */; };
+               4B01D6EF15B2F46B002D5007 /* zip_stat_index.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723A15B1B25E00236D3C /* zip_stat_index.c */; };
+               4B01D6F015B2F46B002D5007 /* zip_stat_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723B15B1B25E00236D3C /* zip_stat_init.c */; };
+               4B01D6F115B2F46B002D5007 /* zip_stat.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723C15B1B25E00236D3C /* zip_stat.c */; };
+               4B01D6F215B2F46B002D5007 /* zip_strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723D15B1B25E00236D3C /* zip_strerror.c */; };
+               4B01D6F315B2F46B002D5007 /* zip_string.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723E15B1B25E00236D3C /* zip_string.c */; };
+               4B01D6F415B2F46B002D5007 /* zip_unchange_all.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723F15B1B25E00236D3C /* zip_unchange_all.c */; };
+               4B01D6F515B2F46B002D5007 /* zip_unchange_archive.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724015B1B25E00236D3C /* zip_unchange_archive.c */; };
+               4B01D6F615B2F46B002D5007 /* zip_unchange_data.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724115B1B25E00236D3C /* zip_unchange_data.c */; };
+               4B01D6F715B2F46B002D5007 /* zip_unchange.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724215B1B25E00236D3C /* zip_unchange.c */; };
+               4B01D6F815B2F46B002D5007 /* zip_utf-8.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724315B1B25E00236D3C /* zip_utf-8.c */; };
+               4B01D70715B2F4C5002D5007 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; };
+               4B01D70915B2F4CF002D5007 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; };
+               4B01D70D15B2F4EB002D5007 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; };
+               4B01D70E15B2F4EB002D5007 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; };
+               4B01D72515B2F57B002D5007 /* zipcmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B01D72115B2F572002D5007 /* zipcmp.c */; };
+               4B01D72615B2F57F002D5007 /* zipmerge.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B01D72215B2F572002D5007 /* zipmerge.c */; };
+               4B01D73215B2F5EE002D5007 /* zipconf.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BDC729E15B1B4E900236D3C /* zipconf.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               4B01D73415B2F5F4002D5007 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BDC72A015B1B56400236D3C /* config.h */; };
+               4B01D73C15B2F6AF002D5007 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; };
+               4B82CED419915F360097BC18 /* zip_file_set_mtime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B82CED319915F360097BC18 /* zip_file_set_mtime.c */; };
+               4B82CED519915F360097BC18 /* zip_file_set_mtime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B82CED319915F360097BC18 /* zip_file_set_mtime.c */; };
+               4B97204F188EBE85002FAFAD /* zip_file_get_external_attributes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B97204D188EBE85002FAFAD /* zip_file_get_external_attributes.c */; };
+               4B972050188EBE85002FAFAD /* zip_file_get_external_attributes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B97204D188EBE85002FAFAD /* zip_file_get_external_attributes.c */; };
+               4B972051188EBE85002FAFAD /* zip_file_set_external_attributes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B97204E188EBE85002FAFAD /* zip_file_set_external_attributes.c */; };
+               4B972052188EBE85002FAFAD /* zip_file_set_external_attributes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B97204E188EBE85002FAFAD /* zip_file_set_external_attributes.c */; };
+               4BACD59315BC2CFA00920691 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; };
+               4BACD59415BC2D0800920691 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; };
+               4BACD59515BC2D1C00920691 /* modify.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BACD57C15BC2AEF00920691 /* modify.c */; };
+               4BACD5BB15BC2DC900920691 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; };
+               4BACD5BC15BC2DC900920691 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; };
+               4BACD5C315BC2DE000920691 /* add_from_filep.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BACD57715BC2AEF00920691 /* add_from_filep.c */; };
+               4BACD5CA15BC2DF200920691 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; };
+               4BACD5CB15BC2DF200920691 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; };
+               4BACD5D215BC2EFE00920691 /* fopen_unchanged.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BACD57A15BC2AEF00920691 /* fopen_unchanged.c */; };
+               4BACD5D915BC2F3700920691 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; };
+               4BACD5DA15BC2F3700920691 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; };
+               4BACD5E115BC2F4500920691 /* fread.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BACD57B15BC2AEF00920691 /* fread.c */; };
+               4BACD64A15BC301300920691 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; };
+               4BACD64B15BC301300920691 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; };
+               4BACD65315BC302500920691 /* tryopen.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BACD58415BC2AEF00920691 /* tryopen.c */; };
+               4BCB434219E9347E0067FAA3 /* zip_buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCB434119E9347E0067FAA3 /* zip_buffer.c */; };
+               4BCB434319E9347E0067FAA3 /* zip_buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCB434119E9347E0067FAA3 /* zip_buffer.c */; };
+               4BCF3021199A2F820064207B /* zip_io_util.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3019199A2F820064207B /* zip_io_util.c */; };
+               4BCF3022199A2F820064207B /* zip_io_util.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3019199A2F820064207B /* zip_io_util.c */; };
+               4BCF3023199A2F820064207B /* zip_source_begin_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301A199A2F820064207B /* zip_source_begin_write.c */; };
+               4BCF3024199A2F820064207B /* zip_source_begin_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301A199A2F820064207B /* zip_source_begin_write.c */; };
+               4BCF3025199A2F820064207B /* zip_source_commit_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301B199A2F820064207B /* zip_source_commit_write.c */; };
+               4BCF3026199A2F820064207B /* zip_source_commit_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301B199A2F820064207B /* zip_source_commit_write.c */; };
+               4BCF3027199A2F820064207B /* zip_source_rollback_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301C199A2F820064207B /* zip_source_rollback_write.c */; };
+               4BCF3028199A2F820064207B /* zip_source_rollback_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301C199A2F820064207B /* zip_source_rollback_write.c */; };
+               4BCF3029199A2F820064207B /* zip_source_seek.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301D199A2F820064207B /* zip_source_seek.c */; };
+               4BCF302A199A2F820064207B /* zip_source_seek.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301D199A2F820064207B /* zip_source_seek.c */; };
+               4BCF302B199A2F820064207B /* zip_source_supports.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301E199A2F820064207B /* zip_source_supports.c */; };
+               4BCF302C199A2F820064207B /* zip_source_supports.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301E199A2F820064207B /* zip_source_supports.c */; };
+               4BCF302D199A2F820064207B /* zip_source_tell.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301F199A2F820064207B /* zip_source_tell.c */; };
+               4BCF302E199A2F820064207B /* zip_source_tell.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301F199A2F820064207B /* zip_source_tell.c */; };
+               4BCF302F199A2F820064207B /* zip_source_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3020199A2F820064207B /* zip_source_write.c */; };
+               4BCF3030199A2F820064207B /* zip_source_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3020199A2F820064207B /* zip_source_write.c */; };
+               4BCF3032199ABD3A0064207B /* zip_source_remove.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3031199ABD3A0064207B /* zip_source_remove.c */; };
+               4BCF3033199ABD3A0064207B /* zip_source_remove.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3031199ABD3A0064207B /* zip_source_remove.c */; };
+               4BCF3036199ABDDA0064207B /* zip_source_seek_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3034199ABDDA0064207B /* zip_source_seek_write.c */; };
+               4BCF3037199ABDDA0064207B /* zip_source_seek_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3034199ABDDA0064207B /* zip_source_seek_write.c */; };
+               4BCF3038199ABDDA0064207B /* zip_source_tell_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3035199ABDDA0064207B /* zip_source_tell_write.c */; };
+               4BCF3039199ABDDA0064207B /* zip_source_tell_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3035199ABDDA0064207B /* zip_source_tell_write.c */; };
+               4BD5053319A0116D007DD28A /* zip_source_call.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BD5053219A0116D007DD28A /* zip_source_call.c */; };
+               4BD5053419A01BB0007DD28A /* zip_source_call.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BD5053219A0116D007DD28A /* zip_source_call.c */; };
+               4BD6CB5D19E6A5D900710654 /* source_hole.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BD6CB5C19E6A5D900710654 /* source_hole.c */; };
+               4BD6CB6419E71CD100710654 /* source_hole.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BD6CB5C19E6A5D900710654 /* source_hole.c */; };
+               4BD6CB6619E71CD100710654 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; };
+               4BD6CB6719E71CD100710654 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; };
+               4BD6CB6F19E71D6900710654 /* hole.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BD6CB5E19E71B3B00710654 /* hole.c */; };
+               4BDC724415B1B25E00236D3C /* zip_add_dir.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F115B1B25E00236D3C /* zip_add_dir.c */; };
+               4BDC724515B1B25E00236D3C /* zip_add_entry.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F215B1B25E00236D3C /* zip_add_entry.c */; };
+               4BDC724615B1B25E00236D3C /* zip_add.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F315B1B25E00236D3C /* zip_add.c */; };
+               4BDC724715B1B25E00236D3C /* zip_close.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F415B1B25E00236D3C /* zip_close.c */; };
+               4BDC724815B1B25E00236D3C /* zip_delete.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F515B1B25E00236D3C /* zip_delete.c */; };
+               4BDC724915B1B25E00236D3C /* zip_dir_add.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F615B1B25E00236D3C /* zip_dir_add.c */; };
+               4BDC724A15B1B25E00236D3C /* zip_dirent.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F715B1B25E00236D3C /* zip_dirent.c */; };
+               4BDC724B15B1B25E00236D3C /* zip_discard.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F815B1B25E00236D3C /* zip_discard.c */; };
+               4BDC724C15B1B25E00236D3C /* zip_entry.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F915B1B25E00236D3C /* zip_entry.c */; };
+               4BDC724D15B1B25E00236D3C /* zip_err_str.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FA15B1B25E00236D3C /* zip_err_str.c */; };
+               4BDC724E15B1B25E00236D3C /* zip_error_clear.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FB15B1B25E00236D3C /* zip_error_clear.c */; };
+               4BDC724F15B1B25E00236D3C /* zip_error_get_sys_type.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FC15B1B25E00236D3C /* zip_error_get_sys_type.c */; };
+               4BDC725015B1B25E00236D3C /* zip_error_get.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FD15B1B25E00236D3C /* zip_error_get.c */; };
+               4BDC725115B1B25E00236D3C /* zip_error_strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FE15B1B25E00236D3C /* zip_error_strerror.c */; };
+               4BDC725215B1B25E00236D3C /* zip_error_to_str.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FF15B1B25E00236D3C /* zip_error_to_str.c */; };
+               4BDC725315B1B25E00236D3C /* zip_error.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720015B1B25E00236D3C /* zip_error.c */; };
+               4BDC725415B1B25E00236D3C /* zip_extra_field_api.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720115B1B25E00236D3C /* zip_extra_field_api.c */; };
+               4BDC725515B1B25E00236D3C /* zip_extra_field.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720215B1B25E00236D3C /* zip_extra_field.c */; };
+               4BDC725615B1B25E00236D3C /* zip_fclose.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720315B1B25E00236D3C /* zip_fclose.c */; };
+               4BDC725715B1B25E00236D3C /* zip_fdopen.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720415B1B25E00236D3C /* zip_fdopen.c */; };
+               4BDC725815B1B25E00236D3C /* zip_file_add.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720515B1B25E00236D3C /* zip_file_add.c */; };
+               4BDC725915B1B25E00236D3C /* zip_file_error_clear.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720615B1B25E00236D3C /* zip_file_error_clear.c */; };
+               4BDC725A15B1B25E00236D3C /* zip_file_error_get.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720715B1B25E00236D3C /* zip_file_error_get.c */; };
+               4BDC725B15B1B25E00236D3C /* zip_file_get_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720815B1B25E00236D3C /* zip_file_get_comment.c */; };
+               4BDC725C15B1B25E00236D3C /* zip_file_get_offset.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720915B1B25E00236D3C /* zip_file_get_offset.c */; };
+               4BDC725D15B1B25E00236D3C /* zip_file_rename.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720A15B1B25E00236D3C /* zip_file_rename.c */; };
+               4BDC725E15B1B25E00236D3C /* zip_file_replace.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720B15B1B25E00236D3C /* zip_file_replace.c */; };
+               4BDC725F15B1B25E00236D3C /* zip_file_set_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720C15B1B25E00236D3C /* zip_file_set_comment.c */; };
+               4BDC726015B1B25E00236D3C /* zip_file_strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720D15B1B25E00236D3C /* zip_file_strerror.c */; };
+               4BDC726115B1B25E00236D3C /* zip_filerange_crc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720E15B1B25E00236D3C /* zip_filerange_crc.c */; };
+               4BDC726215B1B25E00236D3C /* zip_fopen_encrypted.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720F15B1B25E00236D3C /* zip_fopen_encrypted.c */; };
+               4BDC726315B1B25E00236D3C /* zip_fopen_index_encrypted.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721015B1B25E00236D3C /* zip_fopen_index_encrypted.c */; };
+               4BDC726415B1B25E00236D3C /* zip_fopen_index.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721115B1B25E00236D3C /* zip_fopen_index.c */; };
+               4BDC726515B1B25E00236D3C /* zip_fopen.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721215B1B25E00236D3C /* zip_fopen.c */; };
+               4BDC726615B1B25E00236D3C /* zip_fread.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721315B1B25E00236D3C /* zip_fread.c */; };
+               4BDC726715B1B25E00236D3C /* zip_get_archive_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721415B1B25E00236D3C /* zip_get_archive_comment.c */; };
+               4BDC726815B1B25E00236D3C /* zip_get_archive_flag.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721515B1B25E00236D3C /* zip_get_archive_flag.c */; };
+               4BDC726915B1B25E00236D3C /* zip_get_compression_implementation.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721615B1B25E00236D3C /* zip_get_compression_implementation.c */; };
+               4BDC726A15B1B25E00236D3C /* zip_get_encryption_implementation.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721715B1B25E00236D3C /* zip_get_encryption_implementation.c */; };
+               4BDC726B15B1B25E00236D3C /* zip_get_file_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721815B1B25E00236D3C /* zip_get_file_comment.c */; };
+               4BDC726C15B1B25E00236D3C /* zip_get_name.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721915B1B25E00236D3C /* zip_get_name.c */; };
+               4BDC726D15B1B25E00236D3C /* zip_get_num_entries.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721A15B1B25E00236D3C /* zip_get_num_entries.c */; };
+               4BDC726E15B1B25E00236D3C /* zip_get_num_files.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721B15B1B25E00236D3C /* zip_get_num_files.c */; };
+               4BDC726F15B1B25E00236D3C /* zip_memdup.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721C15B1B25E00236D3C /* zip_memdup.c */; };
+               4BDC727015B1B25E00236D3C /* zip_name_locate.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721D15B1B25E00236D3C /* zip_name_locate.c */; };
+               4BDC727115B1B25E00236D3C /* zip_new.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721E15B1B25E00236D3C /* zip_new.c */; };
+               4BDC727215B1B25E00236D3C /* zip_open.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721F15B1B25E00236D3C /* zip_open.c */; };
+               4BDC727315B1B25E00236D3C /* zip_rename.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722015B1B25E00236D3C /* zip_rename.c */; };
+               4BDC727415B1B25E00236D3C /* zip_replace.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722115B1B25E00236D3C /* zip_replace.c */; };
+               4BDC727515B1B25E00236D3C /* zip_set_archive_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722215B1B25E00236D3C /* zip_set_archive_comment.c */; };
+               4BDC727615B1B25E00236D3C /* zip_set_archive_flag.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722315B1B25E00236D3C /* zip_set_archive_flag.c */; };
+               4BDC727715B1B25E00236D3C /* zip_set_default_password.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722415B1B25E00236D3C /* zip_set_default_password.c */; };
+               4BDC727815B1B25E00236D3C /* zip_set_file_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722515B1B25E00236D3C /* zip_set_file_comment.c */; };
+               4BDC727915B1B25E00236D3C /* zip_set_file_compression.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722615B1B25E00236D3C /* zip_set_file_compression.c */; };
+               4BDC727A15B1B25E00236D3C /* zip_set_name.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722715B1B25E00236D3C /* zip_set_name.c */; };
+               4BDC727B15B1B25E00236D3C /* zip_source_buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722815B1B25E00236D3C /* zip_source_buffer.c */; };
+               4BDC727C15B1B25E00236D3C /* zip_source_close.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722915B1B25E00236D3C /* zip_source_close.c */; };
+               4BDC727D15B1B25E00236D3C /* zip_source_crc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722A15B1B25E00236D3C /* zip_source_crc.c */; };
+               4BDC727E15B1B25E00236D3C /* zip_source_deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722B15B1B25E00236D3C /* zip_source_deflate.c */; };
+               4BDC727F15B1B25E00236D3C /* zip_source_error.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722C15B1B25E00236D3C /* zip_source_error.c */; };
+               4BDC728015B1B25E00236D3C /* zip_source_file.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722D15B1B25E00236D3C /* zip_source_file.c */; };
+               4BDC728115B1B25E00236D3C /* zip_source_filep.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722E15B1B25E00236D3C /* zip_source_filep.c */; };
+               4BDC728215B1B25E00236D3C /* zip_source_free.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722F15B1B25E00236D3C /* zip_source_free.c */; };
+               4BDC728315B1B25E00236D3C /* zip_source_function.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723015B1B25E00236D3C /* zip_source_function.c */; };
+               4BDC728415B1B25E00236D3C /* zip_source_layered.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723115B1B25E00236D3C /* zip_source_layered.c */; };
+               4BDC728515B1B25E00236D3C /* zip_source_open.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723215B1B25E00236D3C /* zip_source_open.c */; };
+               4BDC728615B1B25E00236D3C /* zip_source_pkware.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723315B1B25E00236D3C /* zip_source_pkware.c */; };
+               4BDC728815B1B25E00236D3C /* zip_source_read.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723515B1B25E00236D3C /* zip_source_read.c */; };
+               4BDC728915B1B25E00236D3C /* zip_source_stat.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723615B1B25E00236D3C /* zip_source_stat.c */; };
+               4BDC728A15B1B25E00236D3C /* zip_source_window.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723715B1B25E00236D3C /* zip_source_window.c */; };
+               4BDC728B15B1B25E00236D3C /* zip_source_zip_new.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723815B1B25E00236D3C /* zip_source_zip_new.c */; };
+               4BDC728C15B1B25E00236D3C /* zip_source_zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723915B1B25E00236D3C /* zip_source_zip.c */; };
+               4BDC728D15B1B25E00236D3C /* zip_stat_index.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723A15B1B25E00236D3C /* zip_stat_index.c */; };
+               4BDC728E15B1B25E00236D3C /* zip_stat_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723B15B1B25E00236D3C /* zip_stat_init.c */; };
+               4BDC728F15B1B25E00236D3C /* zip_stat.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723C15B1B25E00236D3C /* zip_stat.c */; };
+               4BDC729015B1B25E00236D3C /* zip_strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723D15B1B25E00236D3C /* zip_strerror.c */; };
+               4BDC729115B1B25E00236D3C /* zip_string.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723E15B1B25E00236D3C /* zip_string.c */; };
+               4BDC729215B1B25E00236D3C /* zip_unchange_all.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723F15B1B25E00236D3C /* zip_unchange_all.c */; };
+               4BDC729315B1B25E00236D3C /* zip_unchange_archive.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724015B1B25E00236D3C /* zip_unchange_archive.c */; };
+               4BDC729415B1B25E00236D3C /* zip_unchange_data.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724115B1B25E00236D3C /* zip_unchange_data.c */; };
+               4BDC729515B1B25E00236D3C /* zip_unchange.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724215B1B25E00236D3C /* zip_unchange.c */; };
+               4BDC729615B1B25E00236D3C /* zip_utf-8.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724315B1B25E00236D3C /* zip_utf-8.c */; };
+               4BDC729B15B1B2C400236D3C /* zip.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BDC729815B1B2A600236D3C /* zip.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               4BDC729F15B1B4E900236D3C /* zipconf.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BDC729E15B1B4E900236D3C /* zipconf.h */; settings = {ATTRIBUTES = (Public, ); }; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+               4B01D72C15B2F5AC002D5007 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4B01D6FC15B2F4B1002D5007;
+                       remoteInfo = zipmerge;
+               };
+               4B01D72E15B2F5AC002D5007 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4B01D70A15B2F4EB002D5007;
+                       remoteInfo = zipcmp;
+               };
+               4B01D73515B2F639002D5007 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4B01D68A15B2F3F1002D5007;
+                       remoteInfo = "libzip Mac";
+               };
+               4B01D73715B2F643002D5007 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4B01D68A15B2F3F1002D5007;
+                       remoteInfo = "libzip Mac";
+               };
+               4B54447E15C977AF0067BA33 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4B01D72815B2F5A2002D5007;
+                       remoteInfo = "command line tools";
+               };
+               4B54448015C977B10067BA33 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4BACD5A715BC2D8200920691;
+                       remoteInfo = "test programs";
+               };
+               4BACD59615BC2D3800920691 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4B01D68A15B2F3F1002D5007;
+                       remoteInfo = "libzip Mac";
+               };
+               4BACD5B115BC2DB300920691 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4BACD58815BC2CEA00920691;
+                       remoteInfo = modify;
+               };
+               4BACD5B715BC2DC900920691 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4B01D68A15B2F3F1002D5007;
+                       remoteInfo = "libzip Mac";
+               };
+               4BACD5C615BC2DF200920691 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4B01D68A15B2F3F1002D5007;
+                       remoteInfo = "libzip Mac";
+               };
+               4BACD5D515BC2F3700920691 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4B01D68A15B2F3F1002D5007;
+                       remoteInfo = "libzip Mac";
+               };
+               4BACD64715BC301300920691 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4B01D68A15B2F3F1002D5007;
+                       remoteInfo = "libzip Mac";
+               };
+               4BACD65415BC303B00920691 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4BACD5B515BC2DC900920691;
+                       remoteInfo = add_from_filep;
+               };
+               4BACD65615BC303B00920691 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4BACD5C415BC2DF200920691;
+                       remoteInfo = fopen_unchanged;
+               };
+               4BACD65815BC303B00920691 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4BACD5D315BC2F3700920691;
+                       remoteInfo = fread;
+               };
+               4BACD66815BC303B00920691 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4BACD64515BC301300920691;
+                       remoteInfo = tryopen;
+               };
+               4BD6CB6119E71CD100710654 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4B01D68A15B2F3F1002D5007;
+                       remoteInfo = "libzip Mac";
+               };
+               4BD6CB6D19E71D0800710654 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4BD6CB5F19E71CD100710654;
+                       remoteInfo = hole;
+               };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+               4B01D6FB15B2F4B1002D5007 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 2147483647;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 1;
+               };
+               4B01D70F15B2F4EB002D5007 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 2147483647;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 1;
+               };
+               4BACD58715BC2CEA00920691 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 12;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD5BD15BC2DC900920691 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 12;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD5CC15BC2DF200920691 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 12;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD5DB15BC2F3700920691 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 12;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD64C15BC301300920691 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 12;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BD6CB6819E71CD100710654 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 12;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+               3D77B86517009AA1000A5794 /* extract-version.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "extract-version.sh"; sourceTree = SOURCE_ROOT; };
+               4B01D68B15B2F3F1002D5007 /* libzip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libzip.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               4B01D6FD15B2F4B1002D5007 /* zipmerge */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = zipmerge; sourceTree = BUILT_PRODUCTS_DIR; };
+               4B01D70815B2F4CF002D5007 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; };
+               4B01D71315B2F4EB002D5007 /* zipcmp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = zipcmp; sourceTree = BUILT_PRODUCTS_DIR; };
+               4B01D72115B2F572002D5007 /* zipcmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zipcmp.c; sourceTree = "<group>"; };
+               4B01D72215B2F572002D5007 /* zipmerge.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zipmerge.c; sourceTree = "<group>"; };
+               4B01D73D15B2FB6B002D5007 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };
+               4B1ABD1A1A2E5DA700C93867 /* links */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = links; sourceTree = "<group>"; };
+               4B1ABD1B1A2E5E4D00C93867 /* handle_links */ = {isa = PBXFileReference; explicitFileType = text.script.perl; fileEncoding = 4; path = handle_links; sourceTree = "<group>"; };
+               4B1E46E51A08CB7600A376D2 /* zip_error_code_system.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_code_system.mdoc; sourceTree = "<group>"; };
+               4B1E46E61A08CB7600A376D2 /* zip_error_code_zip.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_code_zip.mdoc; sourceTree = "<group>"; };
+               4B1E46E71A08CB7600A376D2 /* zip_error_fini.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_fini.mdoc; sourceTree = "<group>"; };
+               4B1E46E81A08CB7600A376D2 /* zip_error_init.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_init.mdoc; sourceTree = "<group>"; };
+               4B1E46E91A08CB7600A376D2 /* zip_error_set.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_set.mdoc; sourceTree = "<group>"; };
+               4B1E46EA1A08CB7600A376D2 /* zip_error_strerror.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_strerror.mdoc; sourceTree = "<group>"; };
+               4B1E46EB1A08CB7600A376D2 /* zip_error_system_type.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_system_type.mdoc; sourceTree = "<group>"; };
+               4B26FF141A07DF1A000E9788 /* Makefile.am */ = {isa = PBXFileReference; explicitFileType = sourcecode.make; indentWidth = 8; path = Makefile.am; sourceTree = "<group>"; usesTabs = 1; };
+               4B26FF151A07DF1A000E9788 /* zip_file_get_external_attributes.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_get_external_attributes.mdoc; sourceTree = "<group>"; };
+               4B26FF161A07DF1A000E9788 /* zip_file_set_external_attributes.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_set_external_attributes.mdoc; sourceTree = "<group>"; };
+               4B26FF171A07DF1A000E9788 /* zip_file_set_mtime.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_set_mtime.mdoc; sourceTree = "<group>"; };
+               4B26FF181A07DFEA000E9788 /* mkdocset.pl */ = {isa = PBXFileReference; lastKnownFileType = text.script.perl; path = mkdocset.pl; sourceTree = "<group>"; };
+               4B28A9EC15BACC3900D0C17D /* libzip.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = libzip.mdoc; sourceTree = "<group>"; };
+               4B28A9ED15BACC3900D0C17D /* zip_add_dir.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_add_dir.mdoc; sourceTree = "<group>"; };
+               4B28A9EE15BACC3900D0C17D /* zip_add.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_add.mdoc; sourceTree = "<group>"; };
+               4B28A9EF15BACC3900D0C17D /* zip_close.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_close.mdoc; sourceTree = "<group>"; };
+               4B28A9F015BACC3900D0C17D /* zip_delete.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_delete.mdoc; sourceTree = "<group>"; };
+               4B28A9F115BACC3900D0C17D /* zip_dir_add.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_dir_add.mdoc; sourceTree = "<group>"; };
+               4B28A9F215BACC3900D0C17D /* zip_discard.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_discard.mdoc; sourceTree = "<group>"; };
+               4B28A9F315BACC3900D0C17D /* zip_error_clear.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_clear.mdoc; sourceTree = "<group>"; };
+               4B28A9F415BACC3900D0C17D /* zip_error_get_sys_type.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_get_sys_type.mdoc; sourceTree = "<group>"; };
+               4B28A9F515BACC3900D0C17D /* zip_error_get.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_get.mdoc; sourceTree = "<group>"; };
+               4B28A9F615BACC3900D0C17D /* zip_error_to_str.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_to_str.mdoc; sourceTree = "<group>"; };
+               4B28A9F715BACC3900D0C17D /* zip_errors.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_errors.mdoc; sourceTree = "<group>"; };
+               4B28A9F815BACC3900D0C17D /* zip_fclose.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_fclose.mdoc; sourceTree = "<group>"; };
+               4B28A9F915BACC3900D0C17D /* zip_fdopen.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_fdopen.mdoc; sourceTree = "<group>"; };
+               4B28A9FA15BACC3900D0C17D /* zip_file_add.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_add.mdoc; sourceTree = "<group>"; };
+               4B28A9FB15BACC3900D0C17D /* zip_file_extra_field_delete.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_extra_field_delete.mdoc; sourceTree = "<group>"; };
+               4B28A9FC15BACC3900D0C17D /* zip_file_extra_field_get.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_extra_field_get.mdoc; sourceTree = "<group>"; };
+               4B28A9FD15BACC3900D0C17D /* zip_file_extra_field_set.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_extra_field_set.mdoc; sourceTree = "<group>"; };
+               4B28A9FE15BACC3900D0C17D /* zip_file_extra_fields_count.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_extra_fields_count.mdoc; sourceTree = "<group>"; };
+               4B28A9FF15BACC3900D0C17D /* zip_file_get_comment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_get_comment.mdoc; sourceTree = "<group>"; };
+               4B28AA0015BACC3900D0C17D /* zip_file_rename.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_rename.mdoc; sourceTree = "<group>"; };
+               4B28AA0115BACC3900D0C17D /* zip_file_set_comment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_set_comment.mdoc; sourceTree = "<group>"; };
+               4B28AA0215BACC3900D0C17D /* zip_file_strerror.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_strerror.mdoc; sourceTree = "<group>"; };
+               4B28AA0315BACC3900D0C17D /* zip_fopen_encrypted.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_fopen_encrypted.mdoc; sourceTree = "<group>"; };
+               4B28AA0415BACC3900D0C17D /* zip_fopen.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_fopen.mdoc; sourceTree = "<group>"; };
+               4B28AA0515BACC3900D0C17D /* zip_fread.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_fread.mdoc; sourceTree = "<group>"; };
+               4B28AA0615BACC3900D0C17D /* zip_get_archive_comment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_archive_comment.mdoc; sourceTree = "<group>"; };
+               4B28AA0715BACC3900D0C17D /* zip_get_archive_flag.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_archive_flag.mdoc; sourceTree = "<group>"; };
+               4B28AA0815BACC3900D0C17D /* zip_get_file_comment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_file_comment.mdoc; sourceTree = "<group>"; };
+               4B28AA0915BACC3900D0C17D /* zip_get_name.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_name.mdoc; sourceTree = "<group>"; };
+               4B28AA0A15BACC3900D0C17D /* zip_get_num_entries.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_num_entries.mdoc; sourceTree = "<group>"; };
+               4B28AA0B15BACC3900D0C17D /* zip_get_num_files.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_num_files.mdoc; sourceTree = "<group>"; };
+               4B28AA0C15BACC3900D0C17D /* zip_name_locate.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_name_locate.mdoc; sourceTree = "<group>"; };
+               4B28AA0D15BACC3900D0C17D /* zip_open.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_open.mdoc; sourceTree = "<group>"; };
+               4B28AA0E15BACC3900D0C17D /* zip_rename.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_rename.mdoc; sourceTree = "<group>"; };
+               4B28AA0F15BACC3900D0C17D /* zip_set_archive_comment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_set_archive_comment.mdoc; sourceTree = "<group>"; };
+               4B28AA1015BACC3900D0C17D /* zip_set_archive_flag.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_set_archive_flag.mdoc; sourceTree = "<group>"; };
+               4B28AA1115BACC3900D0C17D /* zip_set_default_password.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_set_default_password.mdoc; sourceTree = "<group>"; };
+               4B28AA1215BACC3900D0C17D /* zip_set_file_comment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_set_file_comment.mdoc; sourceTree = "<group>"; };
+               4B28AA1315BACC3900D0C17D /* zip_set_file_compression.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_set_file_compression.mdoc; sourceTree = "<group>"; };
+               4B28AA1415BACC3900D0C17D /* zip_source_buffer.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_buffer.mdoc; sourceTree = "<group>"; };
+               4B28AA1515BACC3900D0C17D /* zip_source_file.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_file.mdoc; sourceTree = "<group>"; };
+               4B28AA1615BACC3900D0C17D /* zip_source_filep.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_filep.mdoc; sourceTree = "<group>"; };
+               4B28AA1715BACC3900D0C17D /* zip_source_free.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_free.mdoc; sourceTree = "<group>"; };
+               4B28AA1815BACC3900D0C17D /* zip_source_function.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_function.mdoc; sourceTree = "<group>"; };
+               4B28AA1915BACC3900D0C17D /* zip_source_zip.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_zip.mdoc; sourceTree = "<group>"; };
+               4B28AA1A15BACC3900D0C17D /* zip_stat_init.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_stat_init.mdoc; sourceTree = "<group>"; };
+               4B28AA1B15BACC3900D0C17D /* zip_stat.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_stat.mdoc; sourceTree = "<group>"; };
+               4B28AA1C15BACC3900D0C17D /* zip_unchange_all.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_unchange_all.mdoc; sourceTree = "<group>"; };
+               4B28AA1D15BACC3900D0C17D /* zip_unchange_archive.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_unchange_archive.mdoc; sourceTree = "<group>"; };
+               4B28AA1E15BACC3900D0C17D /* zip_unchange.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_unchange.mdoc; sourceTree = "<group>"; };
+               4B28AA1F15BACC3900D0C17D /* zipcmp.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zipcmp.mdoc; sourceTree = "<group>"; };
+               4B28AA2015BACC3900D0C17D /* zipmerge.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zipmerge.mdoc; sourceTree = "<group>"; };
+               4B28AA2115BACC3900D0C17D /* ziptorrent.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = ziptorrent.mdoc; sourceTree = "<group>"; };
+               4B28AA2215BAD4E200D0C17D /* API-CHANGES */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "API-CHANGES"; sourceTree = "<group>"; };
+               4B28AA2315BAD4E200D0C17D /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AUTHORS; sourceTree = "<group>"; };
+               4B28AA2415BAD4E200D0C17D /* NEWS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NEWS; sourceTree = "<group>"; };
+               4B28AA2515BAD4E200D0C17D /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
+               4B28AA2615BAD4E200D0C17D /* THANKS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = THANKS; sourceTree = "<group>"; };
+               4B28AA2715BAD4E200D0C17D /* TODO */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TODO; sourceTree = "<group>"; };
+               4B6B06E115F119AE008C2CBE /* compat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = compat.h; sourceTree = "<group>"; };
+               4B82CED319915F360097BC18 /* zip_file_set_mtime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_set_mtime.c; sourceTree = "<group>"; };
+               4B97204D188EBE85002FAFAD /* zip_file_get_external_attributes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_get_external_attributes.c; sourceTree = "<group>"; };
+               4B97204E188EBE85002FAFAD /* zip_file_set_external_attributes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_set_external_attributes.c; sourceTree = "<group>"; };
+               4BACD57715BC2AEF00920691 /* add_from_filep.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = add_from_filep.c; path = ../regress/add_from_filep.c; sourceTree = "<group>"; };
+               4BACD57A15BC2AEF00920691 /* fopen_unchanged.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fopen_unchanged.c; path = ../regress/fopen_unchanged.c; sourceTree = "<group>"; };
+               4BACD57B15BC2AEF00920691 /* fread.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fread.c; path = ../regress/fread.c; sourceTree = "<group>"; };
+               4BACD57C15BC2AEF00920691 /* modify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = modify.c; path = ../regress/modify.c; sourceTree = "<group>"; };
+               4BACD58415BC2AEF00920691 /* tryopen.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = tryopen.c; path = ../regress/tryopen.c; sourceTree = "<group>"; };
+               4BACD58915BC2CEA00920691 /* modify */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = modify; sourceTree = BUILT_PRODUCTS_DIR; };
+               4BACD5C115BC2DC900920691 /* add_from_filep */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = add_from_filep; sourceTree = BUILT_PRODUCTS_DIR; };
+               4BACD5D015BC2DF200920691 /* fopen_unchanged */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fopen_unchanged; sourceTree = BUILT_PRODUCTS_DIR; };
+               4BACD5DF15BC2F3700920691 /* fread */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fread; sourceTree = BUILT_PRODUCTS_DIR; };
+               4BACD65015BC301300920691 /* tryopen */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tryopen; sourceTree = BUILT_PRODUCTS_DIR; };
+               4BC3863E1A1BE00E00CDCAAC /* zip_get_error.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_error.mdoc; sourceTree = "<group>"; };
+               4BC3863F1A1BE00E00CDCAAC /* zip_source_begin_write.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_begin_write.mdoc; sourceTree = "<group>"; };
+               4BC386401A1BE00E00CDCAAC /* zip_source_close.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_close.mdoc; sourceTree = "<group>"; };
+               4BC386411A1BE00E00CDCAAC /* zip_source_commit_write.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_commit_write.mdoc; sourceTree = "<group>"; };
+               4BC386421A1BE00E00CDCAAC /* zip_source_error.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_error.mdoc; sourceTree = "<group>"; };
+               4BC386431A1BE00E00CDCAAC /* ZIP_SOURCE_GET_ARGS.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = ZIP_SOURCE_GET_ARGS.mdoc; sourceTree = "<group>"; };
+               4BC386441A1BE00E00CDCAAC /* zip_source_is_deleted.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_is_deleted.mdoc; sourceTree = "<group>"; };
+               4BC386451A1BE00E00CDCAAC /* zip_source_keep.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_keep.mdoc; sourceTree = "<group>"; };
+               4BC386461A1BE00E00CDCAAC /* zip_source_make_command_bitmap.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_make_command_bitmap.mdoc; sourceTree = "<group>"; };
+               4BC386471A1BE00E00CDCAAC /* zip_source_open.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_open.mdoc; sourceTree = "<group>"; };
+               4BC386481A1BE00E00CDCAAC /* zip_source_read.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_read.mdoc; sourceTree = "<group>"; };
+               4BC386491A1BE00E00CDCAAC /* zip_source_rollback_write.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_rollback_write.mdoc; sourceTree = "<group>"; };
+               4BC3864A1A1BE00E00CDCAAC /* zip_source_seek_write.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_seek_write.mdoc; sourceTree = "<group>"; };
+               4BC3864B1A1BE00E00CDCAAC /* zip_source_seek.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_seek.mdoc; sourceTree = "<group>"; };
+               4BC3864C1A1BE00E00CDCAAC /* zip_source_stat.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_stat.mdoc; sourceTree = "<group>"; };
+               4BC3864D1A1BE00E00CDCAAC /* zip_source_tell_write.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_tell_write.mdoc; sourceTree = "<group>"; };
+               4BC3864E1A1BE00E00CDCAAC /* zip_source_tell.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_tell.mdoc; sourceTree = "<group>"; };
+               4BC3864F1A1BE00E00CDCAAC /* zip_source_write.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_write.mdoc; sourceTree = "<group>"; };
+               4BC386501A1BE00E00CDCAAC /* zip_source.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source.mdoc; sourceTree = "<group>"; };
+               4BC386511A1BE04700CDCAAC /* fix-man-links.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "fix-man-links.sh"; sourceTree = "<group>"; };
+               4BC386521A1BE04700CDCAAC /* make_zip_errors.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = make_zip_errors.sh; sourceTree = "<group>"; };
+               4BC386531A1BE04700CDCAAC /* nih-man.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = "nih-man.css"; sourceTree = "<group>"; };
+               4BC972001A0A1D85003A2981 /* zip_error_to_data.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_to_data.mdoc; sourceTree = "<group>"; };
+               4BCB434119E9347E0067FAA3 /* zip_buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_buffer.c; sourceTree = "<group>"; };
+               4BCD54C41AB05AA90003D379 /* zip_source_win32a.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zip_source_win32a.c; sourceTree = "<group>"; };
+               4BCD54C61AB05AA90003D379 /* zip_source_win32utf8.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zip_source_win32utf8.c; sourceTree = "<group>"; };
+               4BCD54C71AB05AA90003D379 /* zip_source_win32w.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zip_source_win32w.c; sourceTree = "<group>"; };
+               4BCD54C81AB05AA90003D379 /* zipwin32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = zipwin32.h; sourceTree = "<group>"; };
+               4BCD77A71A14E404001A9F55 /* zip_file_get_error.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_get_error.mdoc; sourceTree = "<group>"; };
+               4BCD77A81A14E921001A9F55 /* zip_source_seek_compute_offset.mdoc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = zip_source_seek_compute_offset.mdoc; sourceTree = "<group>"; };
+               4BCD77A91A14ED5C001A9F55 /* CMakeLists.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+               4BCF3019199A2F820064207B /* zip_io_util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_io_util.c; sourceTree = "<group>"; };
+               4BCF301A199A2F820064207B /* zip_source_begin_write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_begin_write.c; sourceTree = "<group>"; };
+               4BCF301B199A2F820064207B /* zip_source_commit_write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_commit_write.c; sourceTree = "<group>"; };
+               4BCF301C199A2F820064207B /* zip_source_rollback_write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_rollback_write.c; sourceTree = "<group>"; };
+               4BCF301D199A2F820064207B /* zip_source_seek.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_seek.c; sourceTree = "<group>"; };
+               4BCF301E199A2F820064207B /* zip_source_supports.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_supports.c; sourceTree = "<group>"; };
+               4BCF301F199A2F820064207B /* zip_source_tell.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_tell.c; sourceTree = "<group>"; };
+               4BCF3020199A2F820064207B /* zip_source_write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_write.c; sourceTree = "<group>"; };
+               4BCF3031199ABD3A0064207B /* zip_source_remove.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_remove.c; sourceTree = "<group>"; };
+               4BCF3034199ABDDA0064207B /* zip_source_seek_write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_seek_write.c; sourceTree = "<group>"; };
+               4BCF3035199ABDDA0064207B /* zip_source_tell_write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_tell_write.c; sourceTree = "<group>"; };
+               4BD155CE191CD28D0046F012 /* NiHTest.pm */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = text.script.perl; path = NiHTest.pm; sourceTree = "<group>"; tabWidth = 4; usesTabs = 1; };
+               4BD155CF191CD28D0046F012 /* runtest.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = runtest.in; sourceTree = "<group>"; };
+               4BD35E411A33366200256CB7 /* add_dir.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_dir.test; sourceTree = "<group>"; };
+               4BD35E421A33366200256CB7 /* add_from_buffer.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_buffer.test; sourceTree = "<group>"; };
+               4BD35E431A33366200256CB7 /* add_from_file_duplicate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_file_duplicate.test; sourceTree = "<group>"; };
+               4BD35E441A33366200256CB7 /* add_from_file_twice_duplicate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_file_twice_duplicate.test; sourceTree = "<group>"; };
+               4BD35E451A33366200256CB7 /* add_from_file.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_file.test; sourceTree = "<group>"; };
+               4BD35E461A33366200256CB7 /* add_from_filep.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_filep.test; sourceTree = "<group>"; };
+               4BD35E471A33366200256CB7 /* add_from_stdin.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_stdin.test; sourceTree = "<group>"; };
+               4BD35E481A33366200256CB7 /* add_from_zip_closed.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_zip_closed.test; sourceTree = "<group>"; };
+               4BD35E491A33366200256CB7 /* add_from_zip_deflated.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_zip_deflated.test; sourceTree = "<group>"; };
+               4BD35E4A1A33366200256CB7 /* add_from_zip_partial_deflated.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_zip_partial_deflated.test; sourceTree = "<group>"; };
+               4BD35E4B1A33366200256CB7 /* add_from_zip_partial_stored.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_zip_partial_stored.test; sourceTree = "<group>"; };
+               4BD35E4C1A33366200256CB7 /* add_from_zip_stored.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_zip_stored.test; sourceTree = "<group>"; };
+               4BD35E4D1A33366200256CB7 /* add_from_zip.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_zip.test; sourceTree = "<group>"; };
+               4BD35E4E1A33366200256CB7 /* add_stored_in_memory.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_stored_in_memory.test; sourceTree = "<group>"; };
+               4BD35E4F1A33366200256CB7 /* add_stored.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_stored.test; sourceTree = "<group>"; };
+               4BD35E501A33366200256CB7 /* cm-default.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "cm-default.test"; sourceTree = "<group>"; };
+               4BD35E511A33366200256CB7 /* delete_add_same.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = delete_add_same.test; sourceTree = "<group>"; };
+               4BD35E521A33366200256CB7 /* delete_invalid.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = delete_invalid.test; sourceTree = "<group>"; };
+               4BD35E531A33366200256CB7 /* delete_last.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = delete_last.test; sourceTree = "<group>"; };
+               4BD35E541A33366200256CB7 /* delete_multiple_last.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = delete_multiple_last.test; sourceTree = "<group>"; };
+               4BD35E551A33366200256CB7 /* delete_multiple_partial.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = delete_multiple_partial.test; sourceTree = "<group>"; };
+               4BD35E561A33366200256CB7 /* delete_renamed_rename.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = delete_renamed_rename.test; sourceTree = "<group>"; };
+               4BD35E5B1A33366200256CB7 /* encrypt.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = encrypt.test; sourceTree = "<group>"; };
+               4BD35E5C1A33366200256CB7 /* extra_add_multiple.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_add_multiple.test; sourceTree = "<group>"; };
+               4BD35E5D1A33366200256CB7 /* extra_add.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_add.test; sourceTree = "<group>"; };
+               4BD35E5E1A33366200256CB7 /* extra_count_by_id.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_count_by_id.test; sourceTree = "<group>"; };
+               4BD35E5F1A33366200256CB7 /* extra_count_ignore_zip64.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_count_ignore_zip64.test; sourceTree = "<group>"; };
+               4BD35E601A33366200256CB7 /* extra_count.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_count.test; sourceTree = "<group>"; };
+               4BD35E611A33366200256CB7 /* extra_delete_by_id.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_delete_by_id.test; sourceTree = "<group>"; };
+               4BD35E621A33366200256CB7 /* extra_delete.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_delete.test; sourceTree = "<group>"; };
+               4BD35E631A33366200256CB7 /* extra_get_by_id.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_get_by_id.test; sourceTree = "<group>"; };
+               4BD35E641A33366200256CB7 /* extra_get.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_get.test; sourceTree = "<group>"; };
+               4BD35E651A33366200256CB7 /* extra_set_modify_c.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_set_modify_c.test; sourceTree = "<group>"; };
+               4BD35E661A33366200256CB7 /* extra_set_modify_l.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_set_modify_l.test; sourceTree = "<group>"; };
+               4BD35E671A33366200256CB7 /* extra_set.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_set.test; sourceTree = "<group>"; };
+               4BD35E681A33366200256CB7 /* file_comment_encmismatch.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = file_comment_encmismatch.test; sourceTree = "<group>"; };
+               4BD35E691A33366200256CB7 /* fopen_unchanged.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fopen_unchanged.test; sourceTree = "<group>"; };
+               4BD35E6A1A33366200256CB7 /* fread.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fread.test; sourceTree = "<group>"; };
+               4BD35E6B1A33366200256CB7 /* get_comment.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = get_comment.test; sourceTree = "<group>"; };
+               4BD35E8E1A33366200256CB7 /* name_locate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = name_locate.test; sourceTree = "<group>"; };
+               4BD35E8F1A33366200256CB7 /* open_cons_extrabytes.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_cons_extrabytes.test; sourceTree = "<group>"; };
+               4BD35E901A33366200256CB7 /* open_empty_2.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_empty_2.test; sourceTree = "<group>"; };
+               4BD35E911A33366200256CB7 /* open_empty.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_empty.test; sourceTree = "<group>"; };
+               4BD35E921A33366200256CB7 /* open_extrabytes.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_extrabytes.test; sourceTree = "<group>"; };
+               4BD35E931A33366200256CB7 /* open_filename_duplicate_consistency.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_filename_duplicate_consistency.test; sourceTree = "<group>"; };
+               4BD35E941A33366200256CB7 /* open_filename_duplicate_empty_consistency.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_filename_duplicate_empty_consistency.test; sourceTree = "<group>"; };
+               4BD35E951A33366200256CB7 /* open_filename_duplicate_empty.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_filename_duplicate_empty.test; sourceTree = "<group>"; };
+               4BD35E961A33366200256CB7 /* open_filename_duplicate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_filename_duplicate.test; sourceTree = "<group>"; };
+               4BD35E971A33366200256CB7 /* open_filename_empty.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_filename_empty.test; sourceTree = "<group>"; };
+               4BD35E981A33366200256CB7 /* open_incons.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_incons.test; sourceTree = "<group>"; };
+               4BD35E991A33366200256CB7 /* open_many_ok.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_many_ok.test; sourceTree = "<group>"; };
+               4BD35E9A1A33366200256CB7 /* open_new_but_exists.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_new_but_exists.test; sourceTree = "<group>"; };
+               4BD35E9B1A33366200256CB7 /* open_new_ok.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_new_ok.test; sourceTree = "<group>"; };
+               4BD35E9C1A33366200256CB7 /* open_nonarchive.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_nonarchive.test; sourceTree = "<group>"; };
+               4BD35E9D1A33366200256CB7 /* open_nosuchfile.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_nosuchfile.test; sourceTree = "<group>"; };
+               4BD35E9E1A33366200256CB7 /* open_ok.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_ok.test; sourceTree = "<group>"; };
+               4BD35E9F1A33366200256CB7 /* open_too_short.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_too_short.test; sourceTree = "<group>"; };
+               4BD35EA01A33366200256CB7 /* open_truncate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_truncate.test; sourceTree = "<group>"; };
+               4BD35EA11A33366200256CB7 /* open_zip64_ok.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_zip64_ok.test; sourceTree = "<group>"; };
+               4BD35EA21A33366200256CB7 /* rename_ascii.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_ascii.test; sourceTree = "<group>"; };
+               4BD35EA31A33366200256CB7 /* rename_cp437.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_cp437.test; sourceTree = "<group>"; };
+               4BD35EA41A33366200256CB7 /* rename_deleted.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_deleted.test; sourceTree = "<group>"; };
+               4BD35EA51A33366200256CB7 /* rename_fail.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_fail.test; sourceTree = "<group>"; };
+               4BD35EA61A33366200256CB7 /* rename_ok.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_ok.test; sourceTree = "<group>"; };
+               4BD35EA81A33366200256CB7 /* rename_utf8_encmismatch.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_utf8_encmismatch.test; sourceTree = "<group>"; };
+               4BD35EA91A33366200256CB7 /* rename_utf8.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_utf8.test; sourceTree = "<group>"; };
+               4BD35EAA1A33366200256CB7 /* set_comment_all.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_comment_all.test; sourceTree = "<group>"; };
+               4BD35EAB1A33366200256CB7 /* set_comment_localonly.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_comment_localonly.test; sourceTree = "<group>"; };
+               4BD35EAC1A33366200256CB7 /* set_comment_removeglobal.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_comment_removeglobal.test; sourceTree = "<group>"; };
+               4BD35EAD1A33366200256CB7 /* set_comment_revert.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_comment_revert.test; sourceTree = "<group>"; };
+               4BD35EAE1A33366200256CB7 /* set_compression_deflate_to_deflate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_deflate_to_deflate.test; sourceTree = "<group>"; };
+               4BD35EAF1A33366200256CB7 /* set_compression_deflate_to_store.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_deflate_to_store.test; sourceTree = "<group>"; };
+               4BD35EB01A33366200256CB7 /* set_compression_store_to_deflate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_store_to_deflate.test; sourceTree = "<group>"; };
+               4BD35EB11A33366200256CB7 /* set_compression_store_to_store.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_store_to_store.test; sourceTree = "<group>"; };
+               4BD35EB21A33366200256CB7 /* set_compression_unknown.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_unknown.test; sourceTree = "<group>"; };
+               4BD35EB31A33366200256CB7 /* set_mtime.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_mtime.test; sourceTree = "<group>"; };
+               4BD35EB41A33366200256CB7 /* stat_index_cp437_guess.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_cp437_guess.test; sourceTree = "<group>"; };
+               4BD35EB51A33366200256CB7 /* stat_index_cp437_raw.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_cp437_raw.test; sourceTree = "<group>"; };
+               4BD35EB61A33366200256CB7 /* stat_index_cp437_strict.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_cp437_strict.test; sourceTree = "<group>"; };
+               4BD35EB71A33366200256CB7 /* stat_index_fileorder.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_fileorder.test; sourceTree = "<group>"; };
+               4BD35EB81A33366200256CB7 /* stat_index_streamed_zip64.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_streamed_zip64.test; sourceTree = "<group>"; };
+               4BD35EB91A33366200256CB7 /* stat_index_streamed.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_streamed.test; sourceTree = "<group>"; };
+               4BD35EBA1A33366200256CB7 /* stat_index_utf8_guess.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_utf8_guess.test; sourceTree = "<group>"; };
+               4BD35EBB1A33366200256CB7 /* stat_index_utf8_raw.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_utf8_raw.test; sourceTree = "<group>"; };
+               4BD35EBC1A33366200256CB7 /* stat_index_utf8_strict.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_utf8_strict.test; sourceTree = "<group>"; };
+               4BD35EBD1A33366200256CB7 /* stat_index_utf8_unmarked_strict.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_utf8_unmarked_strict.test; sourceTree = "<group>"; };
+               4BD35EBE1A33366200256CB7 /* stat_index_zip64.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_zip64.test; sourceTree = "<group>"; };
+               4BD35EDD1A33366300256CB7 /* torrent-already.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "torrent-already.test"; sourceTree = "<group>"; };
+               4BD35EDE1A33366300256CB7 /* torrent-new.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "torrent-new.test"; sourceTree = "<group>"; };
+               4BD35EE11A33366300256CB7 /* utf-8-standardization.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "utf-8-standardization.test"; sourceTree = "<group>"; };
+               4BD35EE31A33366300256CB7 /* zip64_creation.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = zip64_creation.test; sourceTree = "<group>"; };
+               4BD35EE41A33366300256CB7 /* zip64_stored_creation.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = zip64_stored_creation.test; sourceTree = "<group>"; };
+               4BD35EE61A33407200256CB7 /* Makefile.am */ = {isa = PBXFileReference; indentWidth = 8; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; usesTabs = 1; };
+               4BD5053219A0116D007DD28A /* zip_source_call.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_call.c; sourceTree = "<group>"; };
+               4BD6CB5C19E6A5D900710654 /* source_hole.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = source_hole.c; sourceTree = "<group>"; };
+               4BD6CB5E19E71B3B00710654 /* hole.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = hole.c; sourceTree = "<group>"; };
+               4BD6CB6C19E71CD100710654 /* hole */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = hole; sourceTree = BUILT_PRODUCTS_DIR; };
+               4BDC71E015B182B200236D3C /* libzip_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = libzip_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               4BDC71F115B1B25E00236D3C /* zip_add_dir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_add_dir.c; path = ../lib/zip_add_dir.c; sourceTree = "<group>"; };
+               4BDC71F215B1B25E00236D3C /* zip_add_entry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_add_entry.c; path = ../lib/zip_add_entry.c; sourceTree = "<group>"; };
+               4BDC71F315B1B25E00236D3C /* zip_add.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_add.c; path = ../lib/zip_add.c; sourceTree = "<group>"; };
+               4BDC71F415B1B25E00236D3C /* zip_close.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_close.c; path = ../lib/zip_close.c; sourceTree = "<group>"; };
+               4BDC71F515B1B25E00236D3C /* zip_delete.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_delete.c; path = ../lib/zip_delete.c; sourceTree = "<group>"; };
+               4BDC71F615B1B25E00236D3C /* zip_dir_add.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_dir_add.c; path = ../lib/zip_dir_add.c; sourceTree = "<group>"; };
+               4BDC71F715B1B25E00236D3C /* zip_dirent.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_dirent.c; path = ../lib/zip_dirent.c; sourceTree = "<group>"; };
+               4BDC71F815B1B25E00236D3C /* zip_discard.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_discard.c; path = ../lib/zip_discard.c; sourceTree = "<group>"; };
+               4BDC71F915B1B25E00236D3C /* zip_entry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_entry.c; path = ../lib/zip_entry.c; sourceTree = "<group>"; };
+               4BDC71FA15B1B25E00236D3C /* zip_err_str.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_err_str.c; path = ../lib/zip_err_str.c; sourceTree = "<group>"; };
+               4BDC71FB15B1B25E00236D3C /* zip_error_clear.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_error_clear.c; path = ../lib/zip_error_clear.c; sourceTree = "<group>"; };
+               4BDC71FC15B1B25E00236D3C /* zip_error_get_sys_type.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_error_get_sys_type.c; path = ../lib/zip_error_get_sys_type.c; sourceTree = "<group>"; };
+               4BDC71FD15B1B25E00236D3C /* zip_error_get.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_error_get.c; path = ../lib/zip_error_get.c; sourceTree = "<group>"; };
+               4BDC71FE15B1B25E00236D3C /* zip_error_strerror.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_error_strerror.c; path = ../lib/zip_error_strerror.c; sourceTree = "<group>"; };
+               4BDC71FF15B1B25E00236D3C /* zip_error_to_str.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_error_to_str.c; path = ../lib/zip_error_to_str.c; sourceTree = "<group>"; };
+               4BDC720015B1B25E00236D3C /* zip_error.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_error.c; path = ../lib/zip_error.c; sourceTree = "<group>"; };
+               4BDC720115B1B25E00236D3C /* zip_extra_field_api.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_extra_field_api.c; path = ../lib/zip_extra_field_api.c; sourceTree = "<group>"; };
+               4BDC720215B1B25E00236D3C /* zip_extra_field.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_extra_field.c; path = ../lib/zip_extra_field.c; sourceTree = "<group>"; };
+               4BDC720315B1B25E00236D3C /* zip_fclose.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fclose.c; path = ../lib/zip_fclose.c; sourceTree = "<group>"; };
+               4BDC720415B1B25E00236D3C /* zip_fdopen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fdopen.c; path = ../lib/zip_fdopen.c; sourceTree = "<group>"; };
+               4BDC720515B1B25E00236D3C /* zip_file_add.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_add.c; path = ../lib/zip_file_add.c; sourceTree = "<group>"; };
+               4BDC720615B1B25E00236D3C /* zip_file_error_clear.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_error_clear.c; path = ../lib/zip_file_error_clear.c; sourceTree = "<group>"; };
+               4BDC720715B1B25E00236D3C /* zip_file_error_get.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_error_get.c; path = ../lib/zip_file_error_get.c; sourceTree = "<group>"; };
+               4BDC720815B1B25E00236D3C /* zip_file_get_comment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_get_comment.c; path = ../lib/zip_file_get_comment.c; sourceTree = "<group>"; };
+               4BDC720915B1B25E00236D3C /* zip_file_get_offset.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_get_offset.c; path = ../lib/zip_file_get_offset.c; sourceTree = "<group>"; };
+               4BDC720A15B1B25E00236D3C /* zip_file_rename.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_rename.c; path = ../lib/zip_file_rename.c; sourceTree = "<group>"; };
+               4BDC720B15B1B25E00236D3C /* zip_file_replace.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_replace.c; path = ../lib/zip_file_replace.c; sourceTree = "<group>"; };
+               4BDC720C15B1B25E00236D3C /* zip_file_set_comment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_set_comment.c; path = ../lib/zip_file_set_comment.c; sourceTree = "<group>"; };
+               4BDC720D15B1B25E00236D3C /* zip_file_strerror.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_strerror.c; path = ../lib/zip_file_strerror.c; sourceTree = "<group>"; };
+               4BDC720E15B1B25E00236D3C /* zip_filerange_crc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_filerange_crc.c; path = ../lib/zip_filerange_crc.c; sourceTree = "<group>"; };
+               4BDC720F15B1B25E00236D3C /* zip_fopen_encrypted.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fopen_encrypted.c; path = ../lib/zip_fopen_encrypted.c; sourceTree = "<group>"; };
+               4BDC721015B1B25E00236D3C /* zip_fopen_index_encrypted.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fopen_index_encrypted.c; path = ../lib/zip_fopen_index_encrypted.c; sourceTree = "<group>"; };
+               4BDC721115B1B25E00236D3C /* zip_fopen_index.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fopen_index.c; path = ../lib/zip_fopen_index.c; sourceTree = "<group>"; };
+               4BDC721215B1B25E00236D3C /* zip_fopen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fopen.c; path = ../lib/zip_fopen.c; sourceTree = "<group>"; };
+               4BDC721315B1B25E00236D3C /* zip_fread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fread.c; path = ../lib/zip_fread.c; sourceTree = "<group>"; };
+               4BDC721415B1B25E00236D3C /* zip_get_archive_comment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_archive_comment.c; path = ../lib/zip_get_archive_comment.c; sourceTree = "<group>"; };
+               4BDC721515B1B25E00236D3C /* zip_get_archive_flag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_archive_flag.c; path = ../lib/zip_get_archive_flag.c; sourceTree = "<group>"; };
+               4BDC721615B1B25E00236D3C /* zip_get_compression_implementation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_compression_implementation.c; path = ../lib/zip_get_compression_implementation.c; sourceTree = "<group>"; };
+               4BDC721715B1B25E00236D3C /* zip_get_encryption_implementation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_encryption_implementation.c; path = ../lib/zip_get_encryption_implementation.c; sourceTree = "<group>"; };
+               4BDC721815B1B25E00236D3C /* zip_get_file_comment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_file_comment.c; path = ../lib/zip_get_file_comment.c; sourceTree = "<group>"; };
+               4BDC721915B1B25E00236D3C /* zip_get_name.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_name.c; path = ../lib/zip_get_name.c; sourceTree = "<group>"; };
+               4BDC721A15B1B25E00236D3C /* zip_get_num_entries.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_num_entries.c; path = ../lib/zip_get_num_entries.c; sourceTree = "<group>"; };
+               4BDC721B15B1B25E00236D3C /* zip_get_num_files.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_num_files.c; path = ../lib/zip_get_num_files.c; sourceTree = "<group>"; };
+               4BDC721C15B1B25E00236D3C /* zip_memdup.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_memdup.c; path = ../lib/zip_memdup.c; sourceTree = "<group>"; };
+               4BDC721D15B1B25E00236D3C /* zip_name_locate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_name_locate.c; path = ../lib/zip_name_locate.c; sourceTree = "<group>"; };
+               4BDC721E15B1B25E00236D3C /* zip_new.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_new.c; path = ../lib/zip_new.c; sourceTree = "<group>"; };
+               4BDC721F15B1B25E00236D3C /* zip_open.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_open.c; path = ../lib/zip_open.c; sourceTree = "<group>"; };
+               4BDC722015B1B25E00236D3C /* zip_rename.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_rename.c; path = ../lib/zip_rename.c; sourceTree = "<group>"; };
+               4BDC722115B1B25E00236D3C /* zip_replace.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_replace.c; path = ../lib/zip_replace.c; sourceTree = "<group>"; };
+               4BDC722215B1B25E00236D3C /* zip_set_archive_comment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_set_archive_comment.c; path = ../lib/zip_set_archive_comment.c; sourceTree = "<group>"; };
+               4BDC722315B1B25E00236D3C /* zip_set_archive_flag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_set_archive_flag.c; path = ../lib/zip_set_archive_flag.c; sourceTree = "<group>"; };
+               4BDC722415B1B25E00236D3C /* zip_set_default_password.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_set_default_password.c; path = ../lib/zip_set_default_password.c; sourceTree = "<group>"; };
+               4BDC722515B1B25E00236D3C /* zip_set_file_comment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_set_file_comment.c; path = ../lib/zip_set_file_comment.c; sourceTree = "<group>"; };
+               4BDC722615B1B25E00236D3C /* zip_set_file_compression.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_set_file_compression.c; path = ../lib/zip_set_file_compression.c; sourceTree = "<group>"; };
+               4BDC722715B1B25E00236D3C /* zip_set_name.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_set_name.c; path = ../lib/zip_set_name.c; sourceTree = "<group>"; };
+               4BDC722815B1B25E00236D3C /* zip_source_buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_buffer.c; path = ../lib/zip_source_buffer.c; sourceTree = "<group>"; };
+               4BDC722915B1B25E00236D3C /* zip_source_close.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_close.c; path = ../lib/zip_source_close.c; sourceTree = "<group>"; };
+               4BDC722A15B1B25E00236D3C /* zip_source_crc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_crc.c; path = ../lib/zip_source_crc.c; sourceTree = "<group>"; };
+               4BDC722B15B1B25E00236D3C /* zip_source_deflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_deflate.c; path = ../lib/zip_source_deflate.c; sourceTree = "<group>"; };
+               4BDC722C15B1B25E00236D3C /* zip_source_error.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_error.c; path = ../lib/zip_source_error.c; sourceTree = "<group>"; };
+               4BDC722D15B1B25E00236D3C /* zip_source_file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_file.c; path = ../lib/zip_source_file.c; sourceTree = "<group>"; };
+               4BDC722E15B1B25E00236D3C /* zip_source_filep.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_filep.c; path = ../lib/zip_source_filep.c; sourceTree = "<group>"; };
+               4BDC722F15B1B25E00236D3C /* zip_source_free.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_free.c; path = ../lib/zip_source_free.c; sourceTree = "<group>"; };
+               4BDC723015B1B25E00236D3C /* zip_source_function.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_function.c; path = ../lib/zip_source_function.c; sourceTree = "<group>"; };
+               4BDC723115B1B25E00236D3C /* zip_source_layered.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_layered.c; path = ../lib/zip_source_layered.c; sourceTree = "<group>"; };
+               4BDC723215B1B25E00236D3C /* zip_source_open.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_open.c; path = ../lib/zip_source_open.c; sourceTree = "<group>"; };
+               4BDC723315B1B25E00236D3C /* zip_source_pkware.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_pkware.c; path = ../lib/zip_source_pkware.c; sourceTree = "<group>"; };
+               4BDC723515B1B25E00236D3C /* zip_source_read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_read.c; path = ../lib/zip_source_read.c; sourceTree = "<group>"; };
+               4BDC723615B1B25E00236D3C /* zip_source_stat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_stat.c; path = ../lib/zip_source_stat.c; sourceTree = "<group>"; };
+               4BDC723715B1B25E00236D3C /* zip_source_window.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_window.c; path = ../lib/zip_source_window.c; sourceTree = "<group>"; };
+               4BDC723815B1B25E00236D3C /* zip_source_zip_new.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_zip_new.c; path = ../lib/zip_source_zip_new.c; sourceTree = "<group>"; };
+               4BDC723915B1B25E00236D3C /* zip_source_zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_zip.c; path = ../lib/zip_source_zip.c; sourceTree = "<group>"; };
+               4BDC723A15B1B25E00236D3C /* zip_stat_index.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_stat_index.c; path = ../lib/zip_stat_index.c; sourceTree = "<group>"; };
+               4BDC723B15B1B25E00236D3C /* zip_stat_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_stat_init.c; path = ../lib/zip_stat_init.c; sourceTree = "<group>"; };
+               4BDC723C15B1B25E00236D3C /* zip_stat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_stat.c; path = ../lib/zip_stat.c; sourceTree = "<group>"; };
+               4BDC723D15B1B25E00236D3C /* zip_strerror.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_strerror.c; path = ../lib/zip_strerror.c; sourceTree = "<group>"; };
+               4BDC723E15B1B25E00236D3C /* zip_string.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_string.c; path = ../lib/zip_string.c; sourceTree = "<group>"; };
+               4BDC723F15B1B25E00236D3C /* zip_unchange_all.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_unchange_all.c; path = ../lib/zip_unchange_all.c; sourceTree = "<group>"; };
+               4BDC724015B1B25E00236D3C /* zip_unchange_archive.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_unchange_archive.c; path = ../lib/zip_unchange_archive.c; sourceTree = "<group>"; };
+               4BDC724115B1B25E00236D3C /* zip_unchange_data.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_unchange_data.c; path = ../lib/zip_unchange_data.c; sourceTree = "<group>"; };
+               4BDC724215B1B25E00236D3C /* zip_unchange.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_unchange.c; path = ../lib/zip_unchange.c; sourceTree = "<group>"; };
+               4BDC724315B1B25E00236D3C /* zip_utf-8.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "zip_utf-8.c"; path = "../lib/zip_utf-8.c"; sourceTree = "<group>"; };
+               4BDC729815B1B2A600236D3C /* zip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zip.h; path = ../lib/zip.h; sourceTree = "<group>"; };
+               4BDC729915B1B2A600236D3C /* zipint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zipint.h; path = ../lib/zipint.h; sourceTree = "<group>"; };
+               4BDC729E15B1B4E900236D3C /* zipconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zipconf.h; sourceTree = SOURCE_ROOT; };
+               4BDC72A015B1B56400236D3C /* config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = SOURCE_ROOT; };
+               4BE402AC19D94AE400298248 /* zip_source_is_deleted.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_is_deleted.c; sourceTree = "<group>"; };
+               4BEF35C31AF4D92D00974F28 /* zip_source_win32handle.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_win32handle.c; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+               4B01D68715B2F3F1002D5007 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4B01D73C15B2F6AF002D5007 /* libz.dylib in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4B01D6FA15B2F4B1002D5007 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4B01D70915B2F4CF002D5007 /* libz.dylib in Frameworks */,
+                               4B01D70715B2F4C5002D5007 /* libzip.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4B01D70C15B2F4EB002D5007 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4B01D70D15B2F4EB002D5007 /* libz.dylib in Frameworks */,
+                               4B01D70E15B2F4EB002D5007 /* libzip.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD58615BC2CEA00920691 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BACD59415BC2D0800920691 /* libz.dylib in Frameworks */,
+                               4BACD59315BC2CFA00920691 /* libzip.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD5BA15BC2DC900920691 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BACD5BB15BC2DC900920691 /* libz.dylib in Frameworks */,
+                               4BACD5BC15BC2DC900920691 /* libzip.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD5C915BC2DF200920691 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BACD5CA15BC2DF200920691 /* libz.dylib in Frameworks */,
+                               4BACD5CB15BC2DF200920691 /* libzip.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD5D815BC2F3700920691 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BACD5D915BC2F3700920691 /* libz.dylib in Frameworks */,
+                               4BACD5DA15BC2F3700920691 /* libzip.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD64915BC301300920691 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BACD64A15BC301300920691 /* libz.dylib in Frameworks */,
+                               4BACD64B15BC301300920691 /* libzip.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BD6CB6519E71CD100710654 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BD6CB6619E71CD100710654 /* libz.dylib in Frameworks */,
+                               4BD6CB6719E71CD100710654 /* libzip.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BDC71DD15B182B200236D3C /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+               4B01D72015B2F54C002D5007 /* src */ = {
+                       isa = PBXGroup;
+                       children = (
+                               4B6B06E115F119AE008C2CBE /* compat.h */,
+                               4B01D72115B2F572002D5007 /* zipcmp.c */,
+                               4B01D72215B2F572002D5007 /* zipmerge.c */,
+                       );
+                       name = src;
+                       path = ../src;
+                       sourceTree = "<group>";
+               };
+               4B28A9EA15BACBE100D0C17D /* man */ = {
+                       isa = PBXGroup;
+                       children = (
+                               4BCD77A91A14ED5C001A9F55 /* CMakeLists.txt */,
+                               4B1ABD1B1A2E5E4D00C93867 /* handle_links */,
+                               4B1ABD1A1A2E5DA700C93867 /* links */,
+                               4B26FF141A07DF1A000E9788 /* Makefile.am */,
+                               4BC386511A1BE04700CDCAAC /* fix-man-links.sh */,
+                               4BC386521A1BE04700CDCAAC /* make_zip_errors.sh */,
+                               4B26FF181A07DFEA000E9788 /* mkdocset.pl */,
+                               4BC386531A1BE04700CDCAAC /* nih-man.css */,
+                               4B28A9EC15BACC3900D0C17D /* libzip.mdoc */,
+                               4B28A9ED15BACC3900D0C17D /* zip_add_dir.mdoc */,
+                               4B28A9EE15BACC3900D0C17D /* zip_add.mdoc */,
+                               4B28A9EF15BACC3900D0C17D /* zip_close.mdoc */,
+                               4B28A9F015BACC3900D0C17D /* zip_delete.mdoc */,
+                               4B28A9F115BACC3900D0C17D /* zip_dir_add.mdoc */,
+                               4B28A9F215BACC3900D0C17D /* zip_discard.mdoc */,
+                               4B28A9F315BACC3900D0C17D /* zip_error_clear.mdoc */,
+                               4B1E46E51A08CB7600A376D2 /* zip_error_code_system.mdoc */,
+                               4B1E46E61A08CB7600A376D2 /* zip_error_code_zip.mdoc */,
+                               4B1E46E71A08CB7600A376D2 /* zip_error_fini.mdoc */,
+                               4B28A9F415BACC3900D0C17D /* zip_error_get_sys_type.mdoc */,
+                               4B28A9F515BACC3900D0C17D /* zip_error_get.mdoc */,
+                               4B1E46E81A08CB7600A376D2 /* zip_error_init.mdoc */,
+                               4B1E46E91A08CB7600A376D2 /* zip_error_set.mdoc */,
+                               4B1E46EA1A08CB7600A376D2 /* zip_error_strerror.mdoc */,
+                               4B1E46EB1A08CB7600A376D2 /* zip_error_system_type.mdoc */,
+                               4BC972001A0A1D85003A2981 /* zip_error_to_data.mdoc */,
+                               4B28A9F615BACC3900D0C17D /* zip_error_to_str.mdoc */,
+                               4B28A9F715BACC3900D0C17D /* zip_errors.mdoc */,
+                               4B28A9F815BACC3900D0C17D /* zip_fclose.mdoc */,
+                               4B28A9F915BACC3900D0C17D /* zip_fdopen.mdoc */,
+                               4B28A9FA15BACC3900D0C17D /* zip_file_add.mdoc */,
+                               4B28A9FB15BACC3900D0C17D /* zip_file_extra_field_delete.mdoc */,
+                               4B28A9FC15BACC3900D0C17D /* zip_file_extra_field_get.mdoc */,
+                               4B28A9FD15BACC3900D0C17D /* zip_file_extra_field_set.mdoc */,
+                               4B28A9FE15BACC3900D0C17D /* zip_file_extra_fields_count.mdoc */,
+                               4B28A9FF15BACC3900D0C17D /* zip_file_get_comment.mdoc */,
+                               4BCD77A71A14E404001A9F55 /* zip_file_get_error.mdoc */,
+                               4B26FF151A07DF1A000E9788 /* zip_file_get_external_attributes.mdoc */,
+                               4B28AA0015BACC3900D0C17D /* zip_file_rename.mdoc */,
+                               4B28AA0115BACC3900D0C17D /* zip_file_set_comment.mdoc */,
+                               4B26FF161A07DF1A000E9788 /* zip_file_set_external_attributes.mdoc */,
+                               4B26FF171A07DF1A000E9788 /* zip_file_set_mtime.mdoc */,
+                               4B28AA0215BACC3900D0C17D /* zip_file_strerror.mdoc */,
+                               4B28AA0315BACC3900D0C17D /* zip_fopen_encrypted.mdoc */,
+                               4B28AA0415BACC3900D0C17D /* zip_fopen.mdoc */,
+                               4B28AA0515BACC3900D0C17D /* zip_fread.mdoc */,
+                               4B28AA0615BACC3900D0C17D /* zip_get_archive_comment.mdoc */,
+                               4B28AA0715BACC3900D0C17D /* zip_get_archive_flag.mdoc */,
+                               4BC3863E1A1BE00E00CDCAAC /* zip_get_error.mdoc */,
+                               4B28AA0815BACC3900D0C17D /* zip_get_file_comment.mdoc */,
+                               4B28AA0915BACC3900D0C17D /* zip_get_name.mdoc */,
+                               4B28AA0A15BACC3900D0C17D /* zip_get_num_entries.mdoc */,
+                               4B28AA0B15BACC3900D0C17D /* zip_get_num_files.mdoc */,
+                               4B28AA0C15BACC3900D0C17D /* zip_name_locate.mdoc */,
+                               4B28AA0D15BACC3900D0C17D /* zip_open.mdoc */,
+                               4B28AA0E15BACC3900D0C17D /* zip_rename.mdoc */,
+                               4B28AA0F15BACC3900D0C17D /* zip_set_archive_comment.mdoc */,
+                               4B28AA1015BACC3900D0C17D /* zip_set_archive_flag.mdoc */,
+                               4B28AA1115BACC3900D0C17D /* zip_set_default_password.mdoc */,
+                               4B28AA1215BACC3900D0C17D /* zip_set_file_comment.mdoc */,
+                               4B28AA1315BACC3900D0C17D /* zip_set_file_compression.mdoc */,
+                               4BC3863F1A1BE00E00CDCAAC /* zip_source_begin_write.mdoc */,
+                               4B28AA1415BACC3900D0C17D /* zip_source_buffer.mdoc */,
+                               4BC386401A1BE00E00CDCAAC /* zip_source_close.mdoc */,
+                               4BC386411A1BE00E00CDCAAC /* zip_source_commit_write.mdoc */,
+                               4BC386421A1BE00E00CDCAAC /* zip_source_error.mdoc */,
+                               4B28AA1515BACC3900D0C17D /* zip_source_file.mdoc */,
+                               4B28AA1615BACC3900D0C17D /* zip_source_filep.mdoc */,
+                               4B28AA1715BACC3900D0C17D /* zip_source_free.mdoc */,
+                               4B28AA1815BACC3900D0C17D /* zip_source_function.mdoc */,
+                               4BC386431A1BE00E00CDCAAC /* ZIP_SOURCE_GET_ARGS.mdoc */,
+                               4BC386441A1BE00E00CDCAAC /* zip_source_is_deleted.mdoc */,
+                               4BC386451A1BE00E00CDCAAC /* zip_source_keep.mdoc */,
+                               4BC386461A1BE00E00CDCAAC /* zip_source_make_command_bitmap.mdoc */,
+                               4BC386471A1BE00E00CDCAAC /* zip_source_open.mdoc */,
+                               4BC386481A1BE00E00CDCAAC /* zip_source_read.mdoc */,
+                               4BC386491A1BE00E00CDCAAC /* zip_source_rollback_write.mdoc */,
+                               4BCD77A81A14E921001A9F55 /* zip_source_seek_compute_offset.mdoc */,
+                               4BC3864A1A1BE00E00CDCAAC /* zip_source_seek_write.mdoc */,
+                               4BC3864B1A1BE00E00CDCAAC /* zip_source_seek.mdoc */,
+                               4BC3864C1A1BE00E00CDCAAC /* zip_source_stat.mdoc */,
+                               4BC3864D1A1BE00E00CDCAAC /* zip_source_tell_write.mdoc */,
+                               4BC3864E1A1BE00E00CDCAAC /* zip_source_tell.mdoc */,
+                               4BC3864F1A1BE00E00CDCAAC /* zip_source_write.mdoc */,
+                               4B28AA1915BACC3900D0C17D /* zip_source_zip.mdoc */,
+                               4BC386501A1BE00E00CDCAAC /* zip_source.mdoc */,
+                               4B28AA1A15BACC3900D0C17D /* zip_stat_init.mdoc */,
+                               4B28AA1B15BACC3900D0C17D /* zip_stat.mdoc */,
+                               4B28AA1C15BACC3900D0C17D /* zip_unchange_all.mdoc */,
+                               4B28AA1D15BACC3900D0C17D /* zip_unchange_archive.mdoc */,
+                               4B28AA1E15BACC3900D0C17D /* zip_unchange.mdoc */,
+                               4B28AA1F15BACC3900D0C17D /* zipcmp.mdoc */,
+                               4B28AA2015BACC3900D0C17D /* zipmerge.mdoc */,
+                               4B28AA2115BACC3900D0C17D /* ziptorrent.mdoc */,
+                       );
+                       name = man;
+                       path = ../man;
+                       sourceTree = "<group>";
+               };
+               4B28AA2815BAD4F800D0C17D /* info */ = {
+                       isa = PBXGroup;
+                       children = (
+                               4B28AA2215BAD4E200D0C17D /* API-CHANGES */,
+                               4B28AA2315BAD4E200D0C17D /* AUTHORS */,
+                               4B28AA2415BAD4E200D0C17D /* NEWS */,
+                               4B28AA2515BAD4E200D0C17D /* README */,
+                               4B28AA2615BAD4E200D0C17D /* THANKS */,
+                               4B28AA2715BAD4E200D0C17D /* TODO */,
+                       );
+                       name = info;
+                       path = ..;
+                       sourceTree = "<group>";
+               };
+               4BACD57415BC2AA100920691 /* regress */ = {
+                       isa = PBXGroup;
+                       children = (
+                               4BD35EE61A33407200256CB7 /* Makefile.am */,
+                               4BD155CE191CD28D0046F012 /* NiHTest.pm */,
+                               4BD155CF191CD28D0046F012 /* runtest.in */,
+                               4BACD57715BC2AEF00920691 /* add_from_filep.c */,
+                               4BACD57A15BC2AEF00920691 /* fopen_unchanged.c */,
+                               4BACD57B15BC2AEF00920691 /* fread.c */,
+                               4BD6CB5E19E71B3B00710654 /* hole.c */,
+                               4BACD57C15BC2AEF00920691 /* modify.c */,
+                               4BD6CB5C19E6A5D900710654 /* source_hole.c */,
+                               4BACD58415BC2AEF00920691 /* tryopen.c */,
+                               4BD35E401A33362A00256CB7 /* test cases */,
+                       );
+                       name = regress;
+                       path = ../regress;
+                       sourceTree = "<group>";
+               };
+               4BD35E401A33362A00256CB7 /* test cases */ = {
+                       isa = PBXGroup;
+                       children = (
+                               4BD35E411A33366200256CB7 /* add_dir.test */,
+                               4BD35E421A33366200256CB7 /* add_from_buffer.test */,
+                               4BD35E431A33366200256CB7 /* add_from_file_duplicate.test */,
+                               4BD35E441A33366200256CB7 /* add_from_file_twice_duplicate.test */,
+                               4BD35E451A33366200256CB7 /* add_from_file.test */,
+                               4BD35E461A33366200256CB7 /* add_from_filep.test */,
+                               4BD35E471A33366200256CB7 /* add_from_stdin.test */,
+                               4BD35E481A33366200256CB7 /* add_from_zip_closed.test */,
+                               4BD35E491A33366200256CB7 /* add_from_zip_deflated.test */,
+                               4BD35E4A1A33366200256CB7 /* add_from_zip_partial_deflated.test */,
+                               4BD35E4B1A33366200256CB7 /* add_from_zip_partial_stored.test */,
+                               4BD35E4C1A33366200256CB7 /* add_from_zip_stored.test */,
+                               4BD35E4D1A33366200256CB7 /* add_from_zip.test */,
+                               4BD35E4E1A33366200256CB7 /* add_stored_in_memory.test */,
+                               4BD35E4F1A33366200256CB7 /* add_stored.test */,
+                               4BD35E501A33366200256CB7 /* cm-default.test */,
+                               4BD35E511A33366200256CB7 /* delete_add_same.test */,
+                               4BD35E521A33366200256CB7 /* delete_invalid.test */,
+                               4BD35E531A33366200256CB7 /* delete_last.test */,
+                               4BD35E541A33366200256CB7 /* delete_multiple_last.test */,
+                               4BD35E551A33366200256CB7 /* delete_multiple_partial.test */,
+                               4BD35E561A33366200256CB7 /* delete_renamed_rename.test */,
+                               4BD35E5B1A33366200256CB7 /* encrypt.test */,
+                               4BD35E5C1A33366200256CB7 /* extra_add_multiple.test */,
+                               4BD35E5D1A33366200256CB7 /* extra_add.test */,
+                               4BD35E5E1A33366200256CB7 /* extra_count_by_id.test */,
+                               4BD35E5F1A33366200256CB7 /* extra_count_ignore_zip64.test */,
+                               4BD35E601A33366200256CB7 /* extra_count.test */,
+                               4BD35E611A33366200256CB7 /* extra_delete_by_id.test */,
+                               4BD35E621A33366200256CB7 /* extra_delete.test */,
+                               4BD35E631A33366200256CB7 /* extra_get_by_id.test */,
+                               4BD35E641A33366200256CB7 /* extra_get.test */,
+                               4BD35E651A33366200256CB7 /* extra_set_modify_c.test */,
+                               4BD35E661A33366200256CB7 /* extra_set_modify_l.test */,
+                               4BD35E671A33366200256CB7 /* extra_set.test */,
+                               4BD35E681A33366200256CB7 /* file_comment_encmismatch.test */,
+                               4BD35E691A33366200256CB7 /* fopen_unchanged.test */,
+                               4BD35E6A1A33366200256CB7 /* fread.test */,
+                               4BD35E6B1A33366200256CB7 /* get_comment.test */,
+                               4BD35E8E1A33366200256CB7 /* name_locate.test */,
+                               4BD35E8F1A33366200256CB7 /* open_cons_extrabytes.test */,
+                               4BD35E901A33366200256CB7 /* open_empty_2.test */,
+                               4BD35E911A33366200256CB7 /* open_empty.test */,
+                               4BD35E921A33366200256CB7 /* open_extrabytes.test */,
+                               4BD35E931A33366200256CB7 /* open_filename_duplicate_consistency.test */,
+                               4BD35E941A33366200256CB7 /* open_filename_duplicate_empty_consistency.test */,
+                               4BD35E951A33366200256CB7 /* open_filename_duplicate_empty.test */,
+                               4BD35E961A33366200256CB7 /* open_filename_duplicate.test */,
+                               4BD35E971A33366200256CB7 /* open_filename_empty.test */,
+                               4BD35E981A33366200256CB7 /* open_incons.test */,
+                               4BD35E991A33366200256CB7 /* open_many_ok.test */,
+                               4BD35E9A1A33366200256CB7 /* open_new_but_exists.test */,
+                               4BD35E9B1A33366200256CB7 /* open_new_ok.test */,
+                               4BD35E9C1A33366200256CB7 /* open_nonarchive.test */,
+                               4BD35E9D1A33366200256CB7 /* open_nosuchfile.test */,
+                               4BD35E9E1A33366200256CB7 /* open_ok.test */,
+                               4BD35E9F1A33366200256CB7 /* open_too_short.test */,
+                               4BD35EA01A33366200256CB7 /* open_truncate.test */,
+                               4BD35EA11A33366200256CB7 /* open_zip64_ok.test */,
+                               4BD35EA21A33366200256CB7 /* rename_ascii.test */,
+                               4BD35EA31A33366200256CB7 /* rename_cp437.test */,
+                               4BD35EA41A33366200256CB7 /* rename_deleted.test */,
+                               4BD35EA51A33366200256CB7 /* rename_fail.test */,
+                               4BD35EA61A33366200256CB7 /* rename_ok.test */,
+                               4BD35EA81A33366200256CB7 /* rename_utf8_encmismatch.test */,
+                               4BD35EA91A33366200256CB7 /* rename_utf8.test */,
+                               4BD35EAA1A33366200256CB7 /* set_comment_all.test */,
+                               4BD35EAB1A33366200256CB7 /* set_comment_localonly.test */,
+                               4BD35EAC1A33366200256CB7 /* set_comment_removeglobal.test */,
+                               4BD35EAD1A33366200256CB7 /* set_comment_revert.test */,
+                               4BD35EAE1A33366200256CB7 /* set_compression_deflate_to_deflate.test */,
+                               4BD35EAF1A33366200256CB7 /* set_compression_deflate_to_store.test */,
+                               4BD35EB01A33366200256CB7 /* set_compression_store_to_deflate.test */,
+                               4BD35EB11A33366200256CB7 /* set_compression_store_to_store.test */,
+                               4BD35EB21A33366200256CB7 /* set_compression_unknown.test */,
+                               4BD35EB31A33366200256CB7 /* set_mtime.test */,
+                               4BD35EB41A33366200256CB7 /* stat_index_cp437_guess.test */,
+                               4BD35EB51A33366200256CB7 /* stat_index_cp437_raw.test */,
+                               4BD35EB61A33366200256CB7 /* stat_index_cp437_strict.test */,
+                               4BD35EB71A33366200256CB7 /* stat_index_fileorder.test */,
+                               4BD35EB81A33366200256CB7 /* stat_index_streamed_zip64.test */,
+                               4BD35EB91A33366200256CB7 /* stat_index_streamed.test */,
+                               4BD35EBA1A33366200256CB7 /* stat_index_utf8_guess.test */,
+                               4BD35EBB1A33366200256CB7 /* stat_index_utf8_raw.test */,
+                               4BD35EBC1A33366200256CB7 /* stat_index_utf8_strict.test */,
+                               4BD35EBD1A33366200256CB7 /* stat_index_utf8_unmarked_strict.test */,
+                               4BD35EBE1A33366200256CB7 /* stat_index_zip64.test */,
+                               4BD35EDD1A33366300256CB7 /* torrent-already.test */,
+                               4BD35EDE1A33366300256CB7 /* torrent-new.test */,
+                               4BD35EE11A33366300256CB7 /* utf-8-standardization.test */,
+                               4BD35EE31A33366300256CB7 /* zip64_creation.test */,
+                               4BD35EE41A33366300256CB7 /* zip64_stored_creation.test */,
+                       );
+                       name = "test cases";
+                       sourceTree = "<group>";
+               };
+               4BDC71BD15B181DA00236D3C = {
+                       isa = PBXGroup;
+                       children = (
+                               4B28AA2815BAD4F800D0C17D /* info */,
+                               4BDC71E415B182B200236D3C /* Supporting Files */,
+                               4BDC71E315B182B200236D3C /* libzip */,
+                               4B01D72015B2F54C002D5007 /* src */,
+                               4BACD57415BC2AA100920691 /* regress */,
+                               4B28A9EA15BACBE100D0C17D /* man */,
+                               4BDC71CA15B181DA00236D3C /* Frameworks */,
+                               4BDC71C915B181DA00236D3C /* Products */,
+                       );
+                       sourceTree = "<group>";
+                       tabWidth = 8;
+               };
+               4BDC71C915B181DA00236D3C /* Products */ = {
+                       isa = PBXGroup;
+                       children = (
+                               4BDC71E015B182B200236D3C /* libzip_iOS.framework */,
+                               4B01D68B15B2F3F1002D5007 /* libzip.framework */,
+                               4B01D6FD15B2F4B1002D5007 /* zipmerge */,
+                               4B01D71315B2F4EB002D5007 /* zipcmp */,
+                               4BACD58915BC2CEA00920691 /* modify */,
+                               4BACD5C115BC2DC900920691 /* add_from_filep */,
+                               4BACD5D015BC2DF200920691 /* fopen_unchanged */,
+                               4BACD5DF15BC2F3700920691 /* fread */,
+                               4BACD65015BC301300920691 /* tryopen */,
+                               4BD6CB6C19E71CD100710654 /* hole */,
+                       );
+                       name = Products;
+                       sourceTree = "<group>";
+               };
+               4BDC71CA15B181DA00236D3C /* Frameworks */ = {
+                       isa = PBXGroup;
+                       children = (
+                               4B01D70815B2F4CF002D5007 /* libz.dylib */,
+                       );
+                       name = Frameworks;
+                       sourceTree = "<group>";
+               };
+               4BDC71E315B182B200236D3C /* libzip */ = {
+                       isa = PBXGroup;
+                       children = (
+                               4BDC72A015B1B56400236D3C /* config.h */,
+                               4BDC729E15B1B4E900236D3C /* zipconf.h */,
+                               4BDC729815B1B2A600236D3C /* zip.h */,
+                               4BDC729915B1B2A600236D3C /* zipint.h */,
+                               4BDC71F115B1B25E00236D3C /* zip_add_dir.c */,
+                               4BDC71F215B1B25E00236D3C /* zip_add_entry.c */,
+                               4BDC71F315B1B25E00236D3C /* zip_add.c */,
+                               4BCB434119E9347E0067FAA3 /* zip_buffer.c */,
+                               4BDC71F415B1B25E00236D3C /* zip_close.c */,
+                               4BDC71F515B1B25E00236D3C /* zip_delete.c */,
+                               4BDC71F615B1B25E00236D3C /* zip_dir_add.c */,
+                               4BDC71F715B1B25E00236D3C /* zip_dirent.c */,
+                               4BDC71F815B1B25E00236D3C /* zip_discard.c */,
+                               4BDC71F915B1B25E00236D3C /* zip_entry.c */,
+                               4BDC71FA15B1B25E00236D3C /* zip_err_str.c */,
+                               4BDC71FB15B1B25E00236D3C /* zip_error_clear.c */,
+                               4BDC71FC15B1B25E00236D3C /* zip_error_get_sys_type.c */,
+                               4BDC71FD15B1B25E00236D3C /* zip_error_get.c */,
+                               4BDC71FE15B1B25E00236D3C /* zip_error_strerror.c */,
+                               4BDC71FF15B1B25E00236D3C /* zip_error_to_str.c */,
+                               4BDC720015B1B25E00236D3C /* zip_error.c */,
+                               4BDC720115B1B25E00236D3C /* zip_extra_field_api.c */,
+                               4BDC720215B1B25E00236D3C /* zip_extra_field.c */,
+                               4BDC720315B1B25E00236D3C /* zip_fclose.c */,
+                               4BDC720415B1B25E00236D3C /* zip_fdopen.c */,
+                               4BDC720515B1B25E00236D3C /* zip_file_add.c */,
+                               4BDC720615B1B25E00236D3C /* zip_file_error_clear.c */,
+                               4BDC720715B1B25E00236D3C /* zip_file_error_get.c */,
+                               4BDC720815B1B25E00236D3C /* zip_file_get_comment.c */,
+                               4B97204D188EBE85002FAFAD /* zip_file_get_external_attributes.c */,
+                               4BDC720915B1B25E00236D3C /* zip_file_get_offset.c */,
+                               4BDC720A15B1B25E00236D3C /* zip_file_rename.c */,
+                               4BDC720B15B1B25E00236D3C /* zip_file_replace.c */,
+                               4BDC720C15B1B25E00236D3C /* zip_file_set_comment.c */,
+                               4B97204E188EBE85002FAFAD /* zip_file_set_external_attributes.c */,
+                               4B82CED319915F360097BC18 /* zip_file_set_mtime.c */,
+                               4BDC720D15B1B25E00236D3C /* zip_file_strerror.c */,
+                               4BDC720E15B1B25E00236D3C /* zip_filerange_crc.c */,
+                               4BDC720F15B1B25E00236D3C /* zip_fopen_encrypted.c */,
+                               4BDC721015B1B25E00236D3C /* zip_fopen_index_encrypted.c */,
+                               4BDC721115B1B25E00236D3C /* zip_fopen_index.c */,
+                               4BDC721215B1B25E00236D3C /* zip_fopen.c */,
+                               4BDC721315B1B25E00236D3C /* zip_fread.c */,
+                               4BDC721415B1B25E00236D3C /* zip_get_archive_comment.c */,
+                               4BDC721515B1B25E00236D3C /* zip_get_archive_flag.c */,
+                               4BDC721615B1B25E00236D3C /* zip_get_compression_implementation.c */,
+                               4BDC721715B1B25E00236D3C /* zip_get_encryption_implementation.c */,
+                               4BDC721815B1B25E00236D3C /* zip_get_file_comment.c */,
+                               4BDC721915B1B25E00236D3C /* zip_get_name.c */,
+                               4BDC721A15B1B25E00236D3C /* zip_get_num_entries.c */,
+                               4BDC721B15B1B25E00236D3C /* zip_get_num_files.c */,
+                               4BCF3019199A2F820064207B /* zip_io_util.c */,
+                               4BDC721C15B1B25E00236D3C /* zip_memdup.c */,
+                               4BDC721D15B1B25E00236D3C /* zip_name_locate.c */,
+                               4BDC721E15B1B25E00236D3C /* zip_new.c */,
+                               4BDC721F15B1B25E00236D3C /* zip_open.c */,
+                               4BDC722015B1B25E00236D3C /* zip_rename.c */,
+                               4BDC722115B1B25E00236D3C /* zip_replace.c */,
+                               4BDC722215B1B25E00236D3C /* zip_set_archive_comment.c */,
+                               4BDC722315B1B25E00236D3C /* zip_set_archive_flag.c */,
+                               4BDC722415B1B25E00236D3C /* zip_set_default_password.c */,
+                               4BDC722515B1B25E00236D3C /* zip_set_file_comment.c */,
+                               4BDC722615B1B25E00236D3C /* zip_set_file_compression.c */,
+                               4BDC722715B1B25E00236D3C /* zip_set_name.c */,
+                               4BCF301A199A2F820064207B /* zip_source_begin_write.c */,
+                               4BDC722815B1B25E00236D3C /* zip_source_buffer.c */,
+                               4BD5053219A0116D007DD28A /* zip_source_call.c */,
+                               4BDC722915B1B25E00236D3C /* zip_source_close.c */,
+                               4BCF301B199A2F820064207B /* zip_source_commit_write.c */,
+                               4BDC722A15B1B25E00236D3C /* zip_source_crc.c */,
+                               4BDC722B15B1B25E00236D3C /* zip_source_deflate.c */,
+                               4BDC722C15B1B25E00236D3C /* zip_source_error.c */,
+                               4BDC722D15B1B25E00236D3C /* zip_source_file.c */,
+                               4BDC722E15B1B25E00236D3C /* zip_source_filep.c */,
+                               4BDC722F15B1B25E00236D3C /* zip_source_free.c */,
+                               4BDC723015B1B25E00236D3C /* zip_source_function.c */,
+                               4BE402AC19D94AE400298248 /* zip_source_is_deleted.c */,
+                               4BDC723115B1B25E00236D3C /* zip_source_layered.c */,
+                               4BDC723215B1B25E00236D3C /* zip_source_open.c */,
+                               4BDC723315B1B25E00236D3C /* zip_source_pkware.c */,
+                               4BDC723515B1B25E00236D3C /* zip_source_read.c */,
+                               4BCF3031199ABD3A0064207B /* zip_source_remove.c */,
+                               4BCF301C199A2F820064207B /* zip_source_rollback_write.c */,
+                               4BCF301D199A2F820064207B /* zip_source_seek.c */,
+                               4BCF3034199ABDDA0064207B /* zip_source_seek_write.c */,
+                               4BDC723615B1B25E00236D3C /* zip_source_stat.c */,
+                               4BCF301E199A2F820064207B /* zip_source_supports.c */,
+                               4BCF301F199A2F820064207B /* zip_source_tell.c */,
+                               4BCF3035199ABDDA0064207B /* zip_source_tell_write.c */,
+                               4BDC723715B1B25E00236D3C /* zip_source_window.c */,
+                               4BCF3020199A2F820064207B /* zip_source_write.c */,
+                               4BDC723815B1B25E00236D3C /* zip_source_zip_new.c */,
+                               4BDC723915B1B25E00236D3C /* zip_source_zip.c */,
+                               4BDC723A15B1B25E00236D3C /* zip_stat_index.c */,
+                               4BDC723B15B1B25E00236D3C /* zip_stat_init.c */,
+                               4BDC723C15B1B25E00236D3C /* zip_stat.c */,
+                               4BDC723D15B1B25E00236D3C /* zip_strerror.c */,
+                               4BDC723E15B1B25E00236D3C /* zip_string.c */,
+                               4BDC723F15B1B25E00236D3C /* zip_unchange_all.c */,
+                               4BCD54C41AB05AA90003D379 /* zip_source_win32a.c */,
+                               4BEF35C31AF4D92D00974F28 /* zip_source_win32handle.c */,
+                               4BCD54C61AB05AA90003D379 /* zip_source_win32utf8.c */,
+                               4BCD54C71AB05AA90003D379 /* zip_source_win32w.c */,
+                               4BCD54C81AB05AA90003D379 /* zipwin32.h */,
+                               4BDC724015B1B25E00236D3C /* zip_unchange_archive.c */,
+                               4BDC724115B1B25E00236D3C /* zip_unchange_data.c */,
+                               4BDC724215B1B25E00236D3C /* zip_unchange.c */,
+                               4BDC724315B1B25E00236D3C /* zip_utf-8.c */,
+                       );
+                       name = libzip;
+                       path = ../lib;
+                       sourceTree = "<group>";
+               };
+               4BDC71E415B182B200236D3C /* Supporting Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               3D77B86517009AA1000A5794 /* extract-version.sh */,
+                               4B01D73D15B2FB6B002D5007 /* Info.plist */,
+                       );
+                       name = "Supporting Files";
+                       path = libzip;
+                       sourceTree = "<group>";
+               };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+               4B01D68815B2F3F1002D5007 /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4B01D73215B2F5EE002D5007 /* zipconf.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BDC729A15B1B2B100236D3C /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BDC729B15B1B2C400236D3C /* zip.h in Headers */,
+                               4BDC729F15B1B4E900236D3C /* zipconf.h in Headers */,
+                               4B01D73415B2F5F4002D5007 /* config.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+               4B01D68A15B2F3F1002D5007 /* libzip */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 4B01D69E15B2F3F1002D5007 /* Build configuration list for PBXNativeTarget "libzip" */;
+                       buildPhases = (
+                               4B01D68615B2F3F1002D5007 /* Sources */,
+                               4B01D68715B2F3F1002D5007 /* Frameworks */,
+                               4B01D68815B2F3F1002D5007 /* Headers */,
+                               4B01D68915B2F3F1002D5007 /* Resources */,
+                               3D77B86617009AC5000A5794 /* Copy Version Info from config.h */,
+                               4B972053188EBEB8002FAFAD /* Fix zipconf.h include. */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = libzip;
+                       productName = "libzip Mac";
+                       productReference = 4B01D68B15B2F3F1002D5007 /* libzip.framework */;
+                       productType = "com.apple.product-type.framework";
+               };
+               4B01D6FC15B2F4B1002D5007 /* zipmerge */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 4B01D70415B2F4B1002D5007 /* Build configuration list for PBXNativeTarget "zipmerge" */;
+                       buildPhases = (
+                               4B01D6F915B2F4B1002D5007 /* Sources */,
+                               4B01D6FA15B2F4B1002D5007 /* Frameworks */,
+                               4B01D6FB15B2F4B1002D5007 /* CopyFiles */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               4B01D73615B2F639002D5007 /* PBXTargetDependency */,
+                       );
+                       name = zipmerge;
+                       productName = zipmerge;
+                       productReference = 4B01D6FD15B2F4B1002D5007 /* zipmerge */;
+                       productType = "com.apple.product-type.tool";
+               };
+               4B01D70A15B2F4EB002D5007 /* zipcmp */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 4B01D71015B2F4EB002D5007 /* Build configuration list for PBXNativeTarget "zipcmp" */;
+                       buildPhases = (
+                               4B01D70B15B2F4EB002D5007 /* Sources */,
+                               4B01D70C15B2F4EB002D5007 /* Frameworks */,
+                               4B01D70F15B2F4EB002D5007 /* CopyFiles */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               4B01D73815B2F643002D5007 /* PBXTargetDependency */,
+                       );
+                       name = zipcmp;
+                       productName = zipmerge;
+                       productReference = 4B01D71315B2F4EB002D5007 /* zipcmp */;
+                       productType = "com.apple.product-type.tool";
+               };
+               4BACD58815BC2CEA00920691 /* modify */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 4BACD59015BC2CEA00920691 /* Build configuration list for PBXNativeTarget "modify" */;
+                       buildPhases = (
+                               4BACD58515BC2CEA00920691 /* Sources */,
+                               4BACD58615BC2CEA00920691 /* Frameworks */,
+                               4BACD58715BC2CEA00920691 /* CopyFiles */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               4BACD59715BC2D3800920691 /* PBXTargetDependency */,
+                       );
+                       name = modify;
+                       productName = modify;
+                       productReference = 4BACD58915BC2CEA00920691 /* modify */;
+                       productType = "com.apple.product-type.tool";
+               };
+               4BACD5B515BC2DC900920691 /* add_from_filep */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 4BACD5BE15BC2DC900920691 /* Build configuration list for PBXNativeTarget "add_from_filep" */;
+                       buildPhases = (
+                               4BACD5B815BC2DC900920691 /* Sources */,
+                               4BACD5BA15BC2DC900920691 /* Frameworks */,
+                               4BACD5BD15BC2DC900920691 /* CopyFiles */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               4BACD5B615BC2DC900920691 /* PBXTargetDependency */,
+                       );
+                       name = add_from_filep;
+                       productName = modify;
+                       productReference = 4BACD5C115BC2DC900920691 /* add_from_filep */;
+                       productType = "com.apple.product-type.tool";
+               };
+               4BACD5C415BC2DF200920691 /* fopen_unchanged */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 4BACD5CD15BC2DF200920691 /* Build configuration list for PBXNativeTarget "fopen_unchanged" */;
+                       buildPhases = (
+                               4BACD5C715BC2DF200920691 /* Sources */,
+                               4BACD5C915BC2DF200920691 /* Frameworks */,
+                               4BACD5CC15BC2DF200920691 /* CopyFiles */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               4BACD5C515BC2DF200920691 /* PBXTargetDependency */,
+                       );
+                       name = fopen_unchanged;
+                       productName = modify;
+                       productReference = 4BACD5D015BC2DF200920691 /* fopen_unchanged */;
+                       productType = "com.apple.product-type.tool";
+               };
+               4BACD5D315BC2F3700920691 /* fread */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 4BACD5DC15BC2F3700920691 /* Build configuration list for PBXNativeTarget "fread" */;
+                       buildPhases = (
+                               4BACD5D615BC2F3700920691 /* Sources */,
+                               4BACD5D815BC2F3700920691 /* Frameworks */,
+                               4BACD5DB15BC2F3700920691 /* CopyFiles */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               4BACD5D415BC2F3700920691 /* PBXTargetDependency */,
+                       );
+                       name = fread;
+                       productName = modify;
+                       productReference = 4BACD5DF15BC2F3700920691 /* fread */;
+                       productType = "com.apple.product-type.tool";
+               };
+               4BACD64515BC301300920691 /* tryopen */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 4BACD64D15BC301300920691 /* Build configuration list for PBXNativeTarget "tryopen" */;
+                       buildPhases = (
+                               4BACD64815BC301300920691 /* Sources */,
+                               4BACD64915BC301300920691 /* Frameworks */,
+                               4BACD64C15BC301300920691 /* CopyFiles */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               4BACD64615BC301300920691 /* PBXTargetDependency */,
+                       );
+                       name = tryopen;
+                       productName = modify;
+                       productReference = 4BACD65015BC301300920691 /* tryopen */;
+                       productType = "com.apple.product-type.tool";
+               };
+               4BD6CB5F19E71CD100710654 /* hole */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 4BD6CB6919E71CD100710654 /* Build configuration list for PBXNativeTarget "hole" */;
+                       buildPhases = (
+                               4BD6CB6219E71CD100710654 /* Sources */,
+                               4BD6CB6519E71CD100710654 /* Frameworks */,
+                               4BD6CB6819E71CD100710654 /* CopyFiles */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               4BD6CB6019E71CD100710654 /* PBXTargetDependency */,
+                       );
+                       name = hole;
+                       productName = modify;
+                       productReference = 4BD6CB6C19E71CD100710654 /* hole */;
+                       productType = "com.apple.product-type.tool";
+               };
+               4BDC71DF15B182B200236D3C /* libzip_iOS */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 4BDC71EA15B182B200236D3C /* Build configuration list for PBXNativeTarget "libzip_iOS" */;
+                       buildPhases = (
+                               4BDC71DC15B182B200236D3C /* Sources */,
+                               4BDC71DD15B182B200236D3C /* Frameworks */,
+                               4BDC71DE15B182B200236D3C /* Resources */,
+                               4BDC729A15B1B2B100236D3C /* Headers */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = libzip_iOS;
+                       productName = libzip;
+                       productReference = 4BDC71E015B182B200236D3C /* libzip_iOS.framework */;
+                       productType = "com.apple.product-type.bundle";
+               };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+               4BDC71BF15B181DA00236D3C /* Project object */ = {
+                       isa = PBXProject;
+                       attributes = {
+                               LastUpgradeCheck = 0630;
+                               ORGANIZATIONNAME = NiH;
+                       };
+                       buildConfigurationList = 4BDC71C215B181DA00236D3C /* Build configuration list for PBXProject "libzip" */;
+                       compatibilityVersion = "Xcode 3.2";
+                       developmentRegion = English;
+                       hasScannedForEncodings = 0;
+                       knownRegions = (
+                               en,
+                       );
+                       mainGroup = 4BDC71BD15B181DA00236D3C;
+                       productRefGroup = 4BDC71C915B181DA00236D3C /* Products */;
+                       projectDirPath = "";
+                       projectRoot = "";
+                       targets = (
+                               4B54447915C977A20067BA33 /* all */,
+                               4BDC71DF15B182B200236D3C /* libzip_iOS */,
+                               4BDC72A115B1B6EA00236D3C /* Build iOS Framework */,
+                               4B01D68A15B2F3F1002D5007 /* libzip */,
+                               4B01D72815B2F5A2002D5007 /* command line tools */,
+                               4B01D6FC15B2F4B1002D5007 /* zipmerge */,
+                               4B01D70A15B2F4EB002D5007 /* zipcmp */,
+                               4BACD5A715BC2D8200920691 /* test programs */,
+                               4BACD5B515BC2DC900920691 /* add_from_filep */,
+                               4BACD5C415BC2DF200920691 /* fopen_unchanged */,
+                               4BACD5D315BC2F3700920691 /* fread */,
+                               4BD6CB5F19E71CD100710654 /* hole */,
+                               4BACD58815BC2CEA00920691 /* modify */,
+                               4BACD64515BC301300920691 /* tryopen */,
+                       );
+               };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+               4B01D68915B2F3F1002D5007 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BDC71DE15B182B200236D3C /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+               3D77B86617009AC5000A5794 /* Copy Version Info from config.h */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Copy Version Info from config.h";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "./extract-version.sh \"config.h\" \"Info.plist\" ";
+               };
+               4B972053188EBEB8002FAFAD /* Fix zipconf.h include. */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Fix zipconf.h include.";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "sed \"s,<zipconf.h>,<$EXECUTABLE_NAME/zipconf.h>,\" ../lib/zip.h > \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Headers/zip.h\"";
+               };
+               4BDC72A515B1B71500236D3C /* ShellScript */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "# Sets the target folders and the final framework product.\nFMK_NAME=libzip_iOS\nFMK_VERSION=A\n\n# Install dir will be the final output to the framework.\n# The following line create it in the root folder of the current project.\nINSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework\n\n# Working dir will be deleted after the framework creation.\nWRK_DIR=build\nDEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework\nSIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework\n\n# Building both architectures.\nxcodebuild -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphoneos\nxcodebuild -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphonesimulator\n\n# Cleaning the oldest.\nif [ -d \"${INSTALL_DIR}\" ]\nthen\n    rm -rf \"${INSTALL_DIR}\"\nfi\n\n# Creates and renews the final product folder.\nmkdir -p \"${INSTALL_DIR}\"\nmkdir -p \"${INSTALL_DIR}/Versions\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers\"\n\n# Creates the internal links.\n# It MUST uses relative path, otherwise will not work when the folder is copied/moved.\nln -s \"${FMK_VERSION}\" \"${INSTALL_DIR}/Versions/Current\"\nln -s \"Versions/Current/Headers\" \"${INSTALL_DIR}/Headers\"\nln -s \"Versions/Current/Resources\" \"${INSTALL_DIR}/Resources\"\nln -s \"Versions/Current/${FMK_NAME}\" \"${INSTALL_DIR}/${FMK_NAME}\"\n\n# Copies the headers and resources files to the final product folder.\ncp -R \"${DEVICE_DIR}/Headers/\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/\"\ncp -R \"${DEVICE_DIR}/\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\n\n# Removes the binary and header from the resources folder.\nrm -r \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/Headers\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/${FMK_NAME}\"\n\n# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.\nlipo -create \"${DEVICE_DIR}/${FMK_NAME}\" \"${SIMULATOR_DIR}/${FMK_NAME}\" -output \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\"\n\nrm -r \"${WRK_DIR}\"\n";
+               };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+               4B01D68615B2F3F1002D5007 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BCF3039199ABDDA0064207B /* zip_source_tell_write.c in Sources */,
+                               4B01D6A615B2F46B002D5007 /* zip_add_dir.c in Sources */,
+                               4B972052188EBE85002FAFAD /* zip_file_set_external_attributes.c in Sources */,
+                               4BCF3024199A2F820064207B /* zip_source_begin_write.c in Sources */,
+                               4B01D6A715B2F46B002D5007 /* zip_add_entry.c in Sources */,
+                               4B01D6A815B2F46B002D5007 /* zip_add.c in Sources */,
+                               4B01D6A915B2F46B002D5007 /* zip_close.c in Sources */,
+                               4B01D6AA15B2F46B002D5007 /* zip_delete.c in Sources */,
+                               4B01D6AB15B2F46B002D5007 /* zip_dir_add.c in Sources */,
+                               4B01D6AC15B2F46B002D5007 /* zip_dirent.c in Sources */,
+                               4B01D6AD15B2F46B002D5007 /* zip_discard.c in Sources */,
+                               4B01D6AE15B2F46B002D5007 /* zip_entry.c in Sources */,
+                               4B01D6AF15B2F46B002D5007 /* zip_err_str.c in Sources */,
+                               4B01D6B015B2F46B002D5007 /* zip_error_clear.c in Sources */,
+                               4B01D6B115B2F46B002D5007 /* zip_error_get_sys_type.c in Sources */,
+                               4B01D6B215B2F46B002D5007 /* zip_error_get.c in Sources */,
+                               4B01D6B315B2F46B002D5007 /* zip_error_strerror.c in Sources */,
+                               4B01D6B415B2F46B002D5007 /* zip_error_to_str.c in Sources */,
+                               4B01D6B515B2F46B002D5007 /* zip_error.c in Sources */,
+                               4B01D6B615B2F46B002D5007 /* zip_extra_field_api.c in Sources */,
+                               4B01D6B715B2F46B002D5007 /* zip_extra_field.c in Sources */,
+                               4B01D6B815B2F46B002D5007 /* zip_fclose.c in Sources */,
+                               4B01D6B915B2F46B002D5007 /* zip_fdopen.c in Sources */,
+                               4B01D6BA15B2F46B002D5007 /* zip_file_add.c in Sources */,
+                               4B01D6BB15B2F46B002D5007 /* zip_file_error_clear.c in Sources */,
+                               4BCF3026199A2F820064207B /* zip_source_commit_write.c in Sources */,
+                               4B01D6BC15B2F46B002D5007 /* zip_file_error_get.c in Sources */,
+                               4B01D6BD15B2F46B002D5007 /* zip_file_get_comment.c in Sources */,
+                               4B01D6BE15B2F46B002D5007 /* zip_file_get_offset.c in Sources */,
+                               4B01D6BF15B2F46B002D5007 /* zip_file_rename.c in Sources */,
+                               4B01D6C015B2F46B002D5007 /* zip_file_replace.c in Sources */,
+                               4B01D6C115B2F46B002D5007 /* zip_file_set_comment.c in Sources */,
+                               4BCF3033199ABD3A0064207B /* zip_source_remove.c in Sources */,
+                               4B01D6C215B2F46B002D5007 /* zip_file_strerror.c in Sources */,
+                               4B01D6C315B2F46B002D5007 /* zip_filerange_crc.c in Sources */,
+                               4B01D6C415B2F46B002D5007 /* zip_fopen_encrypted.c in Sources */,
+                               4BCF302A199A2F820064207B /* zip_source_seek.c in Sources */,
+                               4B01D6C515B2F46B002D5007 /* zip_fopen_index_encrypted.c in Sources */,
+                               4B01D6C615B2F46B002D5007 /* zip_fopen_index.c in Sources */,
+                               4B01D6C715B2F46B002D5007 /* zip_fopen.c in Sources */,
+                               4B01D6C815B2F46B002D5007 /* zip_fread.c in Sources */,
+                               4B01D6C915B2F46B002D5007 /* zip_get_archive_comment.c in Sources */,
+                               4B01D6CA15B2F46B002D5007 /* zip_get_archive_flag.c in Sources */,
+                               4B01D6CB15B2F46B002D5007 /* zip_get_compression_implementation.c in Sources */,
+                               4BD5053419A01BB0007DD28A /* zip_source_call.c in Sources */,
+                               4BCF3030199A2F820064207B /* zip_source_write.c in Sources */,
+                               4B01D6CC15B2F46B002D5007 /* zip_get_encryption_implementation.c in Sources */,
+                               4B01D6CD15B2F46B002D5007 /* zip_get_file_comment.c in Sources */,
+                               4B01D6CE15B2F46B002D5007 /* zip_get_name.c in Sources */,
+                               4B01D6CF15B2F46B002D5007 /* zip_get_num_entries.c in Sources */,
+                               4B01D6D015B2F46B002D5007 /* zip_get_num_files.c in Sources */,
+                               4B01D6D115B2F46B002D5007 /* zip_memdup.c in Sources */,
+                               4B01D6D215B2F46B002D5007 /* zip_name_locate.c in Sources */,
+                               4B01D6D315B2F46B002D5007 /* zip_new.c in Sources */,
+                               4B01D6D415B2F46B002D5007 /* zip_open.c in Sources */,
+                               4B01D6D515B2F46B002D5007 /* zip_rename.c in Sources */,
+                               4BCF302E199A2F820064207B /* zip_source_tell.c in Sources */,
+                               4B972050188EBE85002FAFAD /* zip_file_get_external_attributes.c in Sources */,
+                               4B01D6D615B2F46B002D5007 /* zip_replace.c in Sources */,
+                               4B01D6D715B2F46B002D5007 /* zip_set_archive_comment.c in Sources */,
+                               4B01D6D815B2F46B002D5007 /* zip_set_archive_flag.c in Sources */,
+                               4B01D6D915B2F46B002D5007 /* zip_set_default_password.c in Sources */,
+                               4B01D6DA15B2F46B002D5007 /* zip_set_file_comment.c in Sources */,
+                               4B01D6DB15B2F46B002D5007 /* zip_set_file_compression.c in Sources */,
+                               4B01D6DC15B2F46B002D5007 /* zip_set_name.c in Sources */,
+                               4B01D6DD15B2F46B002D5007 /* zip_source_buffer.c in Sources */,
+                               4BCB434319E9347E0067FAA3 /* zip_buffer.c in Sources */,
+                               4B01D6DE15B2F46B002D5007 /* zip_source_close.c in Sources */,
+                               4B01D6DF15B2F46B002D5007 /* zip_source_crc.c in Sources */,
+                               4B01D6E015B2F46B002D5007 /* zip_source_deflate.c in Sources */,
+                               4B01D6E115B2F46B002D5007 /* zip_source_error.c in Sources */,
+                               4B01D6E215B2F46B002D5007 /* zip_source_file.c in Sources */,
+                               4B01D6E315B2F46B002D5007 /* zip_source_filep.c in Sources */,
+                               4B01D6E415B2F46B002D5007 /* zip_source_free.c in Sources */,
+                               4B01D6E515B2F46B002D5007 /* zip_source_function.c in Sources */,
+                               4BCF3022199A2F820064207B /* zip_io_util.c in Sources */,
+                               4B01D6E615B2F46B002D5007 /* zip_source_layered.c in Sources */,
+                               4B01D6E715B2F46B002D5007 /* zip_source_open.c in Sources */,
+                               4B01D6E815B2F46B002D5007 /* zip_source_pkware.c in Sources */,
+                               4B01D6EA15B2F46B002D5007 /* zip_source_read.c in Sources */,
+                               4B01D6EB15B2F46B002D5007 /* zip_source_stat.c in Sources */,
+                               4BCF302C199A2F820064207B /* zip_source_supports.c in Sources */,
+                               4B01D6EC15B2F46B002D5007 /* zip_source_window.c in Sources */,
+                               4B01D6ED15B2F46B002D5007 /* zip_source_zip_new.c in Sources */,
+                               4B01D6EE15B2F46B002D5007 /* zip_source_zip.c in Sources */,
+                               4B01D6EF15B2F46B002D5007 /* zip_stat_index.c in Sources */,
+                               4B01D6F015B2F46B002D5007 /* zip_stat_init.c in Sources */,
+                               4B82CED519915F360097BC18 /* zip_file_set_mtime.c in Sources */,
+                               4B01D6F115B2F46B002D5007 /* zip_stat.c in Sources */,
+                               4B01D6F215B2F46B002D5007 /* zip_strerror.c in Sources */,
+                               4B01D6F315B2F46B002D5007 /* zip_string.c in Sources */,
+                               4B01D6F415B2F46B002D5007 /* zip_unchange_all.c in Sources */,
+                               4B01D6F515B2F46B002D5007 /* zip_unchange_archive.c in Sources */,
+                               4BCF3028199A2F820064207B /* zip_source_rollback_write.c in Sources */,
+                               4BCF3037199ABDDA0064207B /* zip_source_seek_write.c in Sources */,
+                               4B01D6F615B2F46B002D5007 /* zip_unchange_data.c in Sources */,
+                               4B01D6F715B2F46B002D5007 /* zip_unchange.c in Sources */,
+                               4B01D6F815B2F46B002D5007 /* zip_utf-8.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4B01D6F915B2F4B1002D5007 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4B01D72615B2F57F002D5007 /* zipmerge.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4B01D70B15B2F4EB002D5007 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4B01D72515B2F57B002D5007 /* zipcmp.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD58515BC2CEA00920691 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BACD59515BC2D1C00920691 /* modify.c in Sources */,
+                               4BD6CB5D19E6A5D900710654 /* source_hole.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD5B815BC2DC900920691 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BACD5C315BC2DE000920691 /* add_from_filep.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD5C715BC2DF200920691 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BACD5D215BC2EFE00920691 /* fopen_unchanged.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD5D615BC2F3700920691 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BACD5E115BC2F4500920691 /* fread.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BACD64815BC301300920691 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BACD65315BC302500920691 /* tryopen.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BD6CB6219E71CD100710654 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BD6CB6F19E71D6900710654 /* hole.c in Sources */,
+                               4BD6CB6419E71CD100710654 /* source_hole.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4BDC71DC15B182B200236D3C /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4BCF3038199ABDDA0064207B /* zip_source_tell_write.c in Sources */,
+                               4BDC724415B1B25E00236D3C /* zip_add_dir.c in Sources */,
+                               4B972051188EBE85002FAFAD /* zip_file_set_external_attributes.c in Sources */,
+                               4BCF3023199A2F820064207B /* zip_source_begin_write.c in Sources */,
+                               4BDC724515B1B25E00236D3C /* zip_add_entry.c in Sources */,
+                               4BDC724615B1B25E00236D3C /* zip_add.c in Sources */,
+                               4BDC724715B1B25E00236D3C /* zip_close.c in Sources */,
+                               4BDC724815B1B25E00236D3C /* zip_delete.c in Sources */,
+                               4BDC724915B1B25E00236D3C /* zip_dir_add.c in Sources */,
+                               4BDC724A15B1B25E00236D3C /* zip_dirent.c in Sources */,
+                               4BDC724B15B1B25E00236D3C /* zip_discard.c in Sources */,
+                               4BDC724C15B1B25E00236D3C /* zip_entry.c in Sources */,
+                               4BDC724D15B1B25E00236D3C /* zip_err_str.c in Sources */,
+                               4BDC724E15B1B25E00236D3C /* zip_error_clear.c in Sources */,
+                               4BDC724F15B1B25E00236D3C /* zip_error_get_sys_type.c in Sources */,
+                               4BDC725015B1B25E00236D3C /* zip_error_get.c in Sources */,
+                               4BDC725115B1B25E00236D3C /* zip_error_strerror.c in Sources */,
+                               4BDC725215B1B25E00236D3C /* zip_error_to_str.c in Sources */,
+                               4BDC725315B1B25E00236D3C /* zip_error.c in Sources */,
+                               4BDC725415B1B25E00236D3C /* zip_extra_field_api.c in Sources */,
+                               4BDC725515B1B25E00236D3C /* zip_extra_field.c in Sources */,
+                               4BDC725615B1B25E00236D3C /* zip_fclose.c in Sources */,
+                               4BDC725715B1B25E00236D3C /* zip_fdopen.c in Sources */,
+                               4BDC725815B1B25E00236D3C /* zip_file_add.c in Sources */,
+                               4BDC725915B1B25E00236D3C /* zip_file_error_clear.c in Sources */,
+                               4BCF3025199A2F820064207B /* zip_source_commit_write.c in Sources */,
+                               4BDC725A15B1B25E00236D3C /* zip_file_error_get.c in Sources */,
+                               4BDC725B15B1B25E00236D3C /* zip_file_get_comment.c in Sources */,
+                               4BDC725C15B1B25E00236D3C /* zip_file_get_offset.c in Sources */,
+                               4BDC725D15B1B25E00236D3C /* zip_file_rename.c in Sources */,
+                               4BDC725E15B1B25E00236D3C /* zip_file_replace.c in Sources */,
+                               4BDC725F15B1B25E00236D3C /* zip_file_set_comment.c in Sources */,
+                               4BCF3032199ABD3A0064207B /* zip_source_remove.c in Sources */,
+                               4BDC726015B1B25E00236D3C /* zip_file_strerror.c in Sources */,
+                               4BDC726115B1B25E00236D3C /* zip_filerange_crc.c in Sources */,
+                               4BDC726215B1B25E00236D3C /* zip_fopen_encrypted.c in Sources */,
+                               4BCF3029199A2F820064207B /* zip_source_seek.c in Sources */,
+                               4BDC726315B1B25E00236D3C /* zip_fopen_index_encrypted.c in Sources */,
+                               4BDC726415B1B25E00236D3C /* zip_fopen_index.c in Sources */,
+                               4BDC726515B1B25E00236D3C /* zip_fopen.c in Sources */,
+                               4BDC726615B1B25E00236D3C /* zip_fread.c in Sources */,
+                               4BDC726715B1B25E00236D3C /* zip_get_archive_comment.c in Sources */,
+                               4BDC726815B1B25E00236D3C /* zip_get_archive_flag.c in Sources */,
+                               4BDC726915B1B25E00236D3C /* zip_get_compression_implementation.c in Sources */,
+                               4BD5053319A0116D007DD28A /* zip_source_call.c in Sources */,
+                               4BCF302F199A2F820064207B /* zip_source_write.c in Sources */,
+                               4BDC726A15B1B25E00236D3C /* zip_get_encryption_implementation.c in Sources */,
+                               4BDC726B15B1B25E00236D3C /* zip_get_file_comment.c in Sources */,
+                               4BDC726C15B1B25E00236D3C /* zip_get_name.c in Sources */,
+                               4BDC726D15B1B25E00236D3C /* zip_get_num_entries.c in Sources */,
+                               4BDC726E15B1B25E00236D3C /* zip_get_num_files.c in Sources */,
+                               4BDC726F15B1B25E00236D3C /* zip_memdup.c in Sources */,
+                               4BDC727015B1B25E00236D3C /* zip_name_locate.c in Sources */,
+                               4BDC727115B1B25E00236D3C /* zip_new.c in Sources */,
+                               4BDC727215B1B25E00236D3C /* zip_open.c in Sources */,
+                               4BDC727315B1B25E00236D3C /* zip_rename.c in Sources */,
+                               4BCF302D199A2F820064207B /* zip_source_tell.c in Sources */,
+                               4B97204F188EBE85002FAFAD /* zip_file_get_external_attributes.c in Sources */,
+                               4BDC727415B1B25E00236D3C /* zip_replace.c in Sources */,
+                               4BDC727515B1B25E00236D3C /* zip_set_archive_comment.c in Sources */,
+                               4BDC727615B1B25E00236D3C /* zip_set_archive_flag.c in Sources */,
+                               4BDC727715B1B25E00236D3C /* zip_set_default_password.c in Sources */,
+                               4BDC727815B1B25E00236D3C /* zip_set_file_comment.c in Sources */,
+                               4BDC727915B1B25E00236D3C /* zip_set_file_compression.c in Sources */,
+                               4BDC727A15B1B25E00236D3C /* zip_set_name.c in Sources */,
+                               4BDC727B15B1B25E00236D3C /* zip_source_buffer.c in Sources */,
+                               4BCB434219E9347E0067FAA3 /* zip_buffer.c in Sources */,
+                               4BDC727C15B1B25E00236D3C /* zip_source_close.c in Sources */,
+                               4BDC727D15B1B25E00236D3C /* zip_source_crc.c in Sources */,
+                               4BDC727E15B1B25E00236D3C /* zip_source_deflate.c in Sources */,
+                               4BDC727F15B1B25E00236D3C /* zip_source_error.c in Sources */,
+                               4BDC728015B1B25E00236D3C /* zip_source_file.c in Sources */,
+                               4BDC728115B1B25E00236D3C /* zip_source_filep.c in Sources */,
+                               4BDC728215B1B25E00236D3C /* zip_source_free.c in Sources */,
+                               4BDC728315B1B25E00236D3C /* zip_source_function.c in Sources */,
+                               4BCF3021199A2F820064207B /* zip_io_util.c in Sources */,
+                               4BDC728415B1B25E00236D3C /* zip_source_layered.c in Sources */,
+                               4BDC728515B1B25E00236D3C /* zip_source_open.c in Sources */,
+                               4BDC728615B1B25E00236D3C /* zip_source_pkware.c in Sources */,
+                               4BDC728815B1B25E00236D3C /* zip_source_read.c in Sources */,
+                               4BDC728915B1B25E00236D3C /* zip_source_stat.c in Sources */,
+                               4BCF302B199A2F820064207B /* zip_source_supports.c in Sources */,
+                               4BDC728A15B1B25E00236D3C /* zip_source_window.c in Sources */,
+                               4BDC728B15B1B25E00236D3C /* zip_source_zip_new.c in Sources */,
+                               4BDC728C15B1B25E00236D3C /* zip_source_zip.c in Sources */,
+                               4BDC728D15B1B25E00236D3C /* zip_stat_index.c in Sources */,
+                               4BDC728E15B1B25E00236D3C /* zip_stat_init.c in Sources */,
+                               4B82CED419915F360097BC18 /* zip_file_set_mtime.c in Sources */,
+                               4BDC728F15B1B25E00236D3C /* zip_stat.c in Sources */,
+                               4BDC729015B1B25E00236D3C /* zip_strerror.c in Sources */,
+                               4BDC729115B1B25E00236D3C /* zip_string.c in Sources */,
+                               4BDC729215B1B25E00236D3C /* zip_unchange_all.c in Sources */,
+                               4BDC729315B1B25E00236D3C /* zip_unchange_archive.c in Sources */,
+                               4BCF3027199A2F820064207B /* zip_source_rollback_write.c in Sources */,
+                               4BCF3036199ABDDA0064207B /* zip_source_seek_write.c in Sources */,
+                               4BDC729415B1B25E00236D3C /* zip_unchange_data.c in Sources */,
+                               4BDC729515B1B25E00236D3C /* zip_unchange.c in Sources */,
+                               4BDC729615B1B25E00236D3C /* zip_utf-8.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+               4B01D72D15B2F5AC002D5007 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4B01D6FC15B2F4B1002D5007 /* zipmerge */;
+                       targetProxy = 4B01D72C15B2F5AC002D5007 /* PBXContainerItemProxy */;
+               };
+               4B01D72F15B2F5AC002D5007 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4B01D70A15B2F4EB002D5007 /* zipcmp */;
+                       targetProxy = 4B01D72E15B2F5AC002D5007 /* PBXContainerItemProxy */;
+               };
+               4B01D73615B2F639002D5007 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4B01D68A15B2F3F1002D5007 /* libzip */;
+                       targetProxy = 4B01D73515B2F639002D5007 /* PBXContainerItemProxy */;
+               };
+               4B01D73815B2F643002D5007 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4B01D68A15B2F3F1002D5007 /* libzip */;
+                       targetProxy = 4B01D73715B2F643002D5007 /* PBXContainerItemProxy */;
+               };
+               4B54447F15C977AF0067BA33 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4B01D72815B2F5A2002D5007 /* command line tools */;
+                       targetProxy = 4B54447E15C977AF0067BA33 /* PBXContainerItemProxy */;
+               };
+               4B54448115C977B10067BA33 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4BACD5A715BC2D8200920691 /* test programs */;
+                       targetProxy = 4B54448015C977B10067BA33 /* PBXContainerItemProxy */;
+               };
+               4BACD59715BC2D3800920691 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4B01D68A15B2F3F1002D5007 /* libzip */;
+                       targetProxy = 4BACD59615BC2D3800920691 /* PBXContainerItemProxy */;
+               };
+               4BACD5B215BC2DB300920691 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4BACD58815BC2CEA00920691 /* modify */;
+                       targetProxy = 4BACD5B115BC2DB300920691 /* PBXContainerItemProxy */;
+               };
+               4BACD5B615BC2DC900920691 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4B01D68A15B2F3F1002D5007 /* libzip */;
+                       targetProxy = 4BACD5B715BC2DC900920691 /* PBXContainerItemProxy */;
+               };
+               4BACD5C515BC2DF200920691 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4B01D68A15B2F3F1002D5007 /* libzip */;
+                       targetProxy = 4BACD5C615BC2DF200920691 /* PBXContainerItemProxy */;
+               };
+               4BACD5D415BC2F3700920691 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4B01D68A15B2F3F1002D5007 /* libzip */;
+                       targetProxy = 4BACD5D515BC2F3700920691 /* PBXContainerItemProxy */;
+               };
+               4BACD64615BC301300920691 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4B01D68A15B2F3F1002D5007 /* libzip */;
+                       targetProxy = 4BACD64715BC301300920691 /* PBXContainerItemProxy */;
+               };
+               4BACD65515BC303B00920691 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4BACD5B515BC2DC900920691 /* add_from_filep */;
+                       targetProxy = 4BACD65415BC303B00920691 /* PBXContainerItemProxy */;
+               };
+               4BACD65715BC303B00920691 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4BACD5C415BC2DF200920691 /* fopen_unchanged */;
+                       targetProxy = 4BACD65615BC303B00920691 /* PBXContainerItemProxy */;
+               };
+               4BACD65915BC303B00920691 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4BACD5D315BC2F3700920691 /* fread */;
+                       targetProxy = 4BACD65815BC303B00920691 /* PBXContainerItemProxy */;
+               };
+               4BACD66915BC303B00920691 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4BACD64515BC301300920691 /* tryopen */;
+                       targetProxy = 4BACD66815BC303B00920691 /* PBXContainerItemProxy */;
+               };
+               4BD6CB6019E71CD100710654 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4B01D68A15B2F3F1002D5007 /* libzip */;
+                       targetProxy = 4BD6CB6119E71CD100710654 /* PBXContainerItemProxy */;
+               };
+               4BD6CB6E19E71D0800710654 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 4BD6CB5F19E71CD100710654 /* hole */;
+                       targetProxy = 4BD6CB6D19E71D0800710654 /* PBXContainerItemProxy */;
+               };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+               4B01D69C15B2F3F1002D5007 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
+                               CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
+                               COMBINE_HIDPI_IMAGES = YES;
+                               DYLIB_COMPATIBILITY_VERSION = 1;
+                               DYLIB_CURRENT_VERSION = 1;
+                               FRAMEWORK_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+                               );
+                               FRAMEWORK_VERSION = A;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_PRECOMPILE_PREFIX_HEADER = NO;
+                               GCC_PREFIX_HEADER = "";
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
+                               GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+                               GCC_WARN_PEDANTIC = YES;
+                               GCC_WARN_SHADOW = YES;
+                               GCC_WARN_SIGN_COMPARE = YES;
+                               INFOPLIST_FILE = Info.plist;
+                               INSTALL_PATH = "@rpath";
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                               VERSION_INFO_BUILDER = "";
+                               VERSION_INFO_FILE = "";
+                               WRAPPER_EXTENSION = framework;
+                       };
+                       name = Debug;
+               };
+               4B01D69D15B2F3F1002D5007 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
+                               CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
+                               COMBINE_HIDPI_IMAGES = YES;
+                               DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               DYLIB_COMPATIBILITY_VERSION = 1;
+                               DYLIB_CURRENT_VERSION = 1;
+                               FRAMEWORK_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+                               );
+                               FRAMEWORK_VERSION = A;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_PRECOMPILE_PREFIX_HEADER = NO;
+                               GCC_PREFIX_HEADER = "";
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
+                               GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+                               GCC_WARN_PEDANTIC = YES;
+                               GCC_WARN_SHADOW = YES;
+                               GCC_WARN_SIGN_COMPARE = YES;
+                               INFOPLIST_FILE = Info.plist;
+                               INSTALL_PATH = "@rpath";
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                               VERSION_INFO_BUILDER = "";
+                               VERSION_INFO_FILE = "";
+                               WRAPPER_EXTENSION = framework;
+                       };
+                       name = Release;
+               };
+               4B01D70515B2F4B1002D5007 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
+                               CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
+                               GCC_C_LANGUAGE_STANDARD = c99;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
+                               GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+                               GCC_WARN_PEDANTIC = YES;
+                               GCC_WARN_SHADOW = YES;
+                               GCC_WARN_SIGN_COMPARE = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Debug;
+               };
+               4B01D70615B2F4B1002D5007 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
+                               CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
+                               DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               GCC_C_LANGUAGE_STANDARD = c99;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
+                               GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+                               GCC_WARN_PEDANTIC = YES;
+                               GCC_WARN_SHADOW = YES;
+                               GCC_WARN_SIGN_COMPARE = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Release;
+               };
+               4B01D71115B2F4EB002D5007 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = zipcmp;
+                       };
+                       name = Debug;
+               };
+               4B01D71215B2F4EB002D5007 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = zipcmp;
+                       };
+                       name = Release;
+               };
+               4B01D72A15B2F5A2002D5007 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Debug;
+               };
+               4B01D72B15B2F5A2002D5007 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Release;
+               };
+               4B54447A15C977A20067BA33 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Debug;
+               };
+               4B54447B15C977A20067BA33 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Release;
+               };
+               4BACD59115BC2CEA00920691 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Debug;
+               };
+               4BACD59215BC2CEA00920691 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Release;
+               };
+               4BACD5AF15BC2D8200920691 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
+                               PRODUCT_NAME = "command line tools copy";
+                       };
+                       name = Debug;
+               };
+               4BACD5B015BC2D8200920691 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
+                               PRODUCT_NAME = "command line tools copy";
+                       };
+                       name = Release;
+               };
+               4BACD5BF15BC2DC900920691 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = add_from_filep;
+                       };
+                       name = Debug;
+               };
+               4BACD5C015BC2DC900920691 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = add_from_filep;
+                       };
+                       name = Release;
+               };
+               4BACD5CE15BC2DF200920691 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = fopen_unchanged;
+                       };
+                       name = Debug;
+               };
+               4BACD5CF15BC2DF200920691 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = fopen_unchanged;
+                       };
+                       name = Release;
+               };
+               4BACD5DD15BC2F3700920691 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = fread;
+                       };
+                       name = Debug;
+               };
+               4BACD5DE15BC2F3700920691 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = fread;
+                       };
+                       name = Release;
+               };
+               4BACD64E15BC301300920691 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = tryopen;
+                       };
+                       name = Debug;
+               };
+               4BACD64F15BC301300920691 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = tryopen;
+                       };
+                       name = Release;
+               };
+               4BD6CB6A19E71CD100710654 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = hole;
+                       };
+                       name = Debug;
+               };
+               4BD6CB6B19E71CD100710654 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = YES;
+                               DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+                               PRODUCT_NAME = hole;
+                       };
+                       name = Release;
+               };
+               4BDC71D315B181DA00236D3C /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = NO;
+                               CLANG_ENABLE_OBJC_ARC = YES;
+                               CLANG_WARN_BOOL_CONVERSION = YES;
+                               CLANG_WARN_CONSTANT_CONVERSION = YES;
+                               CLANG_WARN_EMPTY_BODY = YES;
+                               CLANG_WARN_ENUM_CONVERSION = YES;
+                               CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
+                               CLANG_WARN_INT_CONVERSION = YES;
+                               CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
+                               CLANG_WARN_UNREACHABLE_CODE = YES;
+                               CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+                               COPY_PHASE_STRIP = NO;
+                               ENABLE_STRICT_OBJC_MSGSEND = YES;
+                               GCC_C_LANGUAGE_STANDARD = gnu99;
+                               GCC_DYNAMIC_NO_PIC = NO;
+                               GCC_NO_COMMON_BLOCKS = YES;
+                               GCC_OPTIMIZATION_LEVEL = 0;
+                               GCC_PREPROCESSOR_DEFINITIONS = "HAVE_CONFIG_H=1";
+                               GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+                               GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
+                               GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+                               GCC_WARN_ABOUT_RETURN_TYPE = YES;
+                               GCC_WARN_SHADOW = YES;
+                               GCC_WARN_SIGN_COMPARE = YES;
+                               GCC_WARN_UNDECLARED_SELECTOR = YES;
+                               GCC_WARN_UNINITIALIZED_AUTOS = YES;
+                               GCC_WARN_UNUSED_FUNCTION = YES;
+                               GCC_WARN_UNUSED_VARIABLE = YES;
+                               IPHONEOS_DEPLOYMENT_TARGET = 5.1;
+                               MACOSX_DEPLOYMENT_TARGET = 10.6;
+                               ONLY_ACTIVE_ARCH = YES;
+                               SDKROOT = macosx;
+                       };
+                       name = Debug;
+               };
+               4BDC71D415B181DA00236D3C /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = NO;
+                               CLANG_ENABLE_OBJC_ARC = YES;
+                               CLANG_WARN_BOOL_CONVERSION = YES;
+                               CLANG_WARN_CONSTANT_CONVERSION = YES;
+                               CLANG_WARN_EMPTY_BODY = YES;
+                               CLANG_WARN_ENUM_CONVERSION = YES;
+                               CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
+                               CLANG_WARN_INT_CONVERSION = YES;
+                               CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
+                               CLANG_WARN_UNREACHABLE_CODE = YES;
+                               CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+                               COPY_PHASE_STRIP = YES;
+                               ENABLE_STRICT_OBJC_MSGSEND = YES;
+                               GCC_C_LANGUAGE_STANDARD = gnu99;
+                               GCC_NO_COMMON_BLOCKS = YES;
+                               GCC_PREPROCESSOR_DEFINITIONS = "HAVE_CONFIG_H=1";
+                               GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
+                               GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+                               GCC_WARN_ABOUT_RETURN_TYPE = YES;
+                               GCC_WARN_SHADOW = YES;
+                               GCC_WARN_SIGN_COMPARE = YES;
+                               GCC_WARN_UNDECLARED_SELECTOR = YES;
+                               GCC_WARN_UNINITIALIZED_AUTOS = YES;
+                               GCC_WARN_UNUSED_FUNCTION = YES;
+                               GCC_WARN_UNUSED_VARIABLE = YES;
+                               IPHONEOS_DEPLOYMENT_TARGET = 5.1;
+                               MACOSX_DEPLOYMENT_TARGET = 10.6;
+                               SDKROOT = macosx;
+                               VALIDATE_PRODUCT = YES;
+                       };
+                       name = Release;
+               };
+               4BDC71EB15B182B200236D3C /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
+                               COPY_PHASE_STRIP = YES;
+                               GCC_C_LANGUAGE_STANDARD = c99;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+                               GCC_WARN_PEDANTIC = YES;
+                               GCC_WARN_SIGN_COMPARE = YES;
+                               INFOPLIST_FILE = Info.plist;
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles";
+                               LINK_WITH_STANDARD_LIBRARIES = NO;
+                               MACH_O_TYPE = mh_object;
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                               RUN_CLANG_STATIC_ANALYZER = YES;
+                               SDKROOT = iphoneos;
+                               WRAPPER_EXTENSION = framework;
+                       };
+                       name = Debug;
+               };
+               4BDC71EC15B182B200236D3C /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
+                               DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               GCC_C_LANGUAGE_STANDARD = c99;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+                               GCC_WARN_PEDANTIC = YES;
+                               GCC_WARN_SIGN_COMPARE = YES;
+                               INFOPLIST_FILE = Info.plist;
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles";
+                               LINK_WITH_STANDARD_LIBRARIES = NO;
+                               MACH_O_TYPE = mh_object;
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                               RUN_CLANG_STATIC_ANALYZER = YES;
+                               SDKROOT = iphoneos;
+                               WRAPPER_EXTENSION = framework;
+                       };
+                       name = Release;
+               };
+               4BDC72A315B1B6EA00236D3C /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Debug;
+               };
+               4BDC72A415B1B6EA00236D3C /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Release;
+               };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+               4B01D69E15B2F3F1002D5007 /* Build configuration list for PBXNativeTarget "libzip" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4B01D69C15B2F3F1002D5007 /* Debug */,
+                               4B01D69D15B2F3F1002D5007 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4B01D70415B2F4B1002D5007 /* Build configuration list for PBXNativeTarget "zipmerge" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4B01D70515B2F4B1002D5007 /* Debug */,
+                               4B01D70615B2F4B1002D5007 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4B01D71015B2F4EB002D5007 /* Build configuration list for PBXNativeTarget "zipcmp" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4B01D71115B2F4EB002D5007 /* Debug */,
+                               4B01D71215B2F4EB002D5007 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4B01D72915B2F5A2002D5007 /* Build configuration list for PBXAggregateTarget "command line tools" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4B01D72A15B2F5A2002D5007 /* Debug */,
+                               4B01D72B15B2F5A2002D5007 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4B54447C15C977A20067BA33 /* Build configuration list for PBXAggregateTarget "all" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4B54447A15C977A20067BA33 /* Debug */,
+                               4B54447B15C977A20067BA33 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4BACD59015BC2CEA00920691 /* Build configuration list for PBXNativeTarget "modify" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4BACD59115BC2CEA00920691 /* Debug */,
+                               4BACD59215BC2CEA00920691 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4BACD5AE15BC2D8200920691 /* Build configuration list for PBXAggregateTarget "test programs" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4BACD5AF15BC2D8200920691 /* Debug */,
+                               4BACD5B015BC2D8200920691 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4BACD5BE15BC2DC900920691 /* Build configuration list for PBXNativeTarget "add_from_filep" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4BACD5BF15BC2DC900920691 /* Debug */,
+                               4BACD5C015BC2DC900920691 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4BACD5CD15BC2DF200920691 /* Build configuration list for PBXNativeTarget "fopen_unchanged" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4BACD5CE15BC2DF200920691 /* Debug */,
+                               4BACD5CF15BC2DF200920691 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4BACD5DC15BC2F3700920691 /* Build configuration list for PBXNativeTarget "fread" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4BACD5DD15BC2F3700920691 /* Debug */,
+                               4BACD5DE15BC2F3700920691 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4BACD64D15BC301300920691 /* Build configuration list for PBXNativeTarget "tryopen" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4BACD64E15BC301300920691 /* Debug */,
+                               4BACD64F15BC301300920691 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4BD6CB6919E71CD100710654 /* Build configuration list for PBXNativeTarget "hole" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4BD6CB6A19E71CD100710654 /* Debug */,
+                               4BD6CB6B19E71CD100710654 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4BDC71C215B181DA00236D3C /* Build configuration list for PBXProject "libzip" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4BDC71D315B181DA00236D3C /* Debug */,
+                               4BDC71D415B181DA00236D3C /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4BDC71EA15B182B200236D3C /* Build configuration list for PBXNativeTarget "libzip_iOS" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4BDC71EB15B182B200236D3C /* Debug */,
+                               4BDC71EC15B182B200236D3C /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4BDC72A215B1B6EA00236D3C /* Build configuration list for PBXAggregateTarget "Build iOS Framework" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               4BDC72A315B1B6EA00236D3C /* Debug */,
+                               4BDC72A415B1B6EA00236D3C /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+/* End XCConfigurationList section */
+       };
+       rootObject = 4BDC71BF15B181DA00236D3C /* Project object */;
+}
diff --git a/xcode/libzip.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/xcode/libzip.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644 (file)
index 0000000..a302587
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:libzip.xcodeproj">
+   </FileRef>
+</Workspace>
similarity index 93%
rename from lib/zipconf.h
rename to xcode/zipconf.h
index b65d91e..763f0ec 100644 (file)
@@ -8,9 +8,9 @@
    based on ../config.h.
  */
 
-#define LIBZIP_VERSION "0.10.1"
+#define LIBZIP_VERSION "0.11"
 #define LIBZIP_VERSION_MAJOR 0
-#define LIBZIP_VERSION_MINOR 10
+#define LIBZIP_VERSION_MINOR 11
 #define LIBZIP_VERSION_MICRO 0
 
 #include <inttypes.h>