diff --git a/compress-test/stream.c b/compress-test/stream.c new file mode 100644 index 0000000..5c5eb9c --- /dev/null +++ b/compress-test/stream.c @@ -0,0 +1,150 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define BUF_SIZE 32 + +static int compress(const b_compression_function *func, FILE *in, FILE *out) +{ + b_stream *out_stream = b_stream_open_fp(out); + + b_cstream *cstream; + b_status status = b_cstream_open( + out_stream, func, B_COMPRESSION_MODE_COMPRESS, &cstream); + + if (!B_OK(status)) { + fprintf(stderr, "cannot initialise compressor\n"); + return -1; + } + + b_cstream_begin_compressed_section(cstream, NULL); + + char buf[4096]; + while (1) { + size_t r = fread(buf, 1, sizeof buf, in); + + size_t w = 0; + b_cstream_write(cstream, buf, r, &w); + + if (r != w) { + fprintf(stderr, "write error\n"); + return -1; + } + + if (r < sizeof buf) { + break; + } + } + + b_cstream_end_compressed_section(cstream, NULL, NULL); + b_cstream_close(cstream); + b_stream_close(out_stream); + + return 0; +} + +static int decompress(const b_compression_function *func, FILE *in, FILE *out) +{ + b_stream *in_stream = b_stream_open_fp(in); + + b_cstream *cstream; + b_status status = b_cstream_open( + in_stream, func, B_COMPRESSION_MODE_DECOMPRESS, &cstream); + + if (!B_OK(status)) { + fprintf(stderr, "cannot initialise compressor\n"); + return -1; + } + + b_cstream_begin_compressed_section(cstream, NULL); + + char buf[4096]; + while (1) { + size_t r = 0; + b_status status = b_cstream_read(cstream, buf, sizeof buf, &r); + if (!B_OK(status)) { + fprintf(stderr, "read error: %s\n", + b_status_description(status)); + return -1; + } + + size_t w = fwrite(buf, 1, r, out); + if (r != w) { + fprintf(stderr, "write error\n"); + return -1; + } + + if (r < sizeof buf) { + break; + } + } + + b_cstream_end_compressed_section(cstream, NULL, NULL); + b_cstream_close(cstream); + b_stream_close(in_stream); + + return 0; +} + +int main(int argc, const char **argv) +{ + if (argc < 4) { + fprintf(stderr, "usage: %s \n", argv[0]); + return -1; + } + + const b_compression_function *zstd + = b_compression_function_get_by_id(B_COMPRESSOR_FUNCTION_ZSTD); + if (!zstd) { + fprintf(stderr, "zstd support not enabled\n"); + return -1; + } + + b_compression_mode mode; + if (!strcmp(argv[1], "C")) { + mode = B_COMPRESSION_MODE_COMPRESS; + } else if (!strcmp(argv[1], "D")) { + mode = B_COMPRESSION_MODE_DECOMPRESS; + } else { + fprintf(stderr, "invalid mode %s\n", argv[1]); + return -1; + } + + FILE *in_fp = fopen(argv[2], "rb"); + if (!in_fp) { + fprintf(stderr, "cannot open input file %s\n", argv[2]); + return -1; + } + + FILE *out_fp = fopen(argv[3], "wb"); + if (!out_fp) { + fclose(in_fp); + fprintf(stderr, "cannot open output file %s\n", argv[3]); + return -1; + } + + int ret = 0; + switch (mode) { + case B_COMPRESSION_MODE_COMPRESS: + ret = compress(zstd, in_fp, out_fp); + break; + case B_COMPRESSION_MODE_DECOMPRESS: + ret = decompress(zstd, in_fp, out_fp); + break; + default: + ret = -1; + break; + } + + printf("Done\n"); + + fclose(in_fp); + fclose(out_fp); + + return ret; +}