mirror of
https://github.com/facebook/zstd.git
synced 2025-10-09 00:05:28 -04:00
commit
77dce3eba1
@ -1,6 +1,6 @@
|
|||||||
language: c
|
language: c
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
script: make test-travis
|
script: make $ZSTD_TRAVIS_CI_ENV
|
||||||
before_install:
|
before_install:
|
||||||
- sudo apt-get update -qq
|
- sudo apt-get update -qq
|
||||||
- sudo apt-get install -qq gcc-arm-linux-gnueabi
|
- sudo apt-get install -qq gcc-arm-linux-gnueabi
|
||||||
@ -11,11 +11,13 @@ before_install:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
- ZSTD_TRAVIS_CI_ENV=travis-install
|
- ZSTD_TRAVIS_CI_ENV=travis-install
|
||||||
- ZSTD_TRAVIS_CI_ENV=test-all
|
|
||||||
- ZSTD_TRAVIS_CI_ENV=clangtest
|
- ZSTD_TRAVIS_CI_ENV=clangtest
|
||||||
- ZSTD_TRAVIS_CI_ENV=gpptest
|
- ZSTD_TRAVIS_CI_ENV=gpptest
|
||||||
- ZSTD_TRAVIS_CI_ENV=armtest
|
- ZSTD_TRAVIS_CI_ENV=armtest
|
||||||
|
- ZSTD_TRAVIS_CI_ENV=test
|
||||||
|
- ZSTD_TRAVIS_CI_ENV="-C programs test32"
|
||||||
- ZSTD_TRAVIS_CI_ENV=sanitize
|
- ZSTD_TRAVIS_CI_ENV=sanitize
|
||||||
|
- ZSTD_TRAVIS_CI_ENV="-C programs memtest"
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
|
50
Makefile
50
Makefile
@ -32,40 +32,25 @@
|
|||||||
# ################################################################
|
# ################################################################
|
||||||
|
|
||||||
# Version number
|
# Version number
|
||||||
export VERSION=0.1.0
|
export VERSION=0.1.1
|
||||||
export RELEASE=r$(VERSION)
|
|
||||||
|
|
||||||
DESTDIR?=
|
|
||||||
PREFIX ?= /usr
|
|
||||||
|
|
||||||
LIBDIR ?= $(PREFIX)/lib
|
|
||||||
INCLUDEDIR=$(PREFIX)/include
|
|
||||||
PRGDIR = programs
|
PRGDIR = programs
|
||||||
ZSTDDIR = lib
|
ZSTDDIR = lib
|
||||||
|
|
||||||
# Select test target for Travis CI's Build Matrix
|
|
||||||
ifneq (,$(filter test-%,$(ZSTD_TRAVIS_CI_ENV)))
|
|
||||||
TRAVIS_TARGET=prg-travis
|
|
||||||
else
|
|
||||||
TRAVIS_TARGET=$(ZSTD_TRAVIS_CI_ENV)
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
|
|
||||||
default: zstdprograms
|
default: zstdprogram
|
||||||
|
|
||||||
all:
|
all:
|
||||||
@cd $(ZSTDDIR); $(MAKE) -e all
|
$(MAKE) -C $(ZSTDDIR) $@
|
||||||
@cd $(PRGDIR); $(MAKE) -e all
|
$(MAKE) -C $(PRGDIR) $@
|
||||||
|
|
||||||
zstdprograms:
|
zstdprogram:
|
||||||
@cd $(PRGDIR); $(MAKE) -e
|
$(MAKE) -C $(PRGDIR)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@cd $(PRGDIR); $(MAKE) clean
|
$(MAKE) -C $(ZSTDDIR) $@
|
||||||
@cd $(ZSTDDIR); $(MAKE) clean
|
$(MAKE) -C $(PRGDIR) $@
|
||||||
# @cd examples; $(MAKE) clean
|
|
||||||
@echo Cleaning completed
|
@echo Cleaning completed
|
||||||
|
|
||||||
|
|
||||||
@ -74,23 +59,18 @@ clean:
|
|||||||
ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU))
|
ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU))
|
||||||
|
|
||||||
install:
|
install:
|
||||||
@cd $(ZSTDDIR); $(MAKE) -e install
|
$(MAKE) -C $(ZSTDDIR) $@
|
||||||
@cd $(PRGDIR); $(MAKE) -e install
|
$(MAKE) -C $(PRGDIR) $@
|
||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
@cd $(ZSTDDIR); $(MAKE) uninstall
|
$(MAKE) -C $(ZSTDDIR) $@
|
||||||
@cd $(PRGDIR); $(MAKE) uninstall
|
$(MAKE) -C $(PRGDIR) $@
|
||||||
|
|
||||||
travis-install:
|
travis-install:
|
||||||
sudo $(MAKE) install
|
sudo $(MAKE) install
|
||||||
|
|
||||||
test:
|
test:
|
||||||
@cd $(PRGDIR); $(MAKE) -e test
|
$(MAKE) -C $(PRGDIR) $@
|
||||||
|
|
||||||
test-travis: $(TRAVIS_TARGET)
|
|
||||||
|
|
||||||
prg-travis:
|
|
||||||
@cd $(PRGDIR); $(MAKE) -e $(ZSTD_TRAVIS_CI_ENV)
|
|
||||||
|
|
||||||
clangtest: clean
|
clangtest: clean
|
||||||
clang -v
|
clang -v
|
||||||
@ -100,8 +80,8 @@ gpptest: clean
|
|||||||
$(MAKE) all CC=g++ CFLAGS="-O3 -Wall -Wextra -Wundef -Wshadow -Wcast-align -Werror"
|
$(MAKE) all CC=g++ CFLAGS="-O3 -Wall -Wextra -Wundef -Wshadow -Wcast-align -Werror"
|
||||||
|
|
||||||
armtest: clean
|
armtest: clean
|
||||||
cd $(ZSTDDIR); $(MAKE) -e all CC=arm-linux-gnueabi-gcc MOREFLAGS="-Werror"
|
$(MAKE) -C $(ZSTDDIR) -e all CC=arm-linux-gnueabi-gcc MOREFLAGS="-Werror"
|
||||||
cd $(PRGDIR); $(MAKE) -e CC=arm-linux-gnueabi-gcc MOREFLAGS="-Werror"
|
$(MAKE) -C $(PRGDIR) -e CC=arm-linux-gnueabi-gcc MOREFLAGS="-Werror"
|
||||||
|
|
||||||
sanitize: clean
|
sanitize: clean
|
||||||
$(MAKE) test CC=clang MOREFLAGS="-g -fsanitize=undefined"
|
$(MAKE) test CC=clang MOREFLAGS="-g -fsanitize=undefined"
|
||||||
|
@ -32,14 +32,14 @@
|
|||||||
# ################################################################
|
# ################################################################
|
||||||
|
|
||||||
# Version numbers
|
# Version numbers
|
||||||
VERSION?= 0
|
VERSION?= 0.1.1
|
||||||
LIBVER_MAJOR=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < zstd.h`
|
LIBVER_MAJOR=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < zstd.h`
|
||||||
LIBVER_MINOR=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < zstd.h`
|
LIBVER_MINOR=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < zstd.h`
|
||||||
LIBVER_PATCH=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < zstd.h`
|
LIBVER_PATCH=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < zstd.h`
|
||||||
LIBVER = $(LIBVER_MAJOR).$(LIBVER_MINOR).$(LIBVER_PATCH)
|
LIBVER = $(LIBVER_MAJOR).$(LIBVER_MINOR).$(LIBVER_PATCH)
|
||||||
|
|
||||||
DESTDIR?=
|
DESTDIR?=
|
||||||
PREFIX ?= /usr
|
PREFIX ?= /usr/local
|
||||||
CFLAGS ?= -O3
|
CFLAGS ?= -O3
|
||||||
CFLAGS += -std=c99 -Wall -Wextra -Wundef -Wshadow -Wcast-align -Wstrict-prototypes
|
CFLAGS += -std=c99 -Wall -Wextra -Wundef -Wshadow -Wcast-align -Wstrict-prototypes
|
||||||
LDFLAGS = -I.
|
LDFLAGS = -I.
|
||||||
|
17
lib/fse.c
17
lib/fse.c
@ -135,7 +135,7 @@ typedef signed long long S64;
|
|||||||
* Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable).
|
* Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable).
|
||||||
* This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`.
|
* This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`.
|
||||||
* Method 2 : direct access. This method is portable but violate C standard.
|
* Method 2 : direct access. This method is portable but violate C standard.
|
||||||
* It can generate buggy code on targets which generate assembly depending on alignment.
|
* It can generate buggy code on targets generating assembly depending on alignment.
|
||||||
* But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6)
|
* But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6)
|
||||||
* See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details.
|
* See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details.
|
||||||
* Prefer these methods in priority order (0 > 1 > 2)
|
* Prefer these methods in priority order (0 > 1 > 2)
|
||||||
@ -1398,6 +1398,7 @@ size_t FSE_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize
|
|||||||
errorCode = FSE_count (count, &maxSymbolValue, ip, srcSize);
|
errorCode = FSE_count (count, &maxSymbolValue, ip, srcSize);
|
||||||
if (FSE_isError(errorCode)) return errorCode;
|
if (FSE_isError(errorCode)) return errorCode;
|
||||||
if (errorCode == srcSize) return 1;
|
if (errorCode == srcSize) return 1;
|
||||||
|
if (errorCode == 1) return 0; /* each symbol only present once */
|
||||||
if (errorCode < (srcSize >> 7)) return 0; /* Heuristic : not compressible enough */
|
if (errorCode < (srcSize >> 7)) return 0; /* Heuristic : not compressible enough */
|
||||||
|
|
||||||
tableLog = FSE_optimalTableLog(tableLog, srcSize, maxSymbolValue);
|
tableLog = FSE_optimalTableLog(tableLog, srcSize, maxSymbolValue);
|
||||||
@ -1529,12 +1530,14 @@ size_t FSE_initDStream(FSE_DStream_t* bitD, const void* srcBuffer, size_t srcSiz
|
|||||||
*/
|
*/
|
||||||
static size_t FSE_lookBits(FSE_DStream_t* bitD, U32 nbBits)
|
static size_t FSE_lookBits(FSE_DStream_t* bitD, U32 nbBits)
|
||||||
{
|
{
|
||||||
return ((bitD->bitContainer << (bitD->bitsConsumed & ((sizeof(bitD->bitContainer)*8)-1))) >> 1) >> (((sizeof(bitD->bitContainer)*8)-1)-nbBits);
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
||||||
|
return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t FSE_lookBitsFast(FSE_DStream_t* bitD, U32 nbBits) /* only if nbBits >= 1 !! */
|
static size_t FSE_lookBitsFast(FSE_DStream_t* bitD, U32 nbBits) /* only if nbBits >= 1 !! */
|
||||||
{
|
{
|
||||||
return (bitD->bitContainer << bitD->bitsConsumed) >> ((sizeof(bitD->bitContainer)*8)-nbBits);
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
||||||
|
return (bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> (((bitMask+1)-nbBits) & bitMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FSE_skipBits(FSE_DStream_t* bitD, U32 nbBits)
|
static void FSE_skipBits(FSE_DStream_t* bitD, U32 nbBits)
|
||||||
@ -1904,11 +1907,17 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits)
|
|||||||
if (rankLast[nBitsToDecrease-1] == noOne)
|
if (rankLast[nBitsToDecrease-1] == noOne)
|
||||||
rankLast[nBitsToDecrease-1] = rankLast[nBitsToDecrease]; // now there is one elt
|
rankLast[nBitsToDecrease-1] = rankLast[nBitsToDecrease]; // now there is one elt
|
||||||
huffNode[rankLast[nBitsToDecrease]].nbBits ++;
|
huffNode[rankLast[nBitsToDecrease]].nbBits ++;
|
||||||
|
if (rankLast[nBitsToDecrease] == 0)
|
||||||
|
rankLast[nBitsToDecrease] = noOne;
|
||||||
|
else
|
||||||
|
{
|
||||||
rankLast[nBitsToDecrease]--;
|
rankLast[nBitsToDecrease]--;
|
||||||
if (huffNode[rankLast[nBitsToDecrease]].nbBits != maxNbBits-nBitsToDecrease)
|
if (huffNode[rankLast[nBitsToDecrease]].nbBits != maxNbBits-nBitsToDecrease)
|
||||||
rankLast[nBitsToDecrease] = noOne; // rank list emptied
|
rankLast[nBitsToDecrease] = noOne; // rank list emptied
|
||||||
}
|
}
|
||||||
while (totalCost < 0) // Sometimes, cost correction overshoot
|
}
|
||||||
|
|
||||||
|
while (totalCost < 0) /* Sometimes, cost correction overshoot */
|
||||||
{
|
{
|
||||||
if (rankLast[1] == noOne) /* special case, no weight 1, let's find it back at n */
|
if (rankLast[1] == noOne) /* special case, no weight 1, let's find it back at n */
|
||||||
{
|
{
|
||||||
|
@ -1389,7 +1389,7 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|||||||
if (ZSTD_32bits()) FSE_reloadDStream(&(seqState->DStream));
|
if (ZSTD_32bits()) FSE_reloadDStream(&(seqState->DStream));
|
||||||
nbBits = offsetCode - 1;
|
nbBits = offsetCode - 1;
|
||||||
if (offsetCode==0) nbBits = 0; /* cmove */
|
if (offsetCode==0) nbBits = 0; /* cmove */
|
||||||
offset = ((size_t)1 << nbBits) + FSE_readBits(&(seqState->DStream), nbBits);
|
offset = ((size_t)1 << (nbBits & ((sizeof(offset)*8)-1))) + FSE_readBits(&(seqState->DStream), nbBits);
|
||||||
if (ZSTD_32bits()) FSE_reloadDStream(&(seqState->DStream));
|
if (ZSTD_32bits()) FSE_reloadDStream(&(seqState->DStream));
|
||||||
if (offsetCode==0) offset = prevOffset;
|
if (offsetCode==0) offset = prevOffset;
|
||||||
}
|
}
|
||||||
|
@ -30,12 +30,12 @@
|
|||||||
# fullbench32: Same as fullbench, but forced to compile in 32-bits mode
|
# fullbench32: Same as fullbench, but forced to compile in 32-bits mode
|
||||||
# ##########################################################################
|
# ##########################################################################
|
||||||
|
|
||||||
RELEASE?= v0.1.0
|
VERSION?= v0.1.1
|
||||||
|
|
||||||
DESTDIR?=
|
DESTDIR?=
|
||||||
PREFIX ?= /usr
|
PREFIX ?= /usr/local
|
||||||
CFLAGS ?= -O3
|
CFLAGS ?= -O3
|
||||||
CFLAGS += -std=c99 -Wall -Wextra -Wundef -Wshadow -Wcast-qual -Wcast-align -Wstrict-prototypes -DZSTD_VERSION=\"$(RELEASE)\"
|
CFLAGS += -std=c99 -Wall -Wextra -Wundef -Wshadow -Wcast-qual -Wcast-align -Wstrict-prototypes -DZSTD_VERSION=\"$(VERSION)\"
|
||||||
LDFLAGS = -I../lib
|
LDFLAGS = -I../lib
|
||||||
FLAGS = $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(MOREFLAGS)
|
FLAGS = $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(MOREFLAGS)
|
||||||
|
|
||||||
@ -43,9 +43,6 @@ BINDIR=$(PREFIX)/bin
|
|||||||
MANDIR = $(PREFIX)/share/man/man1
|
MANDIR = $(PREFIX)/share/man/man1
|
||||||
ZSTDDIR = ../lib
|
ZSTDDIR = ../lib
|
||||||
|
|
||||||
TEST_FILES = COPYING
|
|
||||||
TEST_TARGETS=test-native
|
|
||||||
|
|
||||||
|
|
||||||
# Define *.exe as extension for Windows systems
|
# Define *.exe as extension for Windows systems
|
||||||
ifneq (,$(filter Windows%,$(OS)))
|
ifneq (,$(filter Windows%,$(OS)))
|
||||||
@ -120,9 +117,12 @@ test: test-zstd test-fullbench test-fuzzer
|
|||||||
|
|
||||||
test32: test-zstd32 test-fullbench32 test-fuzzer32
|
test32: test-zstd32 test-fullbench32 test-fuzzer32
|
||||||
|
|
||||||
test-all: test test32 test-mem
|
test-all: test test32 memtest
|
||||||
|
|
||||||
test-zstd: zstd datagen
|
test-zstd: zstd datagen
|
||||||
|
@echo "*** zstd cli write error test ***"
|
||||||
|
echo foo | ./zstd > /dev/full; if [ $$? -eq 0 ] ; then echo "write error not detected!"; false; fi
|
||||||
|
@echo "*** zstd round-trip tests *** "
|
||||||
./datagen | ./zstd -v | ./zstd -d > $(VOID)
|
./datagen | ./zstd -v | ./zstd -d > $(VOID)
|
||||||
./datagen -g256MB | ./zstd -v | ./zstd -d > $(VOID)
|
./datagen -g256MB | ./zstd -v | ./zstd -d > $(VOID)
|
||||||
./datagen -g6GB -P99 | ./zstd -vq | ./zstd -d > $(VOID)
|
./datagen -g6GB -P99 | ./zstd -vq | ./zstd -d > $(VOID)
|
||||||
@ -146,15 +146,15 @@ test-fuzzer: fuzzer
|
|||||||
test-fuzzer32: fuzzer32
|
test-fuzzer32: fuzzer32
|
||||||
./fuzzer32
|
./fuzzer32
|
||||||
|
|
||||||
test-mem: zstd datagen fuzzer fullbench
|
memtest: zstd datagen fuzzer fullbench
|
||||||
@echo "\n ---- valgrind tests : memory analyzer ----"
|
@echo "\n ---- valgrind tests : memory analyzer ----"
|
||||||
valgrind --leak-check=yes --error-exitcode=1 ./datagen -g50M > /dev/null
|
valgrind --leak-check=yes --error-exitcode=1 ./datagen -g50M > $(VOID)
|
||||||
./datagen -g16KB > tmp
|
./datagen -g16KB > tmp
|
||||||
valgrind --leak-check=yes --error-exitcode=1 ./zstd -vf tmp /dev/null
|
valgrind --leak-check=yes --error-exitcode=1 ./zstd -vf tmp $(VOID)
|
||||||
./datagen -g64MB > tmp
|
./datagen -g64MB > tmp
|
||||||
valgrind --leak-check=yes --error-exitcode=1 ./zstd -vf tmp /dev/null
|
valgrind --leak-check=yes --error-exitcode=1 ./zstd -vf tmp $(VOID)
|
||||||
@rm tmp
|
@rm tmp
|
||||||
valgrind --leak-check=yes --error-exitcode=1 ./fuzzer -i128 -t1
|
valgrind --leak-check=yes --error-exitcode=1 ./fuzzer -i1000 -t1
|
||||||
valgrind --leak-check=yes --error-exitcode=1 ./fullbench -i1
|
valgrind --leak-check=yes --error-exitcode=1 ./fullbench -i1
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
#include <stdlib.h> /* malloc, free */
|
#include <stdlib.h> /* malloc, free */
|
||||||
#include <string.h> /* strcmp, strlen */
|
#include <string.h> /* strcmp, strlen */
|
||||||
#include <time.h> /* clock */
|
#include <time.h> /* clock */
|
||||||
|
#include <errno.h> /* errno */
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
#include "zstd_static.h"
|
#include "zstd_static.h"
|
||||||
|
|
||||||
@ -254,7 +255,7 @@ unsigned long long FIO_compressFilename(const char* output_filename, const char*
|
|||||||
if (ZSTD_isError(cSize)) EXM_THROW(22, "Compression error : cannot create frame header");
|
if (ZSTD_isError(cSize)) EXM_THROW(22, "Compression error : cannot create frame header");
|
||||||
|
|
||||||
sizeCheck = fwrite(outBuff, 1, cSize, foutput);
|
sizeCheck = fwrite(outBuff, 1, cSize, foutput);
|
||||||
if (sizeCheck!=cSize) EXM_THROW(23, "Write error : cannot write header");
|
if (sizeCheck!=cSize) EXM_THROW(23, "Write error : cannot write header into %s", output_filename);
|
||||||
compressedfilesize += cSize;
|
compressedfilesize += cSize;
|
||||||
|
|
||||||
/* Main compression loop */
|
/* Main compression loop */
|
||||||
@ -276,7 +277,7 @@ unsigned long long FIO_compressFilename(const char* output_filename, const char*
|
|||||||
|
|
||||||
/* Write cBlock */
|
/* Write cBlock */
|
||||||
sizeCheck = fwrite(outBuff, 1, cSize, foutput);
|
sizeCheck = fwrite(outBuff, 1, cSize, foutput);
|
||||||
if (sizeCheck!=cSize) EXM_THROW(25, "Write error : cannot write compressed block");
|
if (sizeCheck!=cSize) EXM_THROW(25, "Write error : cannot write compressed block into %s", output_filename);
|
||||||
compressedfilesize += cSize;
|
compressedfilesize += cSize;
|
||||||
inSlot += inSize;
|
inSlot += inSize;
|
||||||
|
|
||||||
@ -288,7 +289,7 @@ unsigned long long FIO_compressFilename(const char* output_filename, const char*
|
|||||||
if (ZSTD_isError(cSize)) EXM_THROW(26, "Compression error : cannot create frame end");
|
if (ZSTD_isError(cSize)) EXM_THROW(26, "Compression error : cannot create frame end");
|
||||||
|
|
||||||
sizeCheck = fwrite(outBuff, 1, cSize, foutput);
|
sizeCheck = fwrite(outBuff, 1, cSize, foutput);
|
||||||
if (sizeCheck!=cSize) EXM_THROW(27, "Write error : cannot write frame end");
|
if (sizeCheck!=cSize) EXM_THROW(27, "Write error : cannot write frame end into %s", output_filename);
|
||||||
compressedfilesize += cSize;
|
compressedfilesize += cSize;
|
||||||
|
|
||||||
/* Status */
|
/* Status */
|
||||||
@ -299,9 +300,9 @@ unsigned long long FIO_compressFilename(const char* output_filename, const char*
|
|||||||
/* clean */
|
/* clean */
|
||||||
free(inBuff);
|
free(inBuff);
|
||||||
free(outBuff);
|
free(outBuff);
|
||||||
fclose(finput);
|
|
||||||
fclose(foutput);
|
|
||||||
ZSTD_freeCCtx(ctx);
|
ZSTD_freeCCtx(ctx);
|
||||||
|
fclose(finput);
|
||||||
|
if (fclose(foutput)) EXM_THROW(28, "Write error : cannot properly close %s", output_filename);
|
||||||
|
|
||||||
return compressedfilesize;
|
return compressedfilesize;
|
||||||
}
|
}
|
||||||
|
@ -616,7 +616,7 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
/* Modify Nb Iterations */
|
/* Modify Nb Iterations */
|
||||||
case 'i':
|
case 'i':
|
||||||
if ((argument[1] >='1') && (argument[1] <='9'))
|
if ((argument[1] >='0') && (argument[1] <='9'))
|
||||||
{
|
{
|
||||||
int iters = argument[1] - '0';
|
int iters = argument[1] - '0';
|
||||||
BMK_SetNbIterations(iters);
|
BMK_SetNbIterations(iters);
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
\"
|
|
||||||
\" unzstd.1: This is a manual page for 'unzstd' program. This file is part of
|
|
||||||
\" the zstd <https://github.com/Cyan4973/zstd/> project.
|
|
||||||
\"
|
|
||||||
|
|
||||||
\" No hyphenation
|
|
||||||
.hy 0
|
|
||||||
.nr HY 0
|
|
||||||
|
|
||||||
.TH unzstd "1" "2014-06-20" "unzstd" "User Commands"
|
|
||||||
.SH NAME
|
|
||||||
\fBunzstd\fR - Utility based on zstd
|
|
||||||
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.TP 5
|
|
||||||
\fBunzstd\fR [\fBOPTIONS\fR] [-|INPUT-FILE]
|
|
||||||
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
\fBunzstd\fR is an utility based on \fBzstd\fR, a fast lossless compression algorithm.
|
|
||||||
|
|
||||||
\fBunzstd\fR decompress input file, it is equivalent to \fBzstd -d\fR,
|
|
||||||
|
|
||||||
Available options are the same as \fBzstd\fR ones (man zstd).
|
|
||||||
|
|
||||||
|
|
||||||
.SH BUGS
|
|
||||||
Report bugs at:- https://github.com/Cyan4973/zstd/
|
|
||||||
|
|
||||||
.SH AUTHOR
|
|
||||||
Yann Collet
|
|
1
programs/unzstd.1
Symbolic link
1
programs/unzstd.1
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
zstd.1
|
@ -1,26 +1,35 @@
|
|||||||
\"
|
\"
|
||||||
\" zstd.1: This is a manual page for 'zstd' program. This file is part of the
|
\" zstd.1: This is a manual page for 'zstd' program. This file is part of the
|
||||||
\" zstd <https://github.com/Cyan4973/zstd> project.
|
\" zstd <http://www.zstd.net/> project.
|
||||||
|
\" Author: Yann Collet
|
||||||
\"
|
\"
|
||||||
|
|
||||||
\" No hyphenation
|
\" No hyphenation
|
||||||
.hy 0
|
.hy 0
|
||||||
.nr HY 0
|
.nr HY 0
|
||||||
|
|
||||||
.TH zstd "1" "2015-01-22" "zstd" "User Commands"
|
.TH zstd "1" "2015-08-22" "zstd" "User Commands"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
\fBzstd\fR - standard compression algorithm
|
\fBzstd, unzstd, zstdcat\fR - Compress or decompress .zst files
|
||||||
|
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.TP 5
|
.TP 5
|
||||||
\fBzstd\fR [\fBOPTIONS\fR] [-|INPUT-FILE] <OUTPUT-FILE>
|
\fBzstd\fR [\fBOPTIONS\fR] [-|INPUT-FILE] <OUTPUT-FILE>
|
||||||
|
.PP
|
||||||
|
.B unzstd
|
||||||
|
is equivalent to
|
||||||
|
.BR "zstd \-d"
|
||||||
|
.br
|
||||||
|
.B zstdcat
|
||||||
|
is equivalent to
|
||||||
|
.BR "zstd \-dc"
|
||||||
|
.br
|
||||||
|
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.PP
|
.PP
|
||||||
\fBzstd\fR is a fast lossless compression algorithm
|
\fBzstd\fR is a fast lossless compression algorithm.
|
||||||
with highly parametrable compression strength and memory usage.
|
It is based on the \fBLZ77\fR family, with FSE & huff0 entropy stage.
|
||||||
It is based on the \fBLZ77\fR family, coupled with FSE entropy stage.
|
zstd offers compression speed > 200 MB/s per core.
|
||||||
zstd offers compression speed of 200 MB/s per core.
|
|
||||||
It also features a fast decoder, with speed > 500 MB/s per core.
|
It also features a fast decoder, with speed > 500 MB/s per core.
|
||||||
\fBzstd\fR supports the following options :
|
\fBzstd\fR supports the following options :
|
||||||
|
|
||||||
@ -35,13 +44,13 @@ It also features a fast decoder, with speed > 500 MB/s per core.
|
|||||||
.B \-f
|
.B \-f
|
||||||
overwrite output without prompting
|
overwrite output without prompting
|
||||||
.TP
|
.TP
|
||||||
.B \-h/\-H
|
.BR \-h/\-H ", " --help
|
||||||
display help/long help and exit
|
display help/long help and exit
|
||||||
.TP
|
.TP
|
||||||
.B \-V
|
.BR \-V ", " --version
|
||||||
display Version number and exit
|
display Version number and exit
|
||||||
.TP
|
.TP
|
||||||
.B \-v
|
.BR \-v ", " --verbose
|
||||||
verbose mode
|
verbose mode
|
||||||
.TP
|
.TP
|
||||||
.B \-q
|
.B \-q
|
||||||
@ -63,7 +72,7 @@ It also features a fast decoder, with speed > 500 MB/s per core.
|
|||||||
iteration loops [1-9](default : 3), benchmark mode only
|
iteration loops [1-9](default : 3), benchmark mode only
|
||||||
|
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
Report bugs at:- https://github.com/Cyan4973/zstd
|
Report bugs at:- https://github.com/Cyan4973/zstd/issues
|
||||||
|
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Yann Collet
|
Yann Collet
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
\"
|
|
||||||
\" zstdcat.1: This is a manual page for 'zstdcat' program. This file is part of
|
|
||||||
\" the zstd <https://github.com/Cyan4973/zstd/> project.
|
|
||||||
\"
|
|
||||||
|
|
||||||
\" No hyphenation
|
|
||||||
.hy 0
|
|
||||||
.nr HY 0
|
|
||||||
|
|
||||||
.TH zstdcat "1" "2014-06-20" "zstdcat" "User Commands"
|
|
||||||
.SH NAME
|
|
||||||
\fBzstdcat\fR - Utility based on zstd
|
|
||||||
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.TP 5
|
|
||||||
\fBzstdcat\fR [\fBOPTIONS\fR] [-|INPUT-FILE]
|
|
||||||
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
\fBzstdcat\fR is an utility based on \fBzstd\fR, a fast lossless compression algorithm.
|
|
||||||
|
|
||||||
\fBzstdcat\fR decompress input file or stream, redirecting its output to the console.
|
|
||||||
It is equivalent to \fBzstd -cd\fR,
|
|
||||||
|
|
||||||
Available options are the same as \fBzstd\fR ones (man zstd).
|
|
||||||
|
|
||||||
|
|
||||||
.SH BUGS
|
|
||||||
Report bugs at:- https://github.com/Cyan4973/zstd/
|
|
||||||
|
|
||||||
.SH AUTHOR
|
|
||||||
Yann Collet
|
|
1
programs/zstdcat.1
Symbolic link
1
programs/zstdcat.1
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
zstd.1
|
@ -86,8 +86,9 @@
|
|||||||
/**************************************
|
/**************************************
|
||||||
* Display Macros
|
* Display Macros
|
||||||
**************************************/
|
**************************************/
|
||||||
#define DISPLAY(...) fprintf(stderr, __VA_ARGS__)
|
#define DISPLAY(...) fprintf(displayOut, __VA_ARGS__)
|
||||||
#define DISPLAYLEVEL(l, ...) if (displayLevel>=l) { DISPLAY(__VA_ARGS__); }
|
#define DISPLAYLEVEL(l, ...) if (displayLevel>=l) { DISPLAY(__VA_ARGS__); }
|
||||||
|
static FILE* displayOut;
|
||||||
static unsigned displayLevel = 2; // 0 : no display // 1: errors // 2 : + result + interaction + warnings ; // 3 : + progression; // 4 : + information
|
static unsigned displayLevel = 2; // 0 : no display // 1: errors // 2 : + result + interaction + warnings ; // 3 : + progression; // 4 : + information
|
||||||
|
|
||||||
|
|
||||||
@ -137,7 +138,7 @@ static int usage_advanced(const char* programName)
|
|||||||
//DISPLAY( " -t : test compressed file integrity\n");
|
//DISPLAY( " -t : test compressed file integrity\n");
|
||||||
DISPLAY( "Benchmark arguments :\n");
|
DISPLAY( "Benchmark arguments :\n");
|
||||||
DISPLAY( " -b : benchmark file(s)\n");
|
DISPLAY( " -b : benchmark file(s)\n");
|
||||||
DISPLAY( " -i# : iteration loops [1-9](default : 3), benchmark mode only\n");
|
DISPLAY( " -i# : iteration loops [1-9](default : 3)\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,30 +174,32 @@ int main(int argc, char** argv)
|
|||||||
char* dynNameSpace = NULL;
|
char* dynNameSpace = NULL;
|
||||||
char extension[] = ZSTD_EXTENSION;
|
char extension[] = ZSTD_EXTENSION;
|
||||||
|
|
||||||
|
displayOut = stderr;
|
||||||
/* Pick out basename component. Don't rely on stdlib because of conflicting behaviour. */
|
/* Pick out basename component. Don't rely on stdlib because of conflicting behaviour. */
|
||||||
for (i = (int)strlen(programName); i > 0; i--)
|
for (i = (int)strlen(programName); i > 0; i--)
|
||||||
{
|
{
|
||||||
if (programName[i] == '/')
|
if (programName[i] == '/') { i++; break; }
|
||||||
{
|
|
||||||
i++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
programName += i;
|
programName += i;
|
||||||
|
|
||||||
/* zstdcat behavior */
|
/* zstdcat preset behavior */
|
||||||
if (!strcmp(programName, ZSTD_CAT)) { decode=1; forceStdout=1; displayLevel=1; outFileName=stdoutmark; }
|
if (!strcmp(programName, ZSTD_CAT)) { decode=1; forceStdout=1; displayLevel=1; outFileName=stdoutmark; }
|
||||||
|
|
||||||
/* unzstd behavior */
|
/* unzstd preset behavior */
|
||||||
if (!strcmp(programName, ZSTD_UNZSTD))
|
if (!strcmp(programName, ZSTD_UNZSTD))
|
||||||
decode=1;
|
decode=1;
|
||||||
|
|
||||||
// command switches
|
/* command switches */
|
||||||
for(i=1; i<argc; i++)
|
for(i=1; i<argc; i++)
|
||||||
{
|
{
|
||||||
char* argument = argv[i];
|
char* argument = argv[i];
|
||||||
|
|
||||||
if(!argument) continue; // Protection if argument empty
|
if(!argument) continue; /* Protection if argument empty */
|
||||||
|
|
||||||
|
/* long commands (--long-word) */
|
||||||
|
if (!strcmp(argument, "--version")) { displayOut=stdout; DISPLAY(WELCOME_MESSAGE); return 0; }
|
||||||
|
if (!strcmp(argument, "--help")) { displayOut=stdout; return usage_advanced(programName); }
|
||||||
|
if (!strcmp(argument, "--verbose")) { displayLevel=4; continue; }
|
||||||
|
|
||||||
/* Decode commands (note : aggregated commands are allowed) */
|
/* Decode commands (note : aggregated commands are allowed) */
|
||||||
if (argument[0]=='-')
|
if (argument[0]=='-')
|
||||||
@ -206,6 +209,7 @@ int main(int argc, char** argv)
|
|||||||
{
|
{
|
||||||
if (!inFileName) inFileName=stdinmark;
|
if (!inFileName) inFileName=stdinmark;
|
||||||
else outFileName=stdoutmark;
|
else outFileName=stdoutmark;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
argument++;
|
argument++;
|
||||||
@ -215,9 +219,9 @@ int main(int argc, char** argv)
|
|||||||
switch(argument[0])
|
switch(argument[0])
|
||||||
{
|
{
|
||||||
/* Display help */
|
/* Display help */
|
||||||
case 'V': DISPLAY(WELCOME_MESSAGE); return 0; /* Version Only */
|
case 'V': displayOut=stdout; DISPLAY(WELCOME_MESSAGE); return 0; /* Version Only */
|
||||||
case 'H':
|
case 'H':
|
||||||
case 'h': return usage_advanced(programName);
|
case 'h': displayOut=stdout; return usage_advanced(programName);
|
||||||
|
|
||||||
// Compression (default)
|
// Compression (default)
|
||||||
//case 'z': forceCompress = 1; break;
|
//case 'z': forceCompress = 1; break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user