// enzstd -- .warc.zst compressor // Copyright (C) 2021-2024 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 #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; } unsigned char *src = NULL; unsigned char *dst = NULL; int rc = EXIT_FAILURE; size_t srcSize = 8; src = malloc(srcSize); if (src == NULL) { fprintf(stderr, "can not allocate memory: %zu\n", srcSize); goto Exit; } size_t dstSize = 0; 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 = ((uint64_t)(src[0]) << 56) | ((uint64_t)(src[1]) << 48) | ((uint64_t)(src[2]) << 40) | ((uint64_t)(src[3]) << 32) | ((uint64_t)(src[4]) << 24) | ((uint64_t)(src[5]) << 16) | ((uint64_t)(src[6]) << 8) | (uint64_t)(src[7]); 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; }