+ struct zip_member *member = &zw->members[zw->n_members++];
+ member->offset = zw->m_start;
+ member->size = zw->m_size;
+ member->crc = zw->m_crc;
+ member->name = zw->m_name;
+
+ zw->m_name = NULL;
+ zw->m_start = zw->m_size = zw->m_crc = 0;
+}
+
+/* Adds the contents of FILE, with name MEMBER_NAME, to ZW. */
+void
+zip_writer_add (struct zip_writer *zw, FILE *file, const char *member_name)
+{
+ zip_writer_add_start (zw, member_name);
+
+ fseeko (file, 0, SEEK_SET);
+ for (;;)
+ {
+ char buf[4096];
+ size_t n = fread (buf, 1, sizeof buf, file);
+ if (!n)
+ break;
+ zip_writer_add_write (zw, buf, n);
+ }
+ zip_writer_add_finish (zw);
+}
+
+/* Adds a member named MEMBER_NAME whose contents is the null-terminated string
+ CONTENT. */
+void
+zip_writer_add_string (struct zip_writer *zw, const char *member_name,
+ const char *content)
+{
+ zip_writer_add_memory (zw, member_name, content, strlen (content));
+}
+
+/* Adds a member named MEMBER_NAME whose contents is the SIZE bytes of
+ CONTENT. */
+void
+zip_writer_add_memory (struct zip_writer *zw, const char *member_name,
+ const void *content, size_t size)
+{
+ zip_writer_add_start (zw, member_name);
+ zip_writer_add_write (zw, content, size);
+ zip_writer_add_finish (zw);