/* enzstd -- .warc.zst compressor Copyright (C) 2021 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #ifdef __FreeBSD__ #include "capsicum.c.in" #endif // __FreeBSD__ int main(int argc, char **argv) { #ifdef __FreeBSD__ capsicum_start(); #endif // __FreeBSD__ ZSTD_CCtx *ctx = ZSTD_createCCtx(); if (ctx == NULL) { fputs("can not initialize ZSTD_createCCtx\n", stderr); return EXIT_FAILURE; }; size_t zCode = ZSTD_CCtx_setParameter(ctx, ZSTD_c_checksumFlag, 1); if (ZSTD_isError(zCode)) { fprintf(stderr, "can not setParameter: %s\n", ZSTD_getErrorName(zCode)); return EXIT_FAILURE; }; zCode = ZSTD_CCtx_setParameter(ctx, ZSTD_c_compressionLevel, ZSTD_maxCLevel()); if (ZSTD_isError(zCode)) { fprintf(stderr, "can not setParameter: %s\n", ZSTD_getErrorName(zCode)); return EXIT_FAILURE; }; int rc = EXIT_FAILURE; size_t srcSize = 8; char *src = malloc(srcSize); if (src == NULL) { fprintf(stderr, "can not allocate memory: %zu\n", srcSize); goto Exit; }; size_t dstSize = 0; char *dst = NULL; size_t srcWantSize = 0; size_t dstWantSize = 0; size_t n = 0; for (;;) { n = fread(src, 1, 8, stdin); if (n < 8) { if (feof(stdin)) { break; }; perror("can not fread(stdin)"); goto Exit; }; srcWantSize = (size_t)be64dec(src); if (srcWantSize > srcSize) { free(src); srcSize = srcWantSize; src = malloc(srcSize); if (src == NULL) { fprintf(stderr, "can not allocate memory: %zu\n", srcSize); goto Exit; }; }; n = fread(src, 1, srcWantSize, stdin); if (n < srcWantSize) { fputs("insufficient data fed\n", stderr); goto Exit; }; dstWantSize = ZSTD_compressBound(srcWantSize); if (dstWantSize > dstSize) { free(dst); dstSize = dstWantSize; dst = malloc(dstSize); if (dst == NULL) { fprintf(stderr, "can not allocate memory: %zu\n", dstSize); goto Exit; }; }; zCode = ZSTD_compress2(ctx, dst, dstSize, src, srcWantSize); if (ZSTD_isError(zCode)) { fprintf(stderr, "can not compress: %s\n", ZSTD_getErrorName(zCode)); goto Exit; }; n = fwrite(dst, 1, zCode, stdout); if (n < zCode) { perror("can not fwrite(stdout)"); goto Exit; }; }; rc = EXIT_SUCCESS; Exit: free(dst); free(src); ZSTD_freeCCtx(ctx); return rc; };