test: compress: add simple compression stream test
This commit is contained in:
150
compress-test/stream.c
Normal file
150
compress-test/stream.c
Normal file
@@ -0,0 +1,150 @@
|
||||
#include <assert.h>
|
||||
#include <blue/compress/compressor.h>
|
||||
#include <blue/compress/cstream.h>
|
||||
#include <blue/compress/function.h>
|
||||
#include <blue/core/ringbuffer.h>
|
||||
#include <blue/core/stream.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#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 <C/D> <inpath> <outpath>\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;
|
||||
}
|
||||
Reference in New Issue
Block a user