From: Marco Costalba <mcostalba@gmail.com>
To: gitster@pobox.com
Cc: git@vger.kernel.org, Marco Costalba <mcostalba@gmail.com>
Subject: [PATCH 11/11] Convert sha1_file.c to use decompress helpers
Date: Sat, 2 Feb 2008 12:35:56 +0100 [thread overview]
Message-ID: <1201952156-6764-11-git-send-email-mcostalba@gmail.com> (raw)
In-Reply-To: <1201952156-6764-10-git-send-email-mcostalba@gmail.com>
This is "The King".
It is the most difficult file to convert and some
decompression functions have been created just for it.
Anyhow the lines of code removed (45) far surpass the
ones added (26).
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
---
sha1_file.c | 71 +++++++++++++++++++++-------------------------------------
1 files changed, 26 insertions(+), 45 deletions(-)
diff --git a/sha1_file.c b/sha1_file.c
index f48ad04..6500871 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -1079,16 +1079,11 @@ static int unpack_sha1_header(z_stream *stream, unsigned char *map, unsigned lon
enum object_type type;
/* Get the data stream */
- memset(stream, 0, sizeof(*stream));
- stream->next_in = map;
- stream->avail_in = mapsize;
- stream->next_out = buffer;
- stream->avail_out = bufsiz;
+ decompress_alloc(stream);
+ decompress_into(stream, buffer, bufsiz);
- if (legacy_loose_object(map)) {
- inflateInit(stream);
- return inflate(stream, 0);
- }
+ if (legacy_loose_object(map))
+ return decompress_next_from(stream, map, mapsize, Z_NO_FLUSH);
/*
@@ -1105,9 +1100,7 @@ static int unpack_sha1_header(z_stream *stream, unsigned char *map, unsigned lon
mapsize -= used;
/* Set up the stream for the rest.. */
- stream->next_in = map;
- stream->avail_in = mapsize;
- inflateInit(stream);
+ decompress_from(stream, map, mapsize);
/* And generate the fake traditional header */
stream->total_out = 1 + snprintf(buffer, bufsiz, "%s %lu",
@@ -1141,14 +1134,13 @@ static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size
* we also want to check that zlib tells us that all
* went well with status == Z_STREAM_END at the end.
*/
- stream->next_out = buf + bytes;
- stream->avail_out = size - bytes;
+ decompress_into(stream, buf + bytes, size - bytes);
while (status == Z_OK)
- status = inflate(stream, Z_FINISH);
+ status = decompress_next(stream, Z_FINISH);
}
buf[size] = 0;
if (status == Z_STREAM_END && !stream->avail_in) {
- inflateEnd(stream);
+ decompress_free(stream);
return buf;
}
@@ -1233,20 +1225,18 @@ unsigned long get_size_from_delta(struct packed_git *p,
unsigned char delta_head[20], *in;
z_stream stream;
int st;
+ unsigned int in_size = 0;
- memset(&stream, 0, sizeof(stream));
- stream.next_out = delta_head;
- stream.avail_out = sizeof(delta_head);
+ decompress_alloc(&stream);
+ decompress_into(&stream, delta_head, sizeof(delta_head));
- inflateInit(&stream);
do {
- in = use_pack(p, w_curs, curpos, &stream.avail_in);
- stream.next_in = in;
- st = inflate(&stream, Z_FINISH);
+ in = use_pack(p, w_curs, curpos, &in_size);
+ st = decompress_next_from(&stream, in, in_size, Z_FINISH);
curpos += stream.next_in - in;
} while ((st == Z_OK || st == Z_BUF_ERROR) &&
stream.total_out < sizeof(delta_head));
- inflateEnd(&stream);
+ decompress_free(&stream);
if ((st != Z_STREAM_END) && stream.total_out != sizeof(delta_head))
die("delta data unpack-initial failed");
@@ -1323,7 +1313,7 @@ static int packed_delta_info(struct packed_git *p,
/* We choose to only get the type of the base object and
* ignore potentially corrupt pack file that expects the delta
* based on a base with a wrong size. This saves tons of
- * inflate() calls.
+ * decompress() calls.
*/
if (sizep)
*sizep = get_size_from_delta(p, w_curs, curpos);
@@ -1444,21 +1434,18 @@ static void *unpack_compressed_entry(struct packed_git *p,
int st;
z_stream stream;
unsigned char *buffer, *in;
+ unsigned int in_size = 0;
buffer = xmalloc(size + 1);
buffer[size] = 0;
- memset(&stream, 0, sizeof(stream));
- stream.next_out = buffer;
- stream.avail_out = size;
-
- inflateInit(&stream);
+ decompress_alloc(&stream);
+ decompress_into(&stream, buffer, size);
do {
- in = use_pack(p, w_curs, curpos, &stream.avail_in);
- stream.next_in = in;
- st = inflate(&stream, Z_FINISH);
+ in = use_pack(p, w_curs, curpos, &in_size);
+ st = decompress_next_from(&stream, in, in_size, Z_FINISH);
curpos += stream.next_in - in;
} while (st == Z_OK || st == Z_BUF_ERROR);
- inflateEnd(&stream);
+ decompress_free(&stream);
if ((st != Z_STREAM_END) || stream.total_out != size) {
free(buffer);
return NULL;
@@ -1804,7 +1791,7 @@ static int sha1_loose_object_info(const unsigned char *sha1, unsigned long *size
status = error("unable to parse %s header", sha1_to_hex(sha1));
else if (sizep)
*sizep = size;
- inflateEnd(&stream);
+ decompress_free(&stream);
munmap(map, mapsize);
return status;
}
@@ -2212,21 +2199,15 @@ int write_sha1_from_fd(const unsigned char *sha1, int fd, char *buffer,
return error("unable to create temporary sha1 filename %s: %s\n", tmpfile, strerror(errno));
}
- memset(&stream, 0, sizeof(stream));
-
- inflateInit(&stream);
-
+ decompress_alloc(&stream);
SHA1_Init(&c);
do {
ssize_t size;
if (*bufposn) {
- stream.avail_in = *bufposn;
- stream.next_in = (unsigned char *) buffer;
+ decompress_from(&stream, (unsigned char *) buffer, *bufposn);
do {
- stream.next_out = discard;
- stream.avail_out = sizeof(discard);
- ret = inflate(&stream, Z_SYNC_FLUSH);
+ ret = decompress_next_into(&stream, discard, sizeof(discard), Z_SYNC_FLUSH);
SHA1_Update(&c, discard, sizeof(discard) -
stream.avail_out);
} while (stream.avail_in && ret == Z_OK);
@@ -2249,7 +2230,7 @@ int write_sha1_from_fd(const unsigned char *sha1, int fd, char *buffer,
}
*bufposn += size;
} while (1);
- inflateEnd(&stream);
+ decompress_free(&stream);
fchmod(local, 0444);
if (close(local) != 0)
--
1.5.4.rc4.39.g524a
next prev parent reply other threads:[~2008-02-02 11:38 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-02 11:35 [PATCH 01/11] Introduce stream compress helpers Marco Costalba
2008-02-02 11:35 ` [PATCH 02/11] Use new compress helpers in git files Marco Costalba
2008-02-02 11:35 ` [PATCH 03/11] Use new compress helpers in fast-import Marco Costalba
2008-02-02 11:35 ` [PATCH 04/11] Use new compress helpers in http-push.c Marco Costalba
2008-02-02 11:35 ` [PATCH 05/11] Use new compress helpers in sha1_file.c Marco Costalba
2008-02-02 11:35 ` [PATCH 06/11] Better error handling in compress_all() Marco Costalba
2008-02-02 11:35 ` [PATCH 07/11] Introduce stream decompress helpers Marco Costalba
2008-02-02 11:35 ` [PATCH 08/11] Use new decompress_all() helper in git Marco Costalba
2008-02-02 11:35 ` [PATCH 09/11] Convert http-push.c and http-walker.c Marco Costalba
2008-02-02 11:35 ` [PATCH 10/11] Convert builtin-pack/unpack Marco Costalba
2008-02-02 11:35 ` Marco Costalba [this message]
2008-02-04 2:08 ` Junio C Hamano
2008-02-04 2:07 ` [PATCH 08/11] Use new decompress_all() helper in git Junio C Hamano
2008-02-04 2:07 ` [PATCH 07/11] Introduce stream decompress helpers Junio C Hamano
2008-02-03 22:54 ` [PATCH 06/11] Better error handling in compress_all() Junio C Hamano
2008-02-03 22:53 ` [PATCH 04/11] Use new compress helpers in http-push.c Junio C Hamano
2008-02-03 22:53 ` [PATCH 03/11] Use new compress helpers in fast-import Junio C Hamano
2008-02-04 1:48 ` Shawn O. Pearce
2008-02-04 1:41 ` Shawn O. Pearce
2008-02-03 22:54 ` [PATCH 02/11] Use new compress helpers in git files Junio C Hamano
2008-02-03 22:53 ` [PATCH 01/11] Introduce stream compress helpers Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1201952156-6764-11-git-send-email-mcostalba@gmail.com \
--to=mcostalba@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).