Convert TODO to markdown.
diff --git a/TODO b/TODO
deleted file mode 100644
index 3dca4ec..0000000
--- a/TODO
+++ /dev/null
@@ -1,170 +0,0 @@
-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)
-* check arguments for every entry point into libzip
-
-
-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
-* configure: use windows backends on windows
-* add append-only mode writing file to disk incrementally to keep memory usage low
-* zip_file_set_mtime: support InfoZIP time stamps
-
-* 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_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?????
-
-
-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)
-* 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
-================
-* unchange on added file
-* test seek in zip_source_crc
-* 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
-	add w/ existing file name [E]
-	replace ok
-	replace w/ illegal index [E]
-	replace w/ deleted name [E]
-	unchange added/replaced file
-* (close)
-	copy zip file
-	open copy
-	rename, delete, replace, add w/ new name, add w/ deleted name
-	close
-	zipcmp copy expected
-	remove copy
-* (error_get)
-* (error_get_sys_type)
-* (error_to_str)
-* (extra_fields)
-* (file_error_get)
-* (file_strerror)
-* (replace)
-* (source_buffer)
-* (source_file)
-* (source_filep)
-* (source_free)
-* (source_function)
-* (source_zip)
-* (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
diff --git a/TODO.md b/TODO.md
new file mode 100644
index 0000000..cf9dce2
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,170 @@
+# API Plans
+
+## Encryption
+
+````c
+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.
+````c
+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.
+
+````c
+typedef void (*zip_progress_callback_t)(double);
+void zip_register_progress_callback(zip_t *, zip_progress_callback_t);
+````
+
+# API Issues
+
+* `zip_get_archive_comment` has `int *lenp` argument.  Cleaner would be `zip_uint32_t *`.
+  rename and fix.  which other functions for naming consistency?
+* 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)
+* check arguments for every entry point into libzip
+
+# 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
+* configure: use windows backends on windows
+* add append-only mode writing file to disk incrementally to keep memory usage low
+* `zip_file_set_mtime()`: support InfoZIP time stamps
+
+* support streaming output (creating new archive to e.g. stdout)
+* add functions to:
+  * read/set ASCII file flag? (more general options?)
+* `zip_commit()` (to finish changes without closing archive)
+* add custom compression function support
+* `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?????
+
+# 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)
+* 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
+
+* unchange on added file
+* test seek in `zip_source_crc()`
+* 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 ziptool
+* 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
+  * add w/ existing file name [E]
+  * replace ok
+  * replace w/ illegal index [E]
+  * replace w/ deleted name [E]
+  * unchange added/replaced file
+* (close)
+  * copy zip file
+  * open copy
+  * rename, delete, replace, add w/ new name, add w/ deleted name
+  * close
+  * zipcmp copy expected
+  * remove copy
+* (error_get)
+* (error_get_sys_type)
+* (error_to_str)
+* (extra_fields)
+* (file_error_get)
+* (file_strerror)
+* (replace)
+* (source_buffer)
+* (source_file)
+* (source_filep)
+* (source_free)
+* (source_function)
+* (source_zip)
+* (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
+
+* 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