xref: /netbsd-src/external/bsd/zstd/dist/tests/bigdict.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 <assert.h>
12*3117ece4Schristos #include <stdio.h>
13*3117ece4Schristos #include <stddef.h>
14*3117ece4Schristos #include <stdlib.h>
15*3117ece4Schristos #include <stdint.h>
16*3117ece4Schristos #include "datagen.h"
17*3117ece4Schristos #include "mem.h"
18*3117ece4Schristos #define ZSTD_STATIC_LINKING_ONLY
19*3117ece4Schristos #include "zstd.h"
20*3117ece4Schristos 
21*3117ece4Schristos static int
22*3117ece4Schristos compress(ZSTD_CCtx* cctx, ZSTD_DCtx* dctx,
23*3117ece4Schristos          void* dst, size_t dstCapacity,
24*3117ece4Schristos          void const* src, size_t srcSize,
25*3117ece4Schristos          void* roundtrip, ZSTD_EndDirective end)
26*3117ece4Schristos {
27*3117ece4Schristos     ZSTD_inBuffer in = {src, srcSize, 0};
28*3117ece4Schristos     ZSTD_outBuffer out = {dst, dstCapacity, 0};
29*3117ece4Schristos     int ended = 0;
30*3117ece4Schristos 
31*3117ece4Schristos     while (!ended && (in.pos < in.size || out.pos > 0)) {
32*3117ece4Schristos         size_t rc;
33*3117ece4Schristos         out.pos = 0;
34*3117ece4Schristos         rc = ZSTD_compressStream2(cctx, &out, &in, end);
35*3117ece4Schristos         if (ZSTD_isError(rc))
36*3117ece4Schristos             return 1;
37*3117ece4Schristos         if (end == ZSTD_e_end && rc == 0)
38*3117ece4Schristos             ended = 1;
39*3117ece4Schristos         {
40*3117ece4Schristos             ZSTD_inBuffer rtIn = {dst, out.pos, 0};
41*3117ece4Schristos             ZSTD_outBuffer rtOut = {roundtrip, srcSize, 0};
42*3117ece4Schristos             rc = 1;
43*3117ece4Schristos             while (rtIn.pos < rtIn.size || rtOut.pos > 0) {
44*3117ece4Schristos                 rtOut.pos = 0;
45*3117ece4Schristos                 rc = ZSTD_decompressStream(dctx, &rtOut, &rtIn);
46*3117ece4Schristos                 if (ZSTD_isError(rc)) {
47*3117ece4Schristos                     fprintf(stderr, "Decompression error: %s\n", ZSTD_getErrorName(rc));
48*3117ece4Schristos                     return 1;
49*3117ece4Schristos                 }
50*3117ece4Schristos                 if (rc == 0)
51*3117ece4Schristos                     break;
52*3117ece4Schristos             }
53*3117ece4Schristos             if (ended && rc != 0) {
54*3117ece4Schristos                 fprintf(stderr, "Frame not finished!\n");
55*3117ece4Schristos                 return 1;
56*3117ece4Schristos             }
57*3117ece4Schristos         }
58*3117ece4Schristos     }
59*3117ece4Schristos 
60*3117ece4Schristos     return 0;
61*3117ece4Schristos }
62*3117ece4Schristos 
63*3117ece4Schristos int main(int argc, const char** argv)
64*3117ece4Schristos {
65*3117ece4Schristos     ZSTD_CCtx* cctx = ZSTD_createCCtx();
66*3117ece4Schristos     ZSTD_DCtx* dctx = ZSTD_createDCtx();
67*3117ece4Schristos     const size_t dataSize = (size_t)1 << 30;
68*3117ece4Schristos     const size_t outSize = ZSTD_compressBound(dataSize);
69*3117ece4Schristos     const size_t bufferSize = (size_t)1 << 31;
70*3117ece4Schristos     char* buffer = (char*)malloc(bufferSize);
71*3117ece4Schristos     void* out = malloc(outSize);
72*3117ece4Schristos     void* roundtrip = malloc(dataSize);
73*3117ece4Schristos     (void)argc;
74*3117ece4Schristos     (void)argv;
75*3117ece4Schristos 
76*3117ece4Schristos     if (!buffer || !out || !roundtrip || !cctx || !dctx) {
77*3117ece4Schristos         fprintf(stderr, "Allocation failure\n");
78*3117ece4Schristos         return 1;
79*3117ece4Schristos     }
80*3117ece4Schristos 
81*3117ece4Schristos     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, 31)))
82*3117ece4Schristos         return 1;
83*3117ece4Schristos     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 1)))
84*3117ece4Schristos         return 1;
85*3117ece4Schristos     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_overlapLog, 9)))
86*3117ece4Schristos         return 1;
87*3117ece4Schristos     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1)))
88*3117ece4Schristos         return 1;
89*3117ece4Schristos     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_strategy, ZSTD_btopt)))
90*3117ece4Schristos         return 1;
91*3117ece4Schristos     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_targetLength, 7)))
92*3117ece4Schristos         return 1;
93*3117ece4Schristos     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 7)))
94*3117ece4Schristos         return 1;
95*3117ece4Schristos     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_searchLog, 1)))
96*3117ece4Schristos         return 1;
97*3117ece4Schristos     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_hashLog, 10)))
98*3117ece4Schristos         return 1;
99*3117ece4Schristos     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_chainLog, 10)))
100*3117ece4Schristos         return 1;
101*3117ece4Schristos 
102*3117ece4Schristos     if (ZSTD_isError(ZSTD_DCtx_setParameter(dctx, ZSTD_d_windowLogMax, 31)))
103*3117ece4Schristos         return 1;
104*3117ece4Schristos 
105*3117ece4Schristos     RDG_genBuffer(buffer, bufferSize, 1.0, 0.0, 0xbeefcafe);
106*3117ece4Schristos 
107*3117ece4Schristos     /* Compress 30 GB */
108*3117ece4Schristos     {
109*3117ece4Schristos         int i;
110*3117ece4Schristos         for (i = 0; i < 10; ++i) {
111*3117ece4Schristos             fprintf(stderr, "Compressing 1 GB\n");
112*3117ece4Schristos             if (compress(cctx, dctx, out, outSize, buffer, dataSize, roundtrip, ZSTD_e_continue))
113*3117ece4Schristos                 return 1;
114*3117ece4Schristos         }
115*3117ece4Schristos     }
116*3117ece4Schristos     fprintf(stderr, "Compressing 1 GB\n");
117*3117ece4Schristos     if (compress(cctx, dctx, out, outSize, buffer, dataSize, roundtrip, ZSTD_e_end))
118*3117ece4Schristos         return 1;
119*3117ece4Schristos 
120*3117ece4Schristos     fprintf(stderr, "Success!\n");
121*3117ece4Schristos 
122*3117ece4Schristos     free(roundtrip);
123*3117ece4Schristos     free(out);
124*3117ece4Schristos     free(buffer);
125*3117ece4Schristos     ZSTD_freeDCtx(dctx);
126*3117ece4Schristos     ZSTD_freeCCtx(cctx);
127*3117ece4Schristos     return 0;
128*3117ece4Schristos }
129