xref: /netbsd-src/external/bsd/zstd/dist/examples/simple_compression.c (revision 3117ece4fc4a4ca4489ba793710b60b0d26bab6c)
1*3117ece4Schristos /*
2*3117ece4Schristos  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*3117ece4Schristos  * All rights reserved.
4*3117ece4Schristos  *
5*3117ece4Schristos  * This source code is licensed under both the BSD-style license (found in the
6*3117ece4Schristos  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*3117ece4Schristos  * in the COPYING file in the root directory of this source tree).
8*3117ece4Schristos  * You may select, at your option, one of the above-listed licenses.
9*3117ece4Schristos  */
10*3117ece4Schristos 
11*3117ece4Schristos #include <stdio.h>     // printf
12*3117ece4Schristos #include <stdlib.h>    // free
13*3117ece4Schristos #include <string.h>    // strlen, strcat, memset
14*3117ece4Schristos #include <zstd.h>      // presumes zstd library is installed
15*3117ece4Schristos #include "common.h"    // Helper functions, CHECK(), and CHECK_ZSTD()
16*3117ece4Schristos 
17*3117ece4Schristos static void compress_orDie(const char* fname, const char* oname)
18*3117ece4Schristos {
19*3117ece4Schristos     size_t fSize;
20*3117ece4Schristos     void* const fBuff = mallocAndLoadFile_orDie(fname, &fSize);
21*3117ece4Schristos     size_t const cBuffSize = ZSTD_compressBound(fSize);
22*3117ece4Schristos     void* const cBuff = malloc_orDie(cBuffSize);
23*3117ece4Schristos 
24*3117ece4Schristos     /* Compress.
25*3117ece4Schristos      * If you are doing many compressions, you may want to reuse the context.
26*3117ece4Schristos      * See the multiple_simple_compression.c example.
27*3117ece4Schristos      */
28*3117ece4Schristos     size_t const cSize = ZSTD_compress(cBuff, cBuffSize, fBuff, fSize, 1);
29*3117ece4Schristos     CHECK_ZSTD(cSize);
30*3117ece4Schristos 
31*3117ece4Schristos     saveFile_orDie(oname, cBuff, cSize);
32*3117ece4Schristos 
33*3117ece4Schristos     /* success */
34*3117ece4Schristos     printf("%25s : %6u -> %7u - %s \n", fname, (unsigned)fSize, (unsigned)cSize, oname);
35*3117ece4Schristos 
36*3117ece4Schristos     free(fBuff);
37*3117ece4Schristos     free(cBuff);
38*3117ece4Schristos }
39*3117ece4Schristos 
40*3117ece4Schristos static char* createOutFilename_orDie(const char* filename)
41*3117ece4Schristos {
42*3117ece4Schristos     size_t const inL = strlen(filename);
43*3117ece4Schristos     size_t const outL = inL + 5;
44*3117ece4Schristos     void* const outSpace = malloc_orDie(outL);
45*3117ece4Schristos     memset(outSpace, 0, outL);
46*3117ece4Schristos     strcat(outSpace, filename);
47*3117ece4Schristos     strcat(outSpace, ".zst");
48*3117ece4Schristos     return (char*)outSpace;
49*3117ece4Schristos }
50*3117ece4Schristos 
51*3117ece4Schristos int main(int argc, const char** argv)
52*3117ece4Schristos {
53*3117ece4Schristos     const char* const exeName = argv[0];
54*3117ece4Schristos 
55*3117ece4Schristos     if (argc!=2) {
56*3117ece4Schristos         printf("wrong arguments\n");
57*3117ece4Schristos         printf("usage:\n");
58*3117ece4Schristos         printf("%s FILE\n", exeName);
59*3117ece4Schristos         return 1;
60*3117ece4Schristos     }
61*3117ece4Schristos 
62*3117ece4Schristos     const char* const inFilename = argv[1];
63*3117ece4Schristos 
64*3117ece4Schristos     char* const outFilename = createOutFilename_orDie(inFilename);
65*3117ece4Schristos     compress_orDie(inFilename, outFilename);
66*3117ece4Schristos     free(outFilename);
67*3117ece4Schristos     return 0;
68*3117ece4Schristos }
69