@matheusbsbs / matheus-bagliano / commits / 30ebb40aa1
Fork 0

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 {