summaryrefslogtreecommitdiff
path: root/bsdiff.c
diff options
context:
space:
mode:
authorMatthew Endsley <mendsley@gmail.com>2012-05-14 01:40:32 -0700
committerMatthew Endsley <mendsley@gmail.com>2012-05-14 01:48:22 -0700
commitf38045c929e3f76cb5e6357e79d826d61143c42f (patch)
tree0607049bf7209341cdfc9578d8f3b654fe5b3ea6 /bsdiff.c
parentf817d2a5e92d56f6c7598321c23adff2b343a31f (diff)
downloadbsdiff-f38045c929e3f76cb5e6357e79d826d61143c42f.tar.gz
switching back to high-level bz2 interface now that write has been simplified
Diffstat (limited to 'bsdiff.c')
-rw-r--r--bsdiff.c86
1 files changed, 16 insertions, 70 deletions
diff --git a/bsdiff.c b/bsdiff.c
index 130fb5d..ffa47a1 100644
--- a/bsdiff.c
+++ b/bsdiff.c
@@ -376,90 +376,31 @@ int bsdiff(const uint8_t* old, int64_t oldsize, const uint8_t* new, int64_t news
static int bz2_write(struct bsdiff_stream* stream, const void* buffer, int size)
{
- bz_stream* bz2;
- FILE* pf;
- int err;
- char compress_buffer[4096];
+ int bz2err;
+ BZFILE* bz2;
- bz2 = (bz_stream*)stream->opaque;
- pf = (FILE*)bz2->opaque;
-
- if (!bz2->state)
- {
- if (BZ_OK != BZ2_bzCompressInit(bz2, 9, 0, 0))
- return -1;
- }
-
- bz2->next_in = (char*)buffer;
- bz2->avail_in = size;
-
- for (;;)
- {
- bz2->next_out = compress_buffer;
- bz2->avail_out = sizeof(compress_buffer);
- if (BZ_RUN_OK != (err = BZ2_bzCompress(bz2, BZ_RUN)))
- return -1;
-
- if (bz2->avail_out < sizeof(compress_buffer))
- {
- const size_t written = sizeof(compress_buffer) - bz2->avail_out;
- if (written != fwrite(compress_buffer, 1, written, pf))
- return -1;
- }
-
- if (bz2->avail_in == 0)
- return 0;
- }
-}
-
-static int bz2_finish(struct bsdiff_stream* stream)
-{
- int err;
- bz_stream* bz2;
- FILE* pf;
- char compress_buffer[4096];
-
- bz2 = (bz_stream*)stream->opaque;
- pf = (FILE*)bz2->opaque;
-
- for (;;)
- {
- bz2->next_out = compress_buffer;
- bz2->avail_out = sizeof(compress_buffer);
-
- err = BZ2_bzCompress(bz2, BZ_FINISH);
- if (BZ_FINISH_OK != err && BZ_STREAM_END != err)
- return -1;
-
- if (bz2->avail_out < sizeof(compress_buffer))
- {
- const size_t written = sizeof(compress_buffer) - bz2->avail_out;
- if (written != fwrite(compress_buffer, 1, written, pf))
- return -1;
- }
-
- if (BZ_STREAM_END == err)
- break;
- }
+ bz2 = (BZFILE*)stream->opaque;
+ BZ2_bzWrite(&bz2err, bz2, (void*)buffer, size);
+ if (bz2err != BZ_STREAM_END && bz2err != BZ_OK)
+ return -1;
- BZ2_bzCompressEnd(bz2);
return 0;
}
int main(int argc,char *argv[])
{
int fd;
+ int bz2err;
uint8_t *old,*new;
off_t oldsize,newsize;
uint8_t buf[8];
FILE * pf;
struct bsdiff_stream stream;
- bz_stream bz2;
+ BZFILE* bz2;
memset(&bz2, 0, sizeof(bz2));
stream.malloc = malloc;
stream.free = free;
- stream.opaque = &bz2;
stream.write = bz2_write;
if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]);
@@ -493,12 +434,17 @@ int main(int argc,char *argv[])
fwrite(buf, sizeof(buf), 1, pf) != 1)
err(1, "Failed to write header");
- bz2.opaque = pf;
+
+ if (NULL == (bz2 = BZ2_bzWriteOpen(&bz2err, pf, 9, 0, 0)))
+ errx(1, "BZ2_bzWriteOpen, bz2err=%d", bz2err);
+
+ stream.opaque = bz2;
if (bsdiff(old, oldsize, new, newsize, &stream))
err(1, "bsdiff");
- if (bz2_finish(&stream))
- err(1, "stream.finish");
+ BZ2_bzWriteClose(&bz2err, bz2, 0, NULL, NULL);
+ if (bz2err != BZ_OK)
+ err(1, "BZ2_bzWriteClose, bz2err=%d", bz2err);
if (fclose(pf))
err(1, "fclose");