summaryrefslogtreecommitdiff
path: root/example.c
diff options
context:
space:
mode:
Diffstat (limited to 'example.c')
-rw-r--r--example.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/example.c b/example.c
new file mode 100644
index 0000000..a05f2ec
--- /dev/null
+++ b/example.c
@@ -0,0 +1,63 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <zstd.h>
+
+static void compress(char* fname, char* outName, int compress_level)
+{
+ FILE* source_file = fopen(fname, "rb");
+ FILE* destination_file = fopen(outName, "wb");
+ size_t input_buffer_size = ZSTD_CStreamInSize();
+ void* input_buffer = malloc(input_buffer_size);
+ size_t output_buffer_size = ZSTD_CStreamOutSize();
+ void* output_buffer = malloc(output_buffer_size);
+ ZSTD_CStream* stream = ZSTD_createCStream();
+ ZSTD_initCStream(stream, compress_level);
+ size_t read, to_read = input_buffer_size;
+
+ while (read = fread(input_buffer, 1, to_read, source_file)) {
+ ZSTD_inBuffer input = { input_buffer, read, 0 };
+
+ while (input.pos < input.size) {
+ ZSTD_outBuffer output = { output_buffer, output_buffer_size, 0 };
+ to_read = ZSTD_compressStream(stream, &output, &input);
+
+ if (to_read > input_buffer_size)
+ to_read = input_buffer_size;
+
+ fwrite(output_buffer, 1, output.pos, destination_file);
+ }
+ }
+
+ ZSTD_outBuffer output = { output_buffer, output_buffer_size, 0 };
+ ZSTD_endStream(stream, &output);
+
+ fwrite(output_buffer, 1, output.pos, destination_file);
+
+ ZSTD_freeCStream(stream);
+ fclose(destination_file);
+ fclose(source_file);
+ free(input_buffer);
+ free(output_buffer);
+}
+
+static char* destination_filename_from(char* filename)
+{
+ size_t length = strlen(filename) + 5;
+ void* buffer = malloc(length);
+ memset(buffer, 0, length);
+ strcat(buffer, filename);
+ strcat(buffer, ".zst");
+ return (char*)buffer;
+}
+
+int main(int argc, char** argv)
+{
+ char* source = argv[1];
+ char* destination = destination_filename_from(source);
+ int compression_level = 1;
+
+ printf("Compressing %s to %s with compression level %d…\n", source, destination, compression_level);
+ compress(source, destination, compression_level);
+ return 0;
+}