From 45e1995c4051ce47fe846d2ada7beed0a0be9c7c Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 7 May 2015 13:00:21 +0100 Subject: minor introduction update --- lz4_Block_format.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lz4_Block_format.md b/lz4_Block_format.md index a120a0b..ea568d8 100644 --- a/lz4_Block_format.md +++ b/lz4_Block_format.md @@ -1,25 +1,26 @@ LZ4 Block Format Description ============================ -Last revised: 2015-03-26. +Last revised: 2015-05-07. Author : Yann Collet -This small specification intents to provide enough information -to anyone willing to produce LZ4-compatible compressed data blocks +This specification is intended for developers +willing to produce LZ4-compatible compressed data blocks using any programming language. LZ4 is an LZ77-type compressor with a fixed, byte-oriented encoding. -The most important design principle behind LZ4 is simplicity. -It helps to create an easy to read and maintain source code. -It also helps later on for optimizations, compactness, and speed. There is no entropy encoder back-end nor framing layer. -The latter is assumed to be handled by other parts of the system. +The latter is assumed to be handled by other parts of the system (see [LZ4 Frame format]). +This design is assumed to favor simplicity and speed. +It helps later on for optimizations, compactness, and features. -This document only describes the block format, -not how the LZ4 compressor nor decompressor actually work. +This document describes only the block format, +not how the compressor nor decompressor actually work. The correctness of the decompressor should not depend on implementation details of the compressor, and vice versa. +[LZ4 Frame format]: LZ4_Frame_format.md + Compressed block format -- cgit v0.12 From 96078481d7672b427aa9b088af74b3f920f9d11e Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 7 May 2015 13:03:07 +0100 Subject: Fixed minor typo --- lz4_Frame_format.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lz4_Frame_format.md b/lz4_Frame_format.md index cb41d47..e8aa08f 100644 --- a/lz4_Frame_format.md +++ b/lz4_Frame_format.md @@ -211,7 +211,7 @@ It can be safely skipped by a conformant decoder. __Header Checksum__ One-byte checksum of combined descriptor fields, including optional ones. -The value is the second byte of xxh32() : ` (xxh32()>>8) & 0xFF } ` +The value is the second byte of xxh32() : ` (xxh32()>>8) & 0xFF ` using zero as a seed, and the full Frame Descriptor as an input (including optional fields when they are present). -- cgit v0.12 From 05c3f66bb8f0c4b4f4fc8422b1afdf982bbd86e6 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 12 May 2015 10:10:20 +0100 Subject: Updated a few comments --- lib/lz4.c | 2 +- lib/lz4.h | 3 +-- lz4_Frame_format.md | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/lz4.c b/lib/lz4.c index 55f2359..c74044e 100644 --- a/lib/lz4.c +++ b/lib/lz4.c @@ -45,7 +45,7 @@ /* * ACCELERATION_DEFAULT : - * Select the value of "acceleration" for LZ4_compress_fast() when parameter == 0 + * Select "acceleration" for LZ4_compress_fast() when parameter value <= 0 */ #define ACCELERATION_DEFAULT 1 diff --git a/lib/lz4.h b/lib/lz4.h index 20e3d48..99c6ebb 100644 --- a/lib/lz4.h +++ b/lib/lz4.h @@ -122,8 +122,8 @@ LZ4_compress_fast() : Same as LZ4_compress_default(), but allows to select an "acceleration" factor. The larger the acceleration value, the faster the algorithm, but also the lesser the compression. It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. - An acceleration value of "0" means "use Default value" (see lz4.c) An acceleration value of "1" is the same as regular LZ4_compress_default() + Values <= 0 will be replaced by ACCELERATION_DEFAULT (see lz4.c), which is 1. */ int LZ4_compress_fast (const char* source, char* dest, int sourceSize, int maxDestSize, int acceleration); @@ -145,7 +145,6 @@ LZ4_compress_destSize() : into already allocated buffer 'dest' of size 'targetDestSize'. This function either compresses the entire 'source' content into 'dest' if it's large enough, or fill 'dest' buffer completely with as much data as possible from 'source'. - Original idea by WiredTiger team. *sourceSizePtr : will be modified to indicate how many bytes where read from 'source' to fill 'dest'. New value is necessarily <= old value. return : Nb bytes written into 'dest' (necessarily <= targetDestSize) diff --git a/lz4_Frame_format.md b/lz4_Frame_format.md index e8aa08f..73d3cba 100644 --- a/lz4_Frame_format.md +++ b/lz4_Frame_format.md @@ -205,8 +205,8 @@ This is the original (uncompressed) size. This information is optional, and only present if the associated flag is set. Content size is provided using unsigned 8 Bytes, for a maximum of 16 HexaBytes. Format is Little endian. -This value is informational. -It can be safely skipped by a conformant decoder. +This value is informational, typically for display or memory allocation. +It can be skipped by a decoder, or used to validate content correctness. __Header Checksum__ -- cgit v0.12 From f02c4671cdeab39635b924b922a8cb29b466e796 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 13 May 2015 15:22:33 +0100 Subject: Added a few more interoperability tests (32bits vs 64 bits) --- NEWS | 5 ++++- README.md | 2 +- programs/Makefile | 16 +++++++++++----- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 08622f2..6d872fe 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,8 @@ +r130: + r129: -Added : LZ4_compress_fast() +Added : LZ4_compress_fast(), LZ4_compress_fast_continue() +Added : LZ4_compress_destSize() Changed: New lz4 and lz4hc compression API. Previous function prototypes still supported. Changed: Sparse file support enabled by default New : LZ4 CLI improved performance compressing/decompressing multiple files (#86, kind contribution from Kyle J. Harper & Takayuki Matsuoka) diff --git a/README.md b/README.md index d050029..8b441d9 100644 --- a/README.md +++ b/README.md @@ -77,4 +77,4 @@ A list of these sources is maintained on the [LZ4 Homepage]. [Silesia Corpus]: http://sun.aei.polsl.pl/~sdeor/index.php?page=silesia [lz4_Block_format]: lz4_Block_format.md [lz4_Frame_format]: lz4_Frame_format.md -[LZ4 Homepage]: http://www.lz4.info +[LZ4 Homepage]: http://www.lz4.org diff --git a/programs/Makefile b/programs/Makefile index 39335db..8ede048 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -224,16 +224,22 @@ test-lz4: lz4 datagen test-lz4-multiple test-lz4-sparse test-lz4-contentSize tes test-lz4c: lz4c datagen ./datagen -g256MB | ./lz4c -l -v | ./lz4c -t -test-lz4c32: lz4 lz4c32 datagen - ./datagen -g16KB | ./lz4c32 -9 | ./lz4c32 -t +test-interop-32-64: lz4 lz4c32 datagen + @echo ---- test interoperability 32-bits -vs- 64 bits ---- ./datagen -g16KB | ./lz4c32 -9 | ./lz4 -t - ./datagen | ./lz4c32 | ./lz4c32 -t + ./datagen -P10 | ./lz4 -9B4 | ./lz4c32 -t ./datagen | ./lz4c32 | ./lz4 -t - ./datagen -g256MB | ./lz4c32 -vqB4D | ./lz4c32 -qt + ./datagen -g1M | ./lz4 -3B5 | ./lz4c32 -t ./datagen -g256MB | ./lz4c32 -vqB4D | ./lz4 -qt - ./datagen -g6GB | ./lz4c32 -vqB5D | ./lz4c32 -qt + ./datagen -g1G -P90 | ./lz4 | ./lz4c32 -t ./datagen -g6GB | ./lz4c32 -vq9BD | ./lz4 -qt +test-lz4c32: lz4c32 datagen test-interop-32-64 + ./datagen -g16KB | ./lz4c32 -9 | ./lz4c32 -t + ./datagen | ./lz4c32 | ./lz4c32 -t + ./datagen -g256MB | ./lz4c32 -vqB4D | ./lz4c32 -qt + ./datagen -g6GB | ./lz4c32 -vqB5D | ./lz4c32 -qt + test-fullbench: fullbench ./fullbench --no-prompt $(NB_LOOPS) $(TEST_FILES) -- cgit v0.12 From fe11e0b142e383f8602ef54fc56011cc60cdfaf7 Mon Sep 17 00:00:00 2001 From: Takayuki MATSUOKA Date: Fri, 15 May 2015 09:27:44 +0900 Subject: Issue #103 : Add compatibility test between releases Add forward/backward compatibility test between all versions - Add new Makefile target "versionstest". - Standard test procedure like "make versionstest && make clean" works properly. test/test-lz4-versions.py - This script creates test/lz4test and checkout all Release tagged versions. After that, compile all versions of lz4c and lz4c32 and compress/decompress between all versions. - This test clones entire git repository to checkout all tags. - Since Travis's default command does not clone entire repository, we could not checkout all tags from Travis' default clone. - After that, test script shows all unique .lz4 files. In this list, 'r999' means 'head' of current working copy. --- .travis.yml | 2 + Makefile | 4 ++ test/Makefile | 40 +++++++++++++++ test/test-lz4-versions.py | 121 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 167 insertions(+) create mode 100644 test/Makefile create mode 100644 test/test-lz4-versions.py diff --git a/.travis.yml b/.travis.yml index 398a0f1..6c505bc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ before_install: - sudo apt-get install -qq g++-multilib - sudo apt-get install -qq gcc-multilib - sudo apt-get install -qq valgrind + - sudo apt-get install -qq python3 env: - LZ4_TRAVIS_CI_ENV=travis-install @@ -18,6 +19,7 @@ env: - LZ4_TRAVIS_CI_ENV=staticAnalyze - LZ4_TRAVIS_CI_ENV=gpptest - LZ4_TRAVIS_CI_ENV=armtest + - LZ4_TRAVIS_CI_ENV=versionstest - LZ4_TRAVIS_CI_ENV=test-lz4 - LZ4_TRAVIS_CI_ENV=test-lz4c - LZ4_TRAVIS_CI_ENV=test-lz4c32 diff --git a/Makefile b/Makefile index 88c4016..93cf846 100644 --- a/Makefile +++ b/Makefile @@ -71,6 +71,7 @@ clean: @cd $(PRGDIR); $(MAKE) clean > $(VOID) @cd $(LZ4DIR); $(MAKE) clean > $(VOID) @cd examples; $(MAKE) clean > $(VOID) + @cd test; $(MAKE) clean > $(VOID) @echo Cleaning completed @@ -113,6 +114,9 @@ armtest: clean cd lib; $(MAKE) -e all CC=arm-linux-gnueabi-gcc CPPFLAGS="-Werror" cd programs; $(MAKE) -e bins CC=arm-linux-gnueabi-gcc CPPFLAGS="-Werror" +versionstest: clean + @cd test; $(MAKE) -e versionstest + streaming-examples: cd examples; $(MAKE) -e test diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..af377c4 --- /dev/null +++ b/test/Makefile @@ -0,0 +1,40 @@ +# ########################################################################## +# LZ4 tests - Makefile +# Copyright (C) Yann Collet 2011-2015 +# +# GPL v2 License +# +# 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; either version 2 of the License, or +# (at your option) any later version. +# +# 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# You can contact the author at : +# - LZ4 source repository : https://github.com/Cyan4973/lz4 +# - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c +# ########################################################################## +# versionstest : Compatibility test between all LZ4 versions +# ########################################################################## + +PYTHON?= python3 +TESTDIR := lz4test + +default: all + +all: versionstest + +versionstest: + $(PYTHON) test-lz4-versions.py + +clean: + @rm -fR $(TESTDIR) + @echo Cleaning completed diff --git a/test/test-lz4-versions.py b/test/test-lz4-versions.py new file mode 100644 index 0000000..6605051 --- /dev/null +++ b/test/test-lz4-versions.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 + +import glob +import subprocess +import filecmp +import os +import shutil +import sys + +repo_url = 'https://github.com/Cyan4973/lz4.git' +tmp_dir_name = 'test/lz4test' +make_cmd = 'make' +git_cmd = 'git' +test_dat_src = 'README.md' +test_dat = 'test_dat' +head = 'r999' + +def proc(cmd_args, pipe=True, dummy=False): + if dummy: + return + if pipe: + subproc = subprocess.Popen(cmd_args, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + else: + subproc = subprocess.Popen(cmd_args) + return subproc.communicate() + +def make(args, pipe=True): + return proc([make_cmd] + args, pipe) + +def git(args, pipe=True): + return proc([git_cmd] + args, pipe) + +def get_git_tags(): + stdout, stderr = git(['tag', '-l', 'r[0-9][0-9][0-9]']) + tags = stdout.decode('utf-8').split() + return tags + +if __name__ == '__main__': + error_code = 0 + base_dir = os.getcwd() + '/..' # /path/to/lz4 + tmp_dir = base_dir + '/' + tmp_dir_name # /path/to/lz4/test/lz4test + clone_dir = tmp_dir + '/' + 'lz4' # /path/to/lz4/test/lz4test/lz4 + programs_dir = base_dir + '/programs' # /path/to/lz4/programs + os.makedirs(tmp_dir, exist_ok=True) + + # since Travis clones limited depth, we should clone full repository + if not os.path.isdir(clone_dir): + git(['clone', repo_url, clone_dir]) + + shutil.copy2(base_dir + '/' + test_dat_src, tmp_dir + '/' + test_dat) + + # Retrieve all release tags + os.chdir(clone_dir) + tags = [head] + get_git_tags() + + # Build all release lz4c and lz4c32 + for tag in tags: + os.chdir(base_dir) + dst_lz4c = '{}/lz4c.{}' .format(tmp_dir, tag) # /path/to/lz4/test/lz4test/lz4c. + dst_lz4c32 = '{}/lz4c32.{}'.format(tmp_dir, tag) # /path/to/lz4/test/lz4test/lz4c32. + if not os.path.isfile(dst_lz4c) or not os.path.isfile(dst_lz4c32): + if tag != head: + r_dir = '{}/{}'.format(tmp_dir, tag) # /path/to/lz4/test/lz4test/ + os.makedirs(r_dir, exist_ok=True) + os.chdir(clone_dir) + git(['--work-tree=' + r_dir, 'checkout', tag, '--', '.'], False) + os.chdir(r_dir + '/programs') # /path/to/lz4/lz4test//programs + else: + os.chdir(programs_dir) + make(['clean', 'lz4c', 'lz4c32'], False) + shutil.copy2('lz4c', dst_lz4c) + shutil.copy2('lz4c32', dst_lz4c32) + + # Compress test.dat by all released lz4c and lz4c32 + os.chdir(tmp_dir) + for lz4 in glob.glob("*.lz4"): + os.remove(lz4) + for tag in tags: + proc(['./lz4c.' + tag, '-1fz', test_dat, test_dat + '_1_64_' + tag + '.lz4']) + proc(['./lz4c.' + tag, '-9fz', test_dat, test_dat + '_9_64_' + tag + '.lz4']) + proc(['./lz4c32.' + tag, '-1fz', test_dat, test_dat + '_1_32_' + tag + '.lz4']) + proc(['./lz4c32.' + tag, '-9fz', test_dat, test_dat + '_9_32_' + tag + '.lz4']) + + # Remove duplicated .lz4 files + lz4s = sorted(glob.glob('*.lz4')) + for i, lz4 in enumerate(lz4s): + if not os.path.isfile(lz4): + continue + for j in range(i+1, len(lz4s)): + lz4t = lz4s[j] + if not os.path.isfile(lz4t): + continue + if filecmp.cmp(lz4, lz4t): + os.remove(lz4t) + + # Decompress remained .lz4 files by all released lz4c and lz4c32 + lz4s = sorted(glob.glob('*.lz4')) + for lz4 in lz4s: + for tag in tags: + proc(['./lz4c.' + tag, '-df', lz4, lz4 + '_d64_' + tag + '.dec']) + proc(['./lz4c32.' + tag, '-df', lz4, lz4 + '_d32_' + tag + '.dec']) + + # Compare all '.dec' files with test_dat + decs = glob.glob('*.dec') + for dec in decs: + if not filecmp.cmp(dec, test_dat): + print('ERR : ' + dec) + error_code = 1 + else: + os.remove(dec) + + lz4s = sorted(glob.glob('*.lz4')) + for lz4 in lz4s: + print(lz4) + + if error_code != 0: + print('ERROR') + + sys.exit(error_code) -- cgit v0.12 From c779c8004c890b61791fd8c96afa62dccd7ed507 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 15 May 2015 15:44:37 +0100 Subject: minor cosmetic changes for Takayuki's testVersions --- programs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/Makefile b/programs/Makefile index 8ede048..23cbc3d 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -34,7 +34,7 @@ # datagen : generates synthetic data samples for tests & benchmarks # ########################################################################## -RELEASE?= r129 +RELEASE?= r130 DESTDIR?= PREFIX ?= /usr/local -- cgit v0.12 From cdb136d9606753e314c318c9dbb27b6699d04571 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 15 May 2015 16:51:07 +0200 Subject: cosmetic changes, 2nd try --- Makefile | 2 +- test/Makefile | 4 ++-- test/test-lz4-versions.py | 21 +++++++++++++++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 93cf846..11fe182 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ # ################################################################ # Version number -export VERSION=129 +export VERSION=130 export RELEASE=r$(VERSION) DESTDIR?= diff --git a/test/Makefile b/test/Makefile index af377c4..d1768d4 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,6 +1,6 @@ # ########################################################################## # LZ4 tests - Makefile -# Copyright (C) Yann Collet 2011-2015 +# Copyright (C) Takayuki Matsuoka - Yann Collet 2011-2015 # # GPL v2 License # @@ -22,7 +22,7 @@ # - LZ4 source repository : https://github.com/Cyan4973/lz4 # - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c # ########################################################################## -# versionstest : Compatibility test between all LZ4 versions +# versionstest : Compatibility test between LZ4 versions stored on Github (r116+) # ########################################################################## PYTHON?= python3 diff --git a/test/test-lz4-versions.py b/test/test-lz4-versions.py index 6605051..9b7e0c5 100644 --- a/test/test-lz4-versions.py +++ b/test/test-lz4-versions.py @@ -52,8 +52,10 @@ if __name__ == '__main__': shutil.copy2(base_dir + '/' + test_dat_src, tmp_dir + '/' + test_dat) # Retrieve all release tags + print('Retrieve all release tags :') os.chdir(clone_dir) tags = [head] + get_git_tags() + print(tags); # Build all release lz4c and lz4c32 for tag in tags: @@ -74,6 +76,7 @@ if __name__ == '__main__': shutil.copy2('lz4c32', dst_lz4c32) # Compress test.dat by all released lz4c and lz4c32 + print('Compress test.dat by all released lz4c and lz4c32') os.chdir(tmp_dir) for lz4 in glob.glob("*.lz4"): os.remove(lz4) @@ -83,6 +86,11 @@ if __name__ == '__main__': proc(['./lz4c32.' + tag, '-1fz', test_dat, test_dat + '_1_32_' + tag + '.lz4']) proc(['./lz4c32.' + tag, '-9fz', test_dat, test_dat + '_9_32_' + tag + '.lz4']) + print('Full list of compressed files') + lz4s = sorted(glob.glob('*.lz4')) + for lz4 in lz4s: + print(lz4 + ' : ' + repr(os.path.getsize(lz4))) + # Remove duplicated .lz4 files lz4s = sorted(glob.glob('*.lz4')) for i, lz4 in enumerate(lz4s): @@ -95,12 +103,21 @@ if __name__ == '__main__': if filecmp.cmp(lz4, lz4t): os.remove(lz4t) + print('Enumerate only different compressed files') + lz4s = sorted(glob.glob('*.lz4')) + for lz4 in lz4s: + print(lz4 + ' : ' + repr(os.path.getsize(lz4))) + # Decompress remained .lz4 files by all released lz4c and lz4c32 + print('Decompression tests and verifications') lz4s = sorted(glob.glob('*.lz4')) for lz4 in lz4s: + print(lz4, end=" ", flush=True) for tag in tags: + print(tag, end=" ", flush=True) proc(['./lz4c.' + tag, '-df', lz4, lz4 + '_d64_' + tag + '.dec']) proc(['./lz4c32.' + tag, '-df', lz4, lz4 + '_d32_' + tag + '.dec']) + print(' OK') # Compare all '.dec' files with test_dat decs = glob.glob('*.dec') @@ -111,10 +128,6 @@ if __name__ == '__main__': else: os.remove(dec) - lz4s = sorted(glob.glob('*.lz4')) - for lz4 in lz4s: - print(lz4) - if error_code != 0: print('ERROR') -- cgit v0.12 From 60d657ac86ce2db86a5392d26452e9c63230f0a3 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 17 May 2015 20:55:49 +0100 Subject: removed "flush" argument to please Travis's python version --- test/test-lz4-versions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test-lz4-versions.py b/test/test-lz4-versions.py index 9b7e0c5..b6ed126 100644 --- a/test/test-lz4-versions.py +++ b/test/test-lz4-versions.py @@ -112,12 +112,12 @@ if __name__ == '__main__': print('Decompression tests and verifications') lz4s = sorted(glob.glob('*.lz4')) for lz4 in lz4s: - print(lz4, end=" ", flush=True) + print(lz4, end=" ") for tag in tags: - print(tag, end=" ", flush=True) + print(tag, end=" ") proc(['./lz4c.' + tag, '-df', lz4, lz4 + '_d64_' + tag + '.dec']) proc(['./lz4c32.' + tag, '-df', lz4, lz4 + '_d32_' + tag + '.dec']) - print(' OK') + print(' OK') # well, here, decompression has worked; but file is not yet verified # Compare all '.dec' files with test_dat decs = glob.glob('*.dec') -- cgit v0.12 From 58b5aadb1fc5d937e81c8f33e0e8290f2097c6bb Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 18 May 2015 22:09:37 +0100 Subject: Fixed sparse issue with non seekable streams (#105) --- programs/Makefile | 5 ++++- programs/lz4cli.c | 2 +- programs/lz4io.c | 18 ++++++++++++------ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/programs/Makefile b/programs/Makefile index 23cbc3d..7e04811 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -150,7 +150,7 @@ test-all: test test32 test-travis: $(TRAVIS_TARGET) test-lz4-sparse: lz4 datagen - @echo ---- test sparse file support ---- + @echo "\n ---- test sparse file support ----" ./datagen -g5M -P100 > tmpSrc ./lz4 -B4D tmpSrc | ./lz4 -dv --sparse > tmpB4 diff -s tmpSrc tmpB4 @@ -167,6 +167,9 @@ test-lz4-sparse: lz4 datagen ./datagen -s1 -g1200007 -P100 | diff -s - tmpOdd ls -ls tmpOdd @rm tmp* + @echo "\n Compatibility with Console :" + ./lz4 COPYING | ./lz4 -d -c + ./lz4 COPYING | ./lz4 -d | cat test-lz4-contentSize: lz4 datagen @echo ---- test original size support ---- diff --git a/programs/lz4cli.c b/programs/lz4cli.c index 970856d..65af428 100644 --- a/programs/lz4cli.c +++ b/programs/lz4cli.c @@ -473,7 +473,7 @@ int main(int argc, char** argv) if (multiple_inputs) input_filename = inFileNames[0], output_filename = (const char*)(inFileNames[0]); if(!input_filename) { input_filename=stdinmark; } - /* Check if input or output are defined as console; trigger an error in this case */ + /* Check if input is defined as console; trigger an error in this case */ if (!strcmp(input_filename, stdinmark) && IS_CONSOLE(stdin) ) badusage(); /* Check if benchmark is selected */ diff --git a/programs/lz4io.c b/programs/lz4io.c index 209f5ed..92f8706 100644 --- a/programs/lz4io.c +++ b/programs/lz4io.c @@ -303,6 +303,12 @@ static int LZ4IO_getFiles(const char* input_filename, const char* output_filenam if ( *pfoutput==0) EXM_THROW(13, "Pb opening %s", output_filename); + if (g_sparseFileSupport) + { + long int ftr = ftell(*pfoutput); + if (ftr==-1) g_sparseFileSupport = 0; + } + return 0; } @@ -639,7 +645,7 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer if (!g_sparseFileSupport) /* normal write */ { size_t sizeCheck = fwrite(buffer, 1, bufferSize, file); - if (sizeCheck != bufferSize) EXM_THROW(68, "Write error : cannot write decoded block"); + if (sizeCheck != bufferSize) EXM_THROW(70, "Write error : cannot write decoded block"); return 0; } @@ -647,7 +653,7 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer if (storedSkips > 1 GB) { int seekResult = fseek(file, 1 GB, SEEK_CUR); - if (seekResult != 0) EXM_THROW(68, "1 GB skip error (sparse file support)"); + if (seekResult != 0) EXM_THROW(71, "1 GB skip error (sparse file support)"); storedSkips -= 1 GB; } @@ -667,12 +673,12 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer { size_t sizeCheck; seekResult = fseek(file, storedSkips, SEEK_CUR); - if (seekResult) EXM_THROW(68, "Skip error (sparse file)"); + if (seekResult) EXM_THROW(72, "Skip error (sparse file)"); storedSkips = 0; seg0SizeT -= nb0T; ptrT += nb0T; sizeCheck = fwrite(ptrT, sizeT, seg0SizeT, file); - if (sizeCheck != seg0SizeT) EXM_THROW(68, "Write error : cannot write decoded block"); + if (sizeCheck != seg0SizeT) EXM_THROW(73, "Write error : cannot write decoded block"); } ptrT += seg0SizeT; } @@ -689,10 +695,10 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer { size_t sizeCheck; int seekResult = fseek(file, storedSkips, SEEK_CUR); - if (seekResult) EXM_THROW(68, "Skip error (end of block)"); + if (seekResult) EXM_THROW(74, "Skip error (end of block)"); storedSkips = 0; sizeCheck = fwrite(restPtr, 1, restEnd - restPtr, file); - if (sizeCheck != (size_t)(restEnd - restPtr)) EXM_THROW(68, "Write error : cannot write decoded end of block"); + if (sizeCheck != (size_t)(restEnd - restPtr)) EXM_THROW(75, "Write error : cannot write decoded end of block"); } } -- cgit v0.12 From a9ff13a8bb9932a4784b9cbb654075dfff7652fe Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 18 May 2015 22:35:09 +0100 Subject: minor test refactor --- programs/Makefile | 14 ++++++++------ programs/lz4io.c | 5 +++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/programs/Makefile b/programs/Makefile index 7e04811..3548ceb 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -172,7 +172,7 @@ test-lz4-sparse: lz4 datagen ./lz4 COPYING | ./lz4 -d | cat test-lz4-contentSize: lz4 datagen - @echo ---- test original size support ---- + @echo "\n ---- test original size support ----" ./datagen -g15M > tmp ./lz4 -v tmp | ./lz4 -t ./lz4 -v --content-size tmp | ./lz4 -d > tmp2 @@ -185,7 +185,7 @@ test-lz4-contentSize: lz4 datagen @rm tmp* test-lz4-frame-concatenation: lz4 datagen - @echo ---- test frame concatenation ---- + @echo "\n ---- test frame concatenation ----" @echo -n > empty.test @echo hi > nonempty.test cat nonempty.test empty.test nonempty.test > orig.test @@ -198,7 +198,7 @@ test-lz4-frame-concatenation: lz4 datagen @echo frame concatenation test completed test-lz4-multiple: lz4 datagen - @echo ---- test multiple files ---- + @echo "\n ---- test multiple files ----" @./datagen -s1 > tmp1 2> $(VOID) @./datagen -s2 -g100K > tmp2 2> $(VOID) @./datagen -s3 -g1M > tmp3 2> $(VOID) @@ -210,8 +210,8 @@ test-lz4-multiple: lz4 datagen ./lz4 -f -m tmp1 notHere tmp2; echo $$? @rm tmp* -test-lz4: lz4 datagen test-lz4-multiple test-lz4-sparse test-lz4-contentSize test-lz4-frame-concatenation - @echo ---- test lz4 basic compression/decompression ---- +test-lz4-basic: lz4 datagen + @echo "\n ---- test lz4 basic compression/decompression ----" ./datagen -g0 | ./lz4 -v | ./lz4 -t ./datagen -g16KB | ./lz4 -9 | ./lz4 -t ./datagen | ./lz4 | ./lz4 -t @@ -221,7 +221,9 @@ test-lz4: lz4 datagen test-lz4-multiple test-lz4-sparse test-lz4-contentSize tes ./datagen -g256MB | ./lz4 -vqB4D | ./lz4 -t ./datagen -g6GB | ./lz4 -vqB5D | ./lz4 -qt ./datagen -g6GB | ./lz4 -vq9BD | ./lz4 -qt - @echo ---- test pass-through ---- + +test-lz4: lz4 datagen test-lz4-basic test-lz4-multiple test-lz4-sparse test-lz4-contentSize test-lz4-frame-concatenation + @echo "\n ---- test pass-through ----" ./datagen | ./lz4 -tf test-lz4c: lz4c datagen diff --git a/programs/lz4io.c b/programs/lz4io.c index 92f8706..8b80fbc 100644 --- a/programs/lz4io.c +++ b/programs/lz4io.c @@ -301,12 +301,13 @@ static int LZ4IO_getFiles(const char* input_filename, const char* output_filenam *pfoutput = fopen( output_filename, "wb" ); } - if ( *pfoutput==0) EXM_THROW(13, "Pb opening %s", output_filename); + if (*pfoutput==0) EXM_THROW(13, "Pb opening %s", output_filename); if (g_sparseFileSupport) { long int ftr = ftell(*pfoutput); - if (ftr==-1) g_sparseFileSupport = 0; + /* DISPLAY("%s->%s ==> %i \n", input_filename, output_filename, (int)ftr); */ + if (ftr!=0) g_sparseFileSupport = 0; } return 0; -- cgit v0.12 From 87e560ed8aa776a864c105f0ab064d45aca76cbd Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 19 May 2015 10:29:41 +0100 Subject: minor tests improvements --- programs/Makefile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/programs/Makefile b/programs/Makefile index 3548ceb..1798b8f 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -227,10 +227,11 @@ test-lz4: lz4 datagen test-lz4-basic test-lz4-multiple test-lz4-sparse test-lz4- ./datagen | ./lz4 -tf test-lz4c: lz4c datagen + @echo "\n ---- test lz4c version ----" ./datagen -g256MB | ./lz4c -l -v | ./lz4c -t test-interop-32-64: lz4 lz4c32 datagen - @echo ---- test interoperability 32-bits -vs- 64 bits ---- + @echo "\n ---- test interoperability 32-bits -vs- 64 bits ----" ./datagen -g16KB | ./lz4c32 -9 | ./lz4 -t ./datagen -P10 | ./lz4 -9B4 | ./lz4c32 -t ./datagen | ./lz4c32 | ./lz4 -t @@ -239,12 +240,15 @@ test-interop-32-64: lz4 lz4c32 datagen ./datagen -g1G -P90 | ./lz4 | ./lz4c32 -t ./datagen -g6GB | ./lz4c32 -vq9BD | ./lz4 -qt -test-lz4c32: lz4c32 datagen test-interop-32-64 +test-lz4c32-basic: lz4c32 datagen + @echo "\n ---- test lz4c32 32-bits version ----" ./datagen -g16KB | ./lz4c32 -9 | ./lz4c32 -t ./datagen | ./lz4c32 | ./lz4c32 -t ./datagen -g256MB | ./lz4c32 -vqB4D | ./lz4c32 -qt ./datagen -g6GB | ./lz4c32 -vqB5D | ./lz4c32 -qt +test-lz4c32: test-lz4c32-basic test-interop-32-64 + test-fullbench: fullbench ./fullbench --no-prompt $(NB_LOOPS) $(TEST_FILES) @@ -264,6 +268,7 @@ test-frametest32: frametest32 ./frametest32 $(FUZZER_TIME) test-mem: lz4 datagen fuzzer frametest fullbench + @echo "\n ---- valgrind tests : memory analyzer ----" valgrind --leak-check=yes --error-exitcode=1 ./datagen -g50M > $(VOID) ./datagen -g16KB > tmp valgrind --leak-check=yes --error-exitcode=1 ./lz4 -9 -BD -f tmp $(VOID) -- cgit v0.12 From 26065c3f47381c6ebe56ea114015b3c2b1c2a615 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 20 May 2015 08:58:59 +0100 Subject: Fixed : LZ4IO exits too early when frame crc not present, reported by Yongwoon Cho (#106) --- NEWS | 2 ++ programs/Makefile | 11 +++++++++-- programs/lz4io.c | 3 ++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 6d872fe..8cb5129 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,6 @@ r130: +Fixed : incompatibility sparse mode vs console, reported by Yongwoon Cho (#105) +Fixed : LZ4IO exits too early when frame crc not present, reported by Yongwoon Cho (#106) r129: Added : LZ4_compress_fast(), LZ4_compress_fast_continue() diff --git a/programs/Makefile b/programs/Makefile index 1798b8f..f015d27 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -168,8 +168,9 @@ test-lz4-sparse: lz4 datagen ls -ls tmpOdd @rm tmp* @echo "\n Compatibility with Console :" - ./lz4 COPYING | ./lz4 -d -c - ./lz4 COPYING | ./lz4 -d | cat + echo "Hello World 1 !" | ./lz4 | ./lz4 -d -c + echo "Hello World 2 !" | ./lz4 | ./lz4 -d | cat + echo "Hello World 3 !" | ./lz4 --no-frame-crc | ./lz4 -d -c test-lz4-contentSize: lz4 datagen @echo "\n ---- test original size support ----" @@ -214,6 +215,11 @@ test-lz4-basic: lz4 datagen @echo "\n ---- test lz4 basic compression/decompression ----" ./datagen -g0 | ./lz4 -v | ./lz4 -t ./datagen -g16KB | ./lz4 -9 | ./lz4 -t + ./datagen -g20KB > tmpSrc + ./lz4 < tmpSrc | ./lz4 -d > tmpRes + diff -q tmpSrc tmpRes + ./lz4 --no-frame-crc < tmpSrc | ./lz4 -d > tmpRes + diff -q tmpSrc tmpRes ./datagen | ./lz4 | ./lz4 -t ./datagen -g6M -P99 | ./lz4 -9BD | ./lz4 -t ./datagen -g17M | ./lz4 -9v | ./lz4 -qt @@ -221,6 +227,7 @@ test-lz4-basic: lz4 datagen ./datagen -g256MB | ./lz4 -vqB4D | ./lz4 -t ./datagen -g6GB | ./lz4 -vqB5D | ./lz4 -qt ./datagen -g6GB | ./lz4 -vq9BD | ./lz4 -qt + @rm tmp* test-lz4: lz4 datagen test-lz4-basic test-lz4-multiple test-lz4-sparse test-lz4-contentSize test-lz4-frame-concatenation @echo "\n ---- test pass-through ----" diff --git a/programs/lz4io.c b/programs/lz4io.c index 8b80fbc..dc0b9ec 100644 --- a/programs/lz4io.c +++ b/programs/lz4io.c @@ -851,7 +851,6 @@ static unsigned long long LZ4IO_decompressLZ4F(dRess_t ress, FILE* srcFile, FILE nextToLoad = LZ4F_decompress(ress.dCtx, ress.dstBuffer, &decodedBytes, (char*)(ress.srcBuffer)+pos, &remaining, NULL); if (LZ4F_isError(nextToLoad)) EXM_THROW(66, "Decompression error : %s", LZ4F_getErrorName(nextToLoad)); pos += remaining; - if (!nextToLoad) break; if (decodedBytes) { @@ -860,6 +859,8 @@ static unsigned long long LZ4IO_decompressLZ4F(dRess_t ress, FILE* srcFile, FILE DISPLAYUPDATE(2, "\rDecompressed : %u MB ", (unsigned)(filesize>>20)); storedSkips = LZ4IO_fwriteSparse(dstFile, ress.dstBuffer, decodedBytes, storedSkips); } + + if (!nextToLoad) break; } } -- cgit v0.12 From 5151c30dce029e5efe9f6ac9ef137bb422ad30fd Mon Sep 17 00:00:00 2001 From: Takayuki MATSUOKA Date: Fri, 15 May 2015 23:21:52 +0900 Subject: Add log of same files and sha1 hash of unique files to versionstest --- test/test-lz4-versions.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/test-lz4-versions.py b/test/test-lz4-versions.py index b6ed126..f92fa96 100644 --- a/test/test-lz4-versions.py +++ b/test/test-lz4-versions.py @@ -6,6 +6,7 @@ import filecmp import os import shutil import sys +import hashlib repo_url = 'https://github.com/Cyan4973/lz4.git' tmp_dir_name = 'test/lz4test' @@ -37,6 +38,11 @@ def get_git_tags(): tags = stdout.decode('utf-8').split() return tags +# http://stackoverflow.com/a/19711609/2132223 +def sha1_of_file(filepath): + with open(filepath, 'rb') as f: + return hashlib.sha1(f.read()).hexdigest() + if __name__ == '__main__': error_code = 0 base_dir = os.getcwd() + '/..' # /path/to/lz4 @@ -102,6 +108,7 @@ if __name__ == '__main__': continue if filecmp.cmp(lz4, lz4t): os.remove(lz4t) + print('{} == {}'.format(lz4, lz4t)) print('Enumerate only different compressed files') lz4s = sorted(glob.glob('*.lz4')) @@ -128,6 +135,10 @@ if __name__ == '__main__': else: os.remove(dec) + lz4s = sorted(glob.glob('*.lz4')) + for lz4 in lz4s: + print('{} {}'.format(sha1_of_file(lz4), lz4)) + if error_code != 0: print('ERROR') -- cgit v0.12 From a8fdeb46762d7dd31af49c956af3ac4e48718128 Mon Sep 17 00:00:00 2001 From: Takayuki MATSUOKA Date: Fri, 15 May 2015 23:44:48 +0900 Subject: Add log output of succeeded decompression to test script --- test/test-lz4-versions.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/test-lz4-versions.py b/test/test-lz4-versions.py index f92fa96..259b19a 100644 --- a/test/test-lz4-versions.py +++ b/test/test-lz4-versions.py @@ -98,6 +98,8 @@ if __name__ == '__main__': print(lz4 + ' : ' + repr(os.path.getsize(lz4))) # Remove duplicated .lz4 files + print('') + print('Duplicated files') lz4s = sorted(glob.glob('*.lz4')) for i, lz4 in enumerate(lz4s): if not os.path.isfile(lz4): @@ -133,8 +135,11 @@ if __name__ == '__main__': print('ERR : ' + dec) error_code = 1 else: + print('OK : ' + dec) os.remove(dec) + print('') + print('Unique .lz4 files') lz4s = sorted(glob.glob('*.lz4')) for lz4 in lz4s: print('{} {}'.format(sha1_of_file(lz4), lz4)) -- cgit v0.12 From ffff9ee1380c0095c9627beb18a12838712d8a0e Mon Sep 17 00:00:00 2001 From: Takayuki MATSUOKA Date: Sat, 16 May 2015 14:58:27 +0900 Subject: Support iterative edit and testing This commit will allows iterative edit and testing to local working copy. You could iterate edit and testing by the following commands: cd /path/to/lz4 cd test make versionstest my-favorite-text-editor ../lib/lz4.c make versionstest my-favorite-text-editor ./test-lz4-versions.py make versionstest ... --- test/test-lz4-versions.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/test-lz4-versions.py b/test/test-lz4-versions.py index 259b19a..f157ab7 100644 --- a/test/test-lz4-versions.py +++ b/test/test-lz4-versions.py @@ -68,16 +68,17 @@ if __name__ == '__main__': os.chdir(base_dir) dst_lz4c = '{}/lz4c.{}' .format(tmp_dir, tag) # /path/to/lz4/test/lz4test/lz4c. dst_lz4c32 = '{}/lz4c32.{}'.format(tmp_dir, tag) # /path/to/lz4/test/lz4test/lz4c32. - if not os.path.isfile(dst_lz4c) or not os.path.isfile(dst_lz4c32): + if not os.path.isfile(dst_lz4c) or not os.path.isfile(dst_lz4c32) or tag == head: if tag != head: r_dir = '{}/{}'.format(tmp_dir, tag) # /path/to/lz4/test/lz4test/ os.makedirs(r_dir, exist_ok=True) os.chdir(clone_dir) git(['--work-tree=' + r_dir, 'checkout', tag, '--', '.'], False) os.chdir(r_dir + '/programs') # /path/to/lz4/lz4test//programs + make(['clean', 'lz4c', 'lz4c32'], False) else: os.chdir(programs_dir) - make(['clean', 'lz4c', 'lz4c32'], False) + make(['lz4c', 'lz4c32'], False) shutil.copy2('lz4c', dst_lz4c) shutil.copy2('lz4c32', dst_lz4c32) @@ -120,6 +121,8 @@ if __name__ == '__main__': # Decompress remained .lz4 files by all released lz4c and lz4c32 print('Decompression tests and verifications') lz4s = sorted(glob.glob('*.lz4')) + for dec in glob.glob("*.dec"): + os.remove(dec) for lz4 in lz4s: print(lz4, end=" ") for tag in tags: -- cgit v0.12 From e769a0eab092367cfacd1c5225d0b21a8c745617 Mon Sep 17 00:00:00 2001 From: Takayuki MATSUOKA Date: Wed, 20 May 2015 20:00:38 +0900 Subject: Combine unique .lz4 file info --- test/test-lz4-versions.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/test/test-lz4-versions.py b/test/test-lz4-versions.py index f157ab7..5531a05 100644 --- a/test/test-lz4-versions.py +++ b/test/test-lz4-versions.py @@ -116,7 +116,7 @@ if __name__ == '__main__': print('Enumerate only different compressed files') lz4s = sorted(glob.glob('*.lz4')) for lz4 in lz4s: - print(lz4 + ' : ' + repr(os.path.getsize(lz4))) + print(lz4 + ' : ' + repr(os.path.getsize(lz4)) + ', ' + sha1_of_file(lz4)) # Decompress remained .lz4 files by all released lz4c and lz4c32 print('Decompression tests and verifications') @@ -141,12 +141,6 @@ if __name__ == '__main__': print('OK : ' + dec) os.remove(dec) - print('') - print('Unique .lz4 files') - lz4s = sorted(glob.glob('*.lz4')) - for lz4 in lz4s: - print('{} {}'.format(sha1_of_file(lz4), lz4)) - if error_code != 0: print('ERROR') -- cgit v0.12 From 7d72c0cb546435d5b1ab96c7513bdb0f2f6fceba Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 20 May 2015 20:47:27 +0100 Subject: Added LZF --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8b441d9..31f6158 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ in single-thread mode. | LZO 2.06 | 2.108 | 350 MB/s | 510 MB/s | | QuickLZ 1.5.1.b6 | 2.238 | 320 MB/s | 380 MB/s | | Snappy 1.1.0 | 2.091 | 250 MB/s | 960 MB/s | +| LZF v3.6 | 2.073 | 175 MB/s | 500 MB/s | | zlib 1.2.8 -1 | 2.730 | 59 MB/s | 250 MB/s | |**LZ4 HC (r129)** |**2.720**| 22 MB/s | **1830 MB/s** | | zlib 1.2.8 -6 | 3.099 | 18 MB/s | 270 MB/s | -- cgit v0.12 From 91c1b9a682a8b4d6e9b5eb47194890c14480116d Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 21 May 2015 01:17:56 +0100 Subject: Performance fix : big compression speed boost for clang (+30%) --- Makefile | 2 +- NEWS | 1 + lib/lz4.c | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 11fe182..ac48b65 100644 --- a/Makefile +++ b/Makefile @@ -115,7 +115,7 @@ armtest: clean cd programs; $(MAKE) -e bins CC=arm-linux-gnueabi-gcc CPPFLAGS="-Werror" versionstest: clean - @cd test; $(MAKE) -e versionstest + @cd test; $(MAKE) streaming-examples: cd examples; $(MAKE) -e test diff --git a/NEWS b/NEWS index 8cb5129..9eb4283 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ r130: Fixed : incompatibility sparse mode vs console, reported by Yongwoon Cho (#105) Fixed : LZ4IO exits too early when frame crc not present, reported by Yongwoon Cho (#106) +Performance fix : big compression speed boost for clang (+30%) r129: Added : LZ4_compress_fast(), LZ4_compress_fast_continue() diff --git a/lib/lz4.c b/lib/lz4.c index c74044e..08cf6b5 100644 --- a/lib/lz4.c +++ b/lib/lz4.c @@ -432,7 +432,7 @@ static const BYTE* LZ4_getPosition(const BYTE* p, void* tableBase, tableType_t t return LZ4_getPositionOnHash(h, tableBase, tableType, srcBase); } -static int LZ4_compress_generic( +FORCE_INLINE int LZ4_compress_generic( void* const ctx, const char* const source, char* const dest, -- cgit v0.12 From acae59a73969f436f95ed31130efe0ee9f7b3e48 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 25 May 2015 07:50:41 +0100 Subject: Fixed : default sparse mode disabled on stdout, to support ` >>` redirection scenario reported by Takayuki Matsuoka (#110) --- programs/Makefile | 12 ++++++++++++ programs/lz4cli.c | 2 +- programs/lz4io.c | 16 +++++++--------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/programs/Makefile b/programs/Makefile index f015d27..43f1789 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -171,6 +171,18 @@ test-lz4-sparse: lz4 datagen echo "Hello World 1 !" | ./lz4 | ./lz4 -d -c echo "Hello World 2 !" | ./lz4 | ./lz4 -d | cat echo "Hello World 3 !" | ./lz4 --no-frame-crc | ./lz4 -d -c + @echo "\n Compatibility with Append :" + ./datagen -P100 -g1M > tmp1M + cat tmp1M > tmp2M + cat tmp1M >> tmp2M + ./lz4 -B5 -v tmp1M tmpC + ./lz4 -d -v tmpC tmpR + ./lz4 -d -v tmpC >> tmpR + ls -ls tmp* + diff tmp2M tmpR + @rm tmp* + + test-lz4-contentSize: lz4 datagen @echo "\n ---- test original size support ----" diff --git a/programs/lz4cli.c b/programs/lz4cli.c index 65af428..e5210c9 100644 --- a/programs/lz4cli.c +++ b/programs/lz4cli.c @@ -306,7 +306,7 @@ int main(int argc, char** argv) if (!strcmp(argument, "--no-frame-crc")) { LZ4IO_setStreamChecksumMode(0); continue; } if (!strcmp(argument, "--content-size")) { LZ4IO_setContentSize(1); continue; } if (!strcmp(argument, "--no-content-size")) { LZ4IO_setContentSize(0); continue; } - if (!strcmp(argument, "--sparse")) { LZ4IO_setSparseFile(1); continue; } + if (!strcmp(argument, "--sparse")) { LZ4IO_setSparseFile(2); continue; } if (!strcmp(argument, "--no-sparse")) { LZ4IO_setSparseFile(0); continue; } if (!strcmp(argument, "--verbose")) { displayLevel=4; continue; } if (!strcmp(argument, "--quiet")) { if (displayLevel) displayLevel--; continue; } diff --git a/programs/lz4io.c b/programs/lz4io.c index dc0b9ec..e782664 100644 --- a/programs/lz4io.c +++ b/programs/lz4io.c @@ -278,6 +278,11 @@ static int LZ4IO_getFiles(const char* input_filename, const char* output_filenam DISPLAYLEVEL(4,"Using stdout for output\n"); *pfoutput = stdout; SET_BINARY_MODE(stdout); + if (g_sparseFileSupport==1) + { + g_sparseFileSupport = 0; + DISPLAYLEVEL(4, "Sparse File Support is automatically disabled on stdout ; try --sparse \n"); + } } else { @@ -303,13 +308,6 @@ static int LZ4IO_getFiles(const char* input_filename, const char* output_filenam if (*pfoutput==0) EXM_THROW(13, "Pb opening %s", output_filename); - if (g_sparseFileSupport) - { - long int ftr = ftell(*pfoutput); - /* DISPLAY("%s->%s ==> %i \n", input_filename, output_filename, (int)ftr); */ - if (ftr!=0) g_sparseFileSupport = 0; - } - return 0; } @@ -674,7 +672,7 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer { size_t sizeCheck; seekResult = fseek(file, storedSkips, SEEK_CUR); - if (seekResult) EXM_THROW(72, "Skip error (sparse file)"); + if (seekResult) EXM_THROW(72, "Sparse skip error ; try --no-sparse"); storedSkips = 0; seg0SizeT -= nb0T; ptrT += nb0T; @@ -696,7 +694,7 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer { size_t sizeCheck; int seekResult = fseek(file, storedSkips, SEEK_CUR); - if (seekResult) EXM_THROW(74, "Skip error (end of block)"); + if (seekResult) EXM_THROW(74, "Sparse skip error ; try --no-sparse"); storedSkips = 0; sizeCheck = fwrite(restPtr, 1, restEnd - restPtr, file); if (sizeCheck != (size_t)(restEnd - restPtr)) EXM_THROW(75, "Write error : cannot write decoded end of block"); -- cgit v0.12 From 6f50184a4f50e435f6b3322c68b8b8114544496c Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 26 May 2015 00:23:05 +0100 Subject: Updated NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 9eb4283..8347f63 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,9 @@ r130: Fixed : incompatibility sparse mode vs console, reported by Yongwoon Cho (#105) Fixed : LZ4IO exits too early when frame crc not present, reported by Yongwoon Cho (#106) +Fixed : incompatibility sparse mode vs append mode, reported by Takayuki Matsuoka (#110) Performance fix : big compression speed boost for clang (+30%) +New : cross-version test, by Takayuki Matsuoka r129: Added : LZ4_compress_fast(), LZ4_compress_fast_continue() -- cgit v0.12