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