diff options
author | Matthew Endsley <mendsley@gmail.com> | 2012-05-11 19:39:37 -0700 |
---|---|---|
committer | Matthew Endsley <mendsley@gmail.com> | 2012-05-14 01:04:24 -0700 |
commit | aa6e6990bfaa6275c74e7c340617b3f9c3750a87 (patch) | |
tree | 17966a74d0f9c9ac696dda00765b91d4c248cb3a /bsdiff.c | |
parent | 4e6f648ba399d16e9d68c9fe0fce7032baa89db2 (diff) | |
download | bsdiff-aa6e6990bfaa6275c74e7c340617b3f9c3750a87.tar.gz |
removing dependency on FILE* based BZ2 functions
Diffstat (limited to 'bsdiff.c')
-rw-r--r-- | bsdiff.c | 31 |
1 files changed, 19 insertions, 12 deletions
@@ -46,6 +46,8 @@ struct bsdiff_header uint64_t new_file_length; }; +typedef int (*bsdiff_write)(void* file, const void* buffer, int size); + #if defined(__linux__) #include <err.h> #else @@ -238,7 +240,7 @@ static void offtout(off_t x,uint8_t *buf) if(x<0) buf[7]|=0x80; } -static int writecompress(bz_stream* bz2, FILE* pf, const uint8_t* out, int size) +static int writecompress(bz_stream* bz2, void* file, bsdiff_write writefn, const uint8_t* out, int size) { int err; int totalwritten; @@ -258,7 +260,7 @@ static int writecompress(bz_stream* bz2, FILE* pf, const uint8_t* out, int size) if (bz2->avail_out < sizeof(buffer)) { const int written = sizeof(buffer) - bz2->avail_out; - if (1 != fwrite(buffer, written, 1, pf)) + if (written != writefn(file, buffer, written)) return -1; totalwritten += written; @@ -269,7 +271,7 @@ static int writecompress(bz_stream* bz2, FILE* pf, const uint8_t* out, int size) } } -static int finishcompress(bz_stream* bz2, FILE* pf) +static int finishcompress(bz_stream* bz2, void* file, bsdiff_write writefn) { int err; int totalwritten; @@ -288,7 +290,7 @@ static int finishcompress(bz_stream* bz2, FILE* pf) if (bz2->avail_out < sizeof(buffer)) { const int written = sizeof(buffer) - bz2->avail_out; - if (1 != fwrite(buffer, written, 1, pf)) + if (written != writefn(file, buffer, written)) return -1; totalwritten += written; @@ -302,7 +304,7 @@ static int finishcompress(bz_stream* bz2, FILE* pf) return totalwritten; } -int bsdiff(uint8_t* old, off_t oldsize, uint8_t* new, off_t newsize, FILE* pf, struct bsdiff_header* header) +int bsdiff(uint8_t* old, off_t oldsize, uint8_t* new, off_t newsize, void* file, bsdiff_write writefn, struct bsdiff_header* header) { off_t *I,*V; off_t scan,pos,len; @@ -416,7 +418,7 @@ int bsdiff(uint8_t* old, off_t oldsize, uint8_t* new, off_t newsize, FILE* pf, s offtout((scan-lenb)-(lastscan+lenf),buf+8); offtout((pos-lenb)-(lastpos+lenf),buf+16); - bz2err = writecompress(&bz2, pf, buf, sizeof(buf)); + bz2err = writecompress(&bz2, file, writefn, buf, sizeof(buf)); if (bz2err == -1) errx(1, "writecompress"); filelen += bz2err; @@ -426,7 +428,7 @@ int bsdiff(uint8_t* old, off_t oldsize, uint8_t* new, off_t newsize, FILE* pf, s lastoffset=pos-scan; }; }; - bz2err = finishcompress(&bz2, pf); + bz2err = finishcompress(&bz2, file, writefn); if (bz2err == -1) errx(1, "finishcompress"); filelen += bz2err; @@ -437,11 +439,11 @@ int bsdiff(uint8_t* old, off_t oldsize, uint8_t* new, off_t newsize, FILE* pf, s /* Write compressed diff data */ if (BZ_OK != (bz2err = BZ2_bzCompressInit(&bz2, 9, 0, 0))) errx(1, "BZ2_bzCompressInit, err = %d", bz2err); - bz2err = writecompress(&bz2, pf, db, dblen); + bz2err = writecompress(&bz2, file, writefn, db, dblen); if (bz2err == -1) errx(1, "writecompress"); filelen += bz2err; - bz2err = finishcompress(&bz2, pf); + bz2err = finishcompress(&bz2, file, writefn); if (bz2err == -1) errx(1, "finishcompress"); filelen += bz2err; @@ -452,10 +454,10 @@ int bsdiff(uint8_t* old, off_t oldsize, uint8_t* new, off_t newsize, FILE* pf, s /* Write compressed extra data */ if (BZ_OK != (bz2err = BZ2_bzCompressInit(&bz2, 9, 0, 0))) errx(1, "BZ2_bzCompressInit, err = %d", bz2err); - bz2err = writecompress(&bz2, pf, eb, eblen); + bz2err = writecompress(&bz2, file, writefn, eb, eblen); if (bz2err == -1) errx(1, "writecompress"); - bz2err = finishcompress(&bz2, pf); + bz2err = finishcompress(&bz2, file, writefn); if (bz2err == -1) errx(1, "finishcompress"); @@ -467,6 +469,11 @@ int bsdiff(uint8_t* old, off_t oldsize, uint8_t* new, off_t newsize, FILE* pf, s return 0; } +static int bsdiff_fwrite(void* file, const void* buffer, int size) +{ + return fwrite(buffer, 1, size, (FILE*)file); +} + int main(int argc,char *argv[]) { int fd; @@ -504,7 +511,7 @@ int main(int argc,char *argv[]) if (fwrite(&header, sizeof(header), 1, pf) != 1) err(1, "Failed to write header"); - if (bsdiff(old, oldsize, new, newsize, pf, &header)) + if (bsdiff(old, oldsize, new, newsize, pf, bsdiff_fwrite, &header)) err(1, "bsdiff"); if (fseek(pf, 0, SEEK_SET) || |