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