summaryrefslogtreecommitdiff
path: root/example.c
blob: a05f2ecc33f53c53aed77029d0300a909821bc32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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;
}