1*01826a49SYabin Cui /*
2*01826a49SYabin Cui * Copyright (c) Meta Platforms, Inc. and affiliates.
3*01826a49SYabin Cui * All rights reserved.
4*01826a49SYabin Cui *
5*01826a49SYabin Cui * This source code is licensed under both the BSD-style license (found in the
6*01826a49SYabin Cui * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*01826a49SYabin Cui * in the COPYING file in the root directory of this source tree).
8*01826a49SYabin Cui * You may select, at your option, one of the above-listed licenses.
9*01826a49SYabin Cui */
10*01826a49SYabin Cui
11*01826a49SYabin Cui #include <assert.h>
12*01826a49SYabin Cui #include <stdio.h>
13*01826a49SYabin Cui #include <stddef.h>
14*01826a49SYabin Cui #include <stdlib.h>
15*01826a49SYabin Cui #include <stdint.h>
16*01826a49SYabin Cui #include "datagen.h"
17*01826a49SYabin Cui #include "mem.h"
18*01826a49SYabin Cui #define ZSTD_STATIC_LINKING_ONLY
19*01826a49SYabin Cui #include "zstd.h"
20*01826a49SYabin Cui
21*01826a49SYabin Cui static int
compress(ZSTD_CCtx * cctx,ZSTD_DCtx * dctx,void * dst,size_t dstCapacity,void const * src,size_t srcSize,void * roundtrip,ZSTD_EndDirective end)22*01826a49SYabin Cui compress(ZSTD_CCtx* cctx, ZSTD_DCtx* dctx,
23*01826a49SYabin Cui void* dst, size_t dstCapacity,
24*01826a49SYabin Cui void const* src, size_t srcSize,
25*01826a49SYabin Cui void* roundtrip, ZSTD_EndDirective end)
26*01826a49SYabin Cui {
27*01826a49SYabin Cui ZSTD_inBuffer in = {src, srcSize, 0};
28*01826a49SYabin Cui ZSTD_outBuffer out = {dst, dstCapacity, 0};
29*01826a49SYabin Cui int ended = 0;
30*01826a49SYabin Cui
31*01826a49SYabin Cui while (!ended && (in.pos < in.size || out.pos > 0)) {
32*01826a49SYabin Cui size_t rc;
33*01826a49SYabin Cui out.pos = 0;
34*01826a49SYabin Cui rc = ZSTD_compressStream2(cctx, &out, &in, end);
35*01826a49SYabin Cui if (ZSTD_isError(rc))
36*01826a49SYabin Cui return 1;
37*01826a49SYabin Cui if (end == ZSTD_e_end && rc == 0)
38*01826a49SYabin Cui ended = 1;
39*01826a49SYabin Cui {
40*01826a49SYabin Cui ZSTD_inBuffer rtIn = {dst, out.pos, 0};
41*01826a49SYabin Cui ZSTD_outBuffer rtOut = {roundtrip, srcSize, 0};
42*01826a49SYabin Cui rc = 1;
43*01826a49SYabin Cui while (rtIn.pos < rtIn.size || rtOut.pos > 0) {
44*01826a49SYabin Cui rtOut.pos = 0;
45*01826a49SYabin Cui rc = ZSTD_decompressStream(dctx, &rtOut, &rtIn);
46*01826a49SYabin Cui if (ZSTD_isError(rc)) {
47*01826a49SYabin Cui fprintf(stderr, "Decompression error: %s\n", ZSTD_getErrorName(rc));
48*01826a49SYabin Cui return 1;
49*01826a49SYabin Cui }
50*01826a49SYabin Cui if (rc == 0)
51*01826a49SYabin Cui break;
52*01826a49SYabin Cui }
53*01826a49SYabin Cui if (ended && rc != 0) {
54*01826a49SYabin Cui fprintf(stderr, "Frame not finished!\n");
55*01826a49SYabin Cui return 1;
56*01826a49SYabin Cui }
57*01826a49SYabin Cui }
58*01826a49SYabin Cui }
59*01826a49SYabin Cui
60*01826a49SYabin Cui return 0;
61*01826a49SYabin Cui }
62*01826a49SYabin Cui
main(int argc,const char ** argv)63*01826a49SYabin Cui int main(int argc, const char** argv)
64*01826a49SYabin Cui {
65*01826a49SYabin Cui ZSTD_CCtx* cctx = ZSTD_createCCtx();
66*01826a49SYabin Cui ZSTD_DCtx* dctx = ZSTD_createDCtx();
67*01826a49SYabin Cui const size_t dataSize = (size_t)1 << 30;
68*01826a49SYabin Cui const size_t outSize = ZSTD_compressBound(dataSize);
69*01826a49SYabin Cui const size_t bufferSize = (size_t)1 << 31;
70*01826a49SYabin Cui char* buffer = (char*)malloc(bufferSize);
71*01826a49SYabin Cui void* out = malloc(outSize);
72*01826a49SYabin Cui void* roundtrip = malloc(dataSize);
73*01826a49SYabin Cui (void)argc;
74*01826a49SYabin Cui (void)argv;
75*01826a49SYabin Cui
76*01826a49SYabin Cui if (!buffer || !out || !roundtrip || !cctx || !dctx) {
77*01826a49SYabin Cui fprintf(stderr, "Allocation failure\n");
78*01826a49SYabin Cui return 1;
79*01826a49SYabin Cui }
80*01826a49SYabin Cui
81*01826a49SYabin Cui if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, 31)))
82*01826a49SYabin Cui return 1;
83*01826a49SYabin Cui if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 1)))
84*01826a49SYabin Cui return 1;
85*01826a49SYabin Cui if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_overlapLog, 9)))
86*01826a49SYabin Cui return 1;
87*01826a49SYabin Cui if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1)))
88*01826a49SYabin Cui return 1;
89*01826a49SYabin Cui if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_strategy, ZSTD_btopt)))
90*01826a49SYabin Cui return 1;
91*01826a49SYabin Cui if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_targetLength, 7)))
92*01826a49SYabin Cui return 1;
93*01826a49SYabin Cui if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 7)))
94*01826a49SYabin Cui return 1;
95*01826a49SYabin Cui if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_searchLog, 1)))
96*01826a49SYabin Cui return 1;
97*01826a49SYabin Cui if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_hashLog, 10)))
98*01826a49SYabin Cui return 1;
99*01826a49SYabin Cui if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_chainLog, 10)))
100*01826a49SYabin Cui return 1;
101*01826a49SYabin Cui
102*01826a49SYabin Cui if (ZSTD_isError(ZSTD_DCtx_setParameter(dctx, ZSTD_d_windowLogMax, 31)))
103*01826a49SYabin Cui return 1;
104*01826a49SYabin Cui
105*01826a49SYabin Cui RDG_genBuffer(buffer, bufferSize, 1.0, 0.0, 0xbeefcafe);
106*01826a49SYabin Cui
107*01826a49SYabin Cui /* Compress 30 GB */
108*01826a49SYabin Cui {
109*01826a49SYabin Cui int i;
110*01826a49SYabin Cui for (i = 0; i < 10; ++i) {
111*01826a49SYabin Cui fprintf(stderr, "Compressing 1 GB\n");
112*01826a49SYabin Cui if (compress(cctx, dctx, out, outSize, buffer, dataSize, roundtrip, ZSTD_e_continue))
113*01826a49SYabin Cui return 1;
114*01826a49SYabin Cui }
115*01826a49SYabin Cui }
116*01826a49SYabin Cui fprintf(stderr, "Compressing 1 GB\n");
117*01826a49SYabin Cui if (compress(cctx, dctx, out, outSize, buffer, dataSize, roundtrip, ZSTD_e_end))
118*01826a49SYabin Cui return 1;
119*01826a49SYabin Cui
120*01826a49SYabin Cui fprintf(stderr, "Success!\n");
121*01826a49SYabin Cui
122*01826a49SYabin Cui free(roundtrip);
123*01826a49SYabin Cui free(out);
124*01826a49SYabin Cui free(buffer);
125*01826a49SYabin Cui ZSTD_freeDCtx(dctx);
126*01826a49SYabin Cui ZSTD_freeCCtx(cctx);
127*01826a49SYabin Cui return 0;
128*01826a49SYabin Cui }
129