pack-objects: move compression code in a separate function
A later patch will make use of that code too. Signed-off-by: Nicolas Pitre <nico@cam.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Nicolas Pitre committed
May 2, 2008 at 15:11 UTC
30ebb40aa1acdccbebe3a04cfb198b2b6f033afc
1 file changed
+29
-24
builtin-pack-objects.c
+29
-24
@@ -124,6 +124,32 @@ static void *get_delta(struct object_entry *entry)
124
return delta_buf;
125
}
126
127
+static unsigned long do_compress(void **pptr, unsigned long size)
128
+{
129
+ z_stream stream;
130
+ void *in, *out;
131
+ unsigned long maxsize;
132
+
133
+ memset(&stream, 0, sizeof(stream));
134
+ deflateInit(&stream, pack_compression_level);
135
+ maxsize = deflateBound(&stream, size);
136
+
137
+ in = *pptr;
138
+ out = xmalloc(maxsize);
139
+ *pptr = out;
140
+
141
+ stream.next_in = in;
142
+ stream.avail_in = size;
143
+ stream.next_out = out;
144
+ stream.avail_out = maxsize;
145
+ while (deflate(&stream, Z_FINISH) == Z_OK)
146
+ ; /* nothing */
147
+ deflateEnd(&stream);
148
+
149
+ free(in);
150
+ return stream.total_out;
151
+}
152
+
153
/*
154
* The per-object header is a pretty dense thing, which is
155
* - first byte: low four bits are "size", then three bits of "type",
@@ -226,11 +252,10 @@ static unsigned long write_object(struct sha1file *f,
252
struct object_entry *entry,
253
off_t write_offset)
254
{
229
- unsigned long size, limit;
255
+ unsigned long size, limit, datalen;
256
void *buf;
257
unsigned char header[10], dheader[10];
258
unsigned hdrlen;
233
- off_t datalen;
259
enum object_type type;
260
int usable_delta, to_reuse;
261
@@ -272,9 +297,6 @@ static unsigned long write_object(struct sha1file *f,
297
*/
298
299
if (!to_reuse) {
275
- z_stream stream;
276
- unsigned long maxsize;
277
- void *out;
300
if (!usable_delta) {
301
buf = read_sha1_file(entry->idx.sha1, &type, &size);
302
if (!buf)
@@ -291,20 +313,7 @@ static unsigned long write_object(struct sha1file *f,
313
type = (allow_ofs_delta && entry->delta->idx.offset) ?
314
OBJ_OFS_DELTA : OBJ_REF_DELTA;
315
}
294
- /* compress the data to store and put compressed length in datalen */
295
- memset(&stream, 0, sizeof(stream));
296
- deflateInit(&stream, pack_compression_level);
297
- maxsize = deflateBound(&stream, size);
298
- out = xmalloc(maxsize);
299
- /* Compress it */
300
- stream.next_in = buf;
301
- stream.avail_in = size;
302
- stream.next_out = out;
303
- stream.avail_out = maxsize;
304
- while (deflate(&stream, Z_FINISH) == Z_OK)
305
- /* nothing */;
306
- deflateEnd(&stream);
307
- datalen = stream.total_out;
316
+ datalen = do_compress(&buf, size);
317
318
/*
319
* The object header is a byte of 'type' followed by zero or
@@ -324,7 +333,6 @@ static unsigned long write_object(struct sha1file *f,
333
while (ofs >>= 7)
334
dheader[--pos] = 128 | (--ofs & 127);
335
if (limit && hdrlen + sizeof(dheader) - pos + datalen + 20 >= limit) {
327
- free(out);
336
free(buf);
337
return 0;
338
}
@@ -337,7 +345,6 @@ static unsigned long write_object(struct sha1file *f,
345
* an additional 20 bytes for the base sha1.
346
*/
347
if (limit && hdrlen + 20 + datalen + 20 >= limit) {
340
- free(out);
348
free(buf);
349
return 0;
350
}
@@ -346,14 +353,12 @@ static unsigned long write_object(struct sha1file *f,
353
hdrlen += 20;
354
} else {
355
if (limit && hdrlen + datalen + 20 >= limit) {
349
- free(out);
356
free(buf);
357
return 0;
358
}
359
sha1write(f, header, hdrlen);
360
}
355
- sha1write(f, out, datalen);
356
- free(out);
361
+ sha1write(f, buf, datalen);
362
free(buf);
363
}
364
else {