archive-zip: factor out helpers for writing sizes and CRC

We're going to reuse them soon for streaming. Also, update the ZIP directory only at the very end, which will also make streaming easier. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

René Scharfe committed May 3, 2012 at 08:51 UTC ebf5374afa87afa334b040faec35144c2a3d03d5
1 file changed +28 -11
archive-zip.c
+28 -11
@@ -120,6 +120,26 @@ static void *zlib_deflate(void *data, unsigned long size,
120 return buffer;
121 }
122
123 +static void set_zip_dir_data_desc(struct zip_dir_header *header,
124 + unsigned long size,
125 + unsigned long compressed_size,
126 + unsigned long crc)
127 +{
128 + copy_le32(header->crc32, crc);
129 + copy_le32(header->compressed_size, compressed_size);
130 + copy_le32(header->size, size);
131 +}
132 +
133 +static void set_zip_header_data_desc(struct zip_local_header *header,
134 + unsigned long size,
135 + unsigned long compressed_size,
136 + unsigned long crc)
137 +{
138 + copy_le32(header->crc32, crc);
139 + copy_le32(header->compressed_size, compressed_size);
140 + copy_le32(header->size, size);
141 +}
142 +
143 static int write_zip_entry(struct archiver_args *args,
144 const unsigned char *sha1,
145 const char *path, size_t pathlen,
@@ -200,9 +220,7 @@ static int write_zip_entry(struct archiver_args *args,
220 copy_le16(dirent.compression_method, method);
221 copy_le16(dirent.mtime, zip_time);
222 copy_le16(dirent.mdate, zip_date);
203 - copy_le32(dirent.crc32, crc);
204 - copy_le32(dirent.compressed_size, compressed_size);
205 - copy_le32(dirent.size, size);
223 + set_zip_dir_data_desc(&dirent, size, compressed_size, crc);
224 copy_le16(dirent.filename_length, pathlen);
225 copy_le16(dirent.extra_length, 0);
226 copy_le16(dirent.comment_length, 0);
@@ -210,11 +228,6 @@ static int write_zip_entry(struct archiver_args *args,
228 copy_le16(dirent.attr1, 0);
229 copy_le32(dirent.attr2, attr2);
230 copy_le32(dirent.offset, zip_offset);
213 - memcpy(zip_dir + zip_dir_offset, &dirent, ZIP_DIR_HEADER_SIZE);
214 - zip_dir_offset += ZIP_DIR_HEADER_SIZE;
215 - memcpy(zip_dir + zip_dir_offset, path, pathlen);
216 - zip_dir_offset += pathlen;
217 - zip_dir_entries++;
231
232 copy_le32(header.magic, 0x04034b50);
233 copy_le16(header.version, 10);
@@ -222,9 +235,7 @@ static int write_zip_entry(struct archiver_args *args,
235 copy_le16(header.compression_method, method);
236 copy_le16(header.mtime, zip_time);
237 copy_le16(header.mdate, zip_date);
225 - copy_le32(header.crc32, crc);
226 - copy_le32(header.compressed_size, compressed_size);
227 - copy_le32(header.size, size);
238 + set_zip_header_data_desc(&header, size, compressed_size, crc);
239 copy_le16(header.filename_length, pathlen);
240 copy_le16(header.extra_length, 0);
241 write_or_die(1, &header, ZIP_LOCAL_HEADER_SIZE);
@@ -239,6 +250,12 @@ static int write_zip_entry(struct archiver_args *args,
250 free(deflated);
251 free(buffer);
252
253 + memcpy(zip_dir + zip_dir_offset, &dirent, ZIP_DIR_HEADER_SIZE);
254 + zip_dir_offset += ZIP_DIR_HEADER_SIZE;
255 + memcpy(zip_dir + zip_dir_offset, path, pathlen);
256 + zip_dir_offset += pathlen;
257 + zip_dir_entries++;
258 +
259 return 0;
260 }
261