summaryrefslogtreecommitdiff
path: root/sha1_file.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-25 17:19:53 (GMT)
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-25 17:19:53 (GMT)
commita44c9a5e2e6d4108452f2c64dbd11f74a83745af (patch)
treeaa4796d8d4ae8c6c64bf9bd4b2d657571c67d4e4 /sha1_file.c
parente6948b6d88c69a864e9c461911287c5cc5932a3b (diff)
downloadgit-a44c9a5e2e6d4108452f2c64dbd11f74a83745af.zip
git-a44c9a5e2e6d4108452f2c64dbd11f74a83745af.tar.gz
git-a44c9a5e2e6d4108452f2c64dbd11f74a83745af.tar.bz2
Simplify "write_sha1_file()" interfaces
The write function now adds the header to the file by itself, so there is no reason to duplicate it among all the users any more.
Diffstat (limited to 'sha1_file.c')
-rw-r--r--sha1_file.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 28ad159..d2f38f0 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -155,8 +155,8 @@ void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned l
inflateInit(&stream);
ret = inflate(&stream, 0);
- if (ret < Z_OK)
- return NULL;
+ if (ret < Z_OK)
+ return NULL;
if (sscanf(buffer, "%10s %lu", type, size) != 2)
return NULL;
@@ -231,7 +231,7 @@ void *read_tree_with_tree_or_commit_sha1(const unsigned char *sha1,
return buffer;
}
-int write_sha1_file(char *buf, unsigned len, unsigned char *returnsha1)
+int write_sha1_file(char *buf, unsigned len, const char *type, unsigned char *returnsha1)
{
int size;
char *compressed;
@@ -239,10 +239,15 @@ int write_sha1_file(char *buf, unsigned len, unsigned char *returnsha1)
unsigned char sha1[20];
SHA_CTX c;
char *filename;
- int fd;
+ char hdr[50];
+ int fd, hdrlen;
+
+ /* Generate the header */
+ hdrlen = sprintf(hdr, "%s %d", type, len)+1;
/* Sha1.. */
SHA1_Init(&c);
+ SHA1_Update(&c, hdr, hdrlen);
SHA1_Update(&c, buf, len);
SHA1_Final(sha1, &c);
@@ -265,14 +270,22 @@ int write_sha1_file(char *buf, unsigned len, unsigned char *returnsha1)
/* Set it up */
memset(&stream, 0, sizeof(stream));
deflateInit(&stream, Z_BEST_COMPRESSION);
- size = deflateBound(&stream, len);
+ size = deflateBound(&stream, len+hdrlen);
compressed = malloc(size);
/* Compress it */
- stream.next_in = buf;
- stream.avail_in = len;
stream.next_out = compressed;
stream.avail_out = size;
+
+ /* First header.. */
+ stream.next_in = hdr;
+ stream.avail_in = hdrlen;
+ while (deflate(&stream, 0) == Z_OK)
+ /* nothing */
+
+ /* Then the data itself.. */
+ stream.next_in = buf;
+ stream.avail_in = len;
while (deflate(&stream, Z_FINISH) == Z_OK)
/* nothing */;
deflateEnd(&stream);