X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=cmd%2Fzstd%2Funzstd.c;h=faeda1559fa5c03ac740a177279fe4bf540537cc;hb=HEAD;hp=c87dcd6208c95982f0e7250da41b88859ba28590;hpb=4e53eb0ef0947956deabbcf03b4d0dced9703a15;p=tofuproxy.git diff --git a/cmd/zstd/unzstd.c b/cmd/zstd/unzstd.c index c87dcd6..d3708f3 100644 --- a/cmd/zstd/unzstd.c +++ b/cmd/zstd/unzstd.c @@ -1,19 +1,17 @@ -/* -unzstd -- .warc.zst decompressor -Copyright (C) 2021-2023 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 . -*/ +// unzstd -- .warc.zst decompressor +// 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 . // https://iipc.github.io/warc-specifications/specifications/warc-zstd/ @@ -23,7 +21,6 @@ along with this program. If not, see . #include #include #include -#include #include @@ -34,6 +31,13 @@ along with this program. If not, see . #include #endif // __FreeBSD__ +static uint32_t +le32dec(const char buf[4]) +{ + return (uint32_t)(buf[3]) << 24 | (uint32_t)(buf[2]) << 16 | + (uint32_t)(buf[1]) << 8 | (uint32_t)(buf[0]); +} + int main(int argc, char **argv) { @@ -50,17 +54,17 @@ main(int argc, char **argv) fputs("can not initialize ZSTD_DCtx\n", stderr); return 1; } - int rc = EXIT_FAILURE; - char *bufIn = NULL; - char *bufOut = NULL; + int rc = EXIT_FAILURE; + char *bufIn = NULL; + char *bufOut = NULL; const size_t bufInSize = ZSTD_DStreamInSize(); - bufIn = malloc(bufInSize); + bufIn = malloc(bufInSize); if (bufIn == NULL) { fputs("no memory\n", stderr); goto Exit; } const size_t bufOutSize = ZSTD_DStreamOutSize(); - bufOut = malloc(bufOutSize); + bufOut = malloc(bufOutSize); if (bufOut == NULL) { fputs("no memory\n", stderr); goto Exit; @@ -68,16 +72,16 @@ main(int argc, char **argv) unsigned long long bufSize = 0; - ZSTD_inBuffer bIn = {bufIn, 0, 0}; + ZSTD_inBuffer bIn = {bufIn, 0, 0}; ZSTD_outBuffer bOut = {bufOut, 0, 0}; - bool isEmpty = true; - bool lastBlock = false; - size_t n = 0; - size_t written = 0; - size_t offset = 0; + bool isEmpty = true; + bool lastBlock = false; + size_t n = 0; + size_t written = 0; + size_t offset = 0; size_t offsetPrev = 0; - size_t zCode = 0; + size_t zCode = 0; ReadAgain: for (;;) { n = fread(bufIn, 1, bufInSize, stdin); @@ -92,7 +96,7 @@ ReadAgain: if (n >= 8 && le32dec(bufIn) == 0x184D2A5D) { // dictionary frame size_t dictSize = (size_t)le32dec(bufIn + 4); - char *dict = malloc(dictSize); + char *dict = malloc(dictSize); if (dict == NULL) { fprintf(stderr, "insufficient memory for dictionary: %zu\n", dictSize); goto Exit; @@ -100,13 +104,13 @@ ReadAgain: const size_t alreadyRead = n - 8; memcpy(dict, bufIn + 8, alreadyRead); errno = 0; - n = fread(dict + alreadyRead, 1, dictSize - alreadyRead, stdin); + n = fread(dict + alreadyRead, 1, dictSize - alreadyRead, stdin); if (n != dictSize - alreadyRead) { perror("can not read dictionary data"); free(dict); goto Exit; } - offset = dictSize + 8; + offset = dictSize + 8; offsetPrev = offset; if (fdOff != NULL) { fprintf(fdOff, "%zu\t0\n", offset); @@ -166,13 +170,13 @@ ReadAgain: goto Exit; } } - isEmpty = false; + isEmpty = false; bIn.size = n; - bIn.pos = 0; + bIn.pos = 0; while (bIn.pos < bIn.size) { bOut.size = bufOutSize; - bOut.pos = 0; - zCode = ZSTD_decompressStream(ctx, &bOut, &bIn); + bOut.pos = 0; + zCode = ZSTD_decompressStream(ctx, &bOut, &bIn); if ((zCode != 0) && (ZSTD_isError(zCode))) { fprintf(stderr, "can not decompress: %s\n", ZSTD_getErrorName(zCode)); goto Exit; @@ -189,7 +193,7 @@ ReadAgain: fprintf(fdOff, "%zu\t%zu\n", offset - offsetPrev, written); } offsetPrev = offset + bIn.pos; - written = 0; + written = 0; } } if (lastBlock) {