From: Paul Cruz Date: Mon, 3 Jul 2017 21:18:46 +0000 (-0700) Subject: continuing work on v2 X-Git-Tag: v1.3.1^2~13^2^2~135 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=00b5e6c512a2c9d8bc0db321ff1f79889d803c33;p=thirdparty%2Fzstd.git continuing work on v2 --- diff --git a/contrib/adaptive-compression/Makefile b/contrib/adaptive-compression/Makefile index 12607edff..b2c47654b 100644 --- a/contrib/adaptive-compression/Makefile +++ b/contrib/adaptive-compression/Makefile @@ -18,9 +18,14 @@ CFLAGS += $(DEBUGFLAGS) CFLAGS += $(MOREFLAGS) FLAGS = $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -adaptive: $(ZSTD_FILES) v1.c +all: clean v1 v2 +v1: $(ZSTD_FILES) v1.c + $(CC) $(FLAGS) $^ -o $@ + +v2: $(ZSTD_FILES) v2.c $(CC) $(FLAGS) $^ -o $@ clean: - @$(RM) -f adaptive + @$(RM) -f v1 v2 + @$(RM) -rf *.dSYM @$(RM) -f tmp* diff --git a/contrib/adaptive-compression/v2.c b/contrib/adaptive-compression/v2.c new file mode 100644 index 000000000..ef8062d8f --- /dev/null +++ b/contrib/adaptive-compression/v2.c @@ -0,0 +1,73 @@ +#define DISPLAY(...) fprintf(stderr, __VA_ARGS__) +#define FILE_CHUNK_SIZE 4 << 20 +typedef unsigned char BYTE; + +#include +#include +#include "zstd.h" + + + +/* return 0 if successful, else return error */ +int main(int argCount, const char* argv[]) +{ + const char* const srcFilename = argv[1]; + const char* const dstFilename = argv[2]; + FILE* const srcFile = fopen(srcFilename, "rb"); + FILE* const dstFile = fopen(dstFilename, "wb"); + BYTE* const src = malloc(FILE_CHUNK_SIZE); + size_t const dstSize = ZSTD_compressBound(FILE_CHUNK_SIZE); + BYTE* const dst = malloc(dstSize); + int ret = 0; + + /* checking for errors */ + if (!srcFilename || !dstFilename || !src || !dst) { + DISPLAY("Error: initial variables could not be allocated\n"); + ret = 1; + goto cleanup; + } + + /* compressing in blocks */ + for ( ; ; ) { + size_t const readSize = fread(src, 1, FILE_CHUNK_SIZE, srcFile); + if (readSize != FILE_CHUNK_SIZE && !feof(srcFile)) { + DISPLAY("Error: could not read %d bytes\n", FILE_CHUNK_SIZE); + ret = 1; + goto cleanup; + } + { + size_t const compressedSize = ZSTD_compress(dst, dstSize, src, readSize, 6); + if (ZSTD_isError(compressedSize)) { + DISPLAY("Error: something went wrong during compression\n"); + ret = 1; + goto cleanup; + } + { + size_t const writeSize = fwrite(dst, 1, compressedSize, dstFile); + if (writeSize != compressedSize) { + DISPLAY("Error: could not write compressed data to file\n"); + ret = 1; + goto cleanup; + } + } + } + if (feof(srcFile)) { + /* reached end of file */ + break; + } + } + + /* file compression completed */ + { + int const error = fclose(srcFile); + if (ret != 0) { + DISPLAY("Error: could not close the file\n"); + ret = error; + goto cleanup; + } + } +cleanup: + if (src != NULL) free(src); + if (dst != NULL) free(dst); + return ret; +}