mirror of
				https://github.com/facebook/zstd.git
				synced 2025-11-03 20:33:11 +03:00 
			
		
		
		
	Merge remote-tracking branch 'refs/remotes/Cyan4973/dev' into dev
This commit is contained in:
		
							
								
								
									
										5
									
								
								.coverity.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.coverity.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
configurationVersion: 1
 | 
			
		||||
 | 
			
		||||
filters:
 | 
			
		||||
    # third-party embedded
 | 
			
		||||
    - filePath: lib/dictBuilder/divsufsort.c
 | 
			
		||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -37,3 +37,6 @@ _zstdbench/
 | 
			
		||||
 | 
			
		||||
# CMake
 | 
			
		||||
projects/cmake/
 | 
			
		||||
 | 
			
		||||
# Test artefacts
 | 
			
		||||
tmp*
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								Makefile
									
									
									
									
									
								
							@@ -41,7 +41,7 @@ else
 | 
			
		||||
VOID = /dev/null
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
.PHONY: default all zlibwrapper zstdprogram clean install uninstall travis-install test clangtest gpptest armtest usan asan uasan
 | 
			
		||||
.PHONY: default all zlibwrapper zstdprogram zstd clean install uninstall travis-install test clangtest gpptest armtest usan asan uasan
 | 
			
		||||
 | 
			
		||||
default: zstdprogram
 | 
			
		||||
 | 
			
		||||
@@ -53,6 +53,8 @@ zstdprogram:
 | 
			
		||||
	$(MAKE) -C $(PRGDIR)
 | 
			
		||||
	cp $(PRGDIR)/zstd .
 | 
			
		||||
 | 
			
		||||
zstd: zstdprogram
 | 
			
		||||
 | 
			
		||||
zlibwrapper:
 | 
			
		||||
	$(MAKE) -C $(ZSTDDIR) all
 | 
			
		||||
	$(MAKE) -C $(ZWRAPDIR) all
 | 
			
		||||
@@ -168,6 +170,9 @@ bmix32test: clean
 | 
			
		||||
 | 
			
		||||
bmi32test: clean
 | 
			
		||||
	CFLAGS="-O3 -mbmi -m32 -Werror" $(MAKE) -C $(PRGDIR) test
 | 
			
		||||
 | 
			
		||||
staticAnalyze: clean
 | 
			
		||||
	CPPFLAGS=-g scan-build --status-bugs -v $(MAKE) all
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										30
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,3 +1,33 @@
 | 
			
		||||
v0.7.5
 | 
			
		||||
Fixed : premature end of frame when zero-sized raw block, reported by Eric Biggers
 | 
			
		||||
Modified : minor compression level adaptations
 | 
			
		||||
Update : specification, to v0.1.2 : max huffman depth at 11 bits
 | 
			
		||||
changed : zstd.h moved to /lib directory
 | 
			
		||||
 | 
			
		||||
v0.7.4
 | 
			
		||||
Added : homebrew for Mac
 | 
			
		||||
Added : more examples
 | 
			
		||||
Fixed : segfault when using small dictionaries, reported by Felix Handte
 | 
			
		||||
Modified : default compression level for CLI is now 3
 | 
			
		||||
Updated : specification, to v0.1.1
 | 
			
		||||
 | 
			
		||||
v0.7.3
 | 
			
		||||
New : compression format specification
 | 
			
		||||
New : `--` separator, stating that all following arguments are file names. Suggested by Chip Turner.
 | 
			
		||||
New : `ZSTD_getDecompressedSize()`
 | 
			
		||||
New : OpenBSD target, by Juan Francisco Cantero Hurtado
 | 
			
		||||
New : `examples` directory
 | 
			
		||||
fixed : dictBuilder using HC levels, reported by Bartosz Taudul
 | 
			
		||||
fixed : legacy support from ZSTD_decompress_usingDDict(), reported by Felix Handte
 | 
			
		||||
fixed : multi-blocks decoding with intermediate uncompressed blocks, reported by Greg Slazinski
 | 
			
		||||
modified : removed "mem.h" and "error_public.h" dependencies from "zstd.h" (experimental section)
 | 
			
		||||
modified : legacy functions no longer need magic number
 | 
			
		||||
 | 
			
		||||
v0.7.2
 | 
			
		||||
fixed : ZSTD_decompressBlock() using multiple consecutive blocks. Reported by Greg Slazinski.
 | 
			
		||||
fixed : potential segfault on very large files (many gigabytes). Reported by Chip Turner.
 | 
			
		||||
fixed : CLI displays system error message when destination file cannot be created (#231). Reported by Chip Turner.
 | 
			
		||||
 | 
			
		||||
v0.7.1
 | 
			
		||||
fixed : ZBUFF_compressEnd() called multiple times with too small `dst` buffer, reported by Christophe Chevalier
 | 
			
		||||
fixed : dictBuilder fails if first sample is too small, reported by Руслан Ковалёв
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,9 @@
 | 
			
		||||
 **Zstd**, short for Zstandard, is a fast lossless compression algorithm, targeting real-time compression scenarios at zlib-level and better compression ratios.
 | 
			
		||||
 **Zstd**, short for Zstandard, is a fast lossless compression algorithm,
 | 
			
		||||
 targeting real-time compression scenarios at zlib-level and better compression ratios.
 | 
			
		||||
 | 
			
		||||
It is provided as a BSD-license package, hosted on Github.
 | 
			
		||||
It is provided as an open-source BSD-licensed **C** library.
 | 
			
		||||
For other programming languages,
 | 
			
		||||
you can consult a list of known ports on [Zstandard homepage](http://www.zstd.net/#other-languages).
 | 
			
		||||
 | 
			
		||||
|Branch      |Status   |
 | 
			
		||||
|------------|---------|
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								examples/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								examples/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
#build
 | 
			
		||||
simple_compression
 | 
			
		||||
simple_decompression
 | 
			
		||||
dictionary_compression
 | 
			
		||||
dictionary_decompression
 | 
			
		||||
 | 
			
		||||
#test artefact
 | 
			
		||||
tmp*
 | 
			
		||||
test*
 | 
			
		||||
*.zst
 | 
			
		||||
							
								
								
									
										59
									
								
								examples/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								examples/Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
# ##########################################################################
 | 
			
		||||
# ZSTD educational examples - Makefile
 | 
			
		||||
# Copyright (C) Yann Collet 2016
 | 
			
		||||
#
 | 
			
		||||
# 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 :
 | 
			
		||||
#  - zstd homepage : http://www.zstd.net/
 | 
			
		||||
# ##########################################################################
 | 
			
		||||
 | 
			
		||||
# This Makefile presumes libzstd is installed, using `sudo make install`
 | 
			
		||||
 | 
			
		||||
LDFLAGS+= -lzstd
 | 
			
		||||
 | 
			
		||||
.PHONY: default all clean test
 | 
			
		||||
 | 
			
		||||
default: all
 | 
			
		||||
 | 
			
		||||
all: simple_compression simple_decompression \
 | 
			
		||||
	dictionary_compression dictionary_decompression
 | 
			
		||||
 | 
			
		||||
simple_compression : simple_compression.c
 | 
			
		||||
	$(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) -o $@
 | 
			
		||||
 | 
			
		||||
simple_decompression : simple_decompression.c
 | 
			
		||||
	$(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) -o $@
 | 
			
		||||
 | 
			
		||||
dictionary_compression : dictionary_compression.c
 | 
			
		||||
	$(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) -o $@
 | 
			
		||||
 | 
			
		||||
dictionary_decompression : dictionary_decompression.c
 | 
			
		||||
	$(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) -o $@
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	@rm -f core *.o tmp* result* *.zst \
 | 
			
		||||
        simple_compression simple_decompression \
 | 
			
		||||
		dictionary_compression dictionary_decompression
 | 
			
		||||
	@echo Cleaning completed
 | 
			
		||||
 | 
			
		||||
test: all
 | 
			
		||||
	cp README.md tmp
 | 
			
		||||
	./simple_compression tmp
 | 
			
		||||
	@echo starting simple_decompression
 | 
			
		||||
	./simple_decompression tmp.zst
 | 
			
		||||
	@echo tests completed
 | 
			
		||||
							
								
								
									
										18
									
								
								examples/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								examples/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
Zstandard library : usage examples
 | 
			
		||||
==================================
 | 
			
		||||
 | 
			
		||||
- [Simple compression](simple_compression.c)
 | 
			
		||||
  Compress a single file.
 | 
			
		||||
  Introduces usage of : `ZSTD_compress()`
 | 
			
		||||
 | 
			
		||||
- [Simple decompression](simple_decompression.c)
 | 
			
		||||
  Decompress a single file compressed by zstd.
 | 
			
		||||
  Introduces usage of : `ZSTD_decompress()`
 | 
			
		||||
 | 
			
		||||
- [Dictionary compression](dictionary_compression.c)
 | 
			
		||||
  Compress multiple files using the same dictionary.
 | 
			
		||||
  Introduces usage of : `ZSTD_createCDict()` and `ZSTD_compress_usingCDict()`
 | 
			
		||||
 | 
			
		||||
- [Dictionary decompression](dictionary_decompression.c)
 | 
			
		||||
  Decompress multiple files using the same dictionary.
 | 
			
		||||
  Introduces usage of : `ZSTD_createDDict()` and `ZSTD_decompress_usingDDict()`
 | 
			
		||||
							
								
								
									
										163
									
								
								examples/dictionary_compression.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								examples/dictionary_compression.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,163 @@
 | 
			
		||||
/*
 | 
			
		||||
  Dictionary compression
 | 
			
		||||
  Educational program using zstd library
 | 
			
		||||
  Copyright (C) Yann Collet 2016
 | 
			
		||||
 | 
			
		||||
  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 :
 | 
			
		||||
  - zstd homepage : http://www.zstd.net/
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>    // malloc, exit
 | 
			
		||||
#include <stdio.h>     // printf
 | 
			
		||||
#include <string.h>    // strerror
 | 
			
		||||
#include <errno.h>     // errno
 | 
			
		||||
#include <sys/stat.h>  // stat
 | 
			
		||||
#include <zstd.h>      // presumes zstd library is installed
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static off_t fsize_X(const char *filename)
 | 
			
		||||
{
 | 
			
		||||
    struct stat st;
 | 
			
		||||
    if (stat(filename, &st) == 0) return st.st_size;
 | 
			
		||||
    /* error */
 | 
			
		||||
    perror(filename);
 | 
			
		||||
    exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static FILE* fopen_X(const char *filename, const char *instruction)
 | 
			
		||||
{
 | 
			
		||||
    FILE* const inFile = fopen(filename, instruction);
 | 
			
		||||
    if (inFile) return inFile;
 | 
			
		||||
    /* error */
 | 
			
		||||
    perror(filename);
 | 
			
		||||
    exit(2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void* malloc_X(size_t size)
 | 
			
		||||
{
 | 
			
		||||
    void* const buff = malloc(size);
 | 
			
		||||
    if (buff) return buff;
 | 
			
		||||
    /* error */
 | 
			
		||||
    perror(NULL);
 | 
			
		||||
    exit(3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void* loadFile_X(const char* fileName, size_t* size)
 | 
			
		||||
{
 | 
			
		||||
    off_t const buffSize = fsize_X(fileName);
 | 
			
		||||
    FILE* const inFile = fopen_X(fileName, "rb");
 | 
			
		||||
    void* const buffer = malloc_X(buffSize);
 | 
			
		||||
    size_t const readSize = fread(buffer, 1, buffSize, inFile);
 | 
			
		||||
    if (readSize != (size_t)buffSize) {
 | 
			
		||||
        fprintf(stderr, "fread: %s : %s \n", fileName, strerror(errno));
 | 
			
		||||
        exit(4);
 | 
			
		||||
    }
 | 
			
		||||
    fclose(inFile);
 | 
			
		||||
    *size = buffSize;
 | 
			
		||||
    return buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void saveFile_X(const char* fileName, const void* buff, size_t buffSize)
 | 
			
		||||
{
 | 
			
		||||
    FILE* const oFile = fopen_X(fileName, "wb");
 | 
			
		||||
    size_t const wSize = fwrite(buff, 1, buffSize, oFile);
 | 
			
		||||
    if (wSize != (size_t)buffSize) {
 | 
			
		||||
        fprintf(stderr, "fwrite: %s : %s \n", fileName, strerror(errno));
 | 
			
		||||
        exit(5);
 | 
			
		||||
    }
 | 
			
		||||
    if (fclose(oFile)) {
 | 
			
		||||
        perror(fileName);
 | 
			
		||||
        exit(6);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* createDict() :
 | 
			
		||||
   `dictFileName` is supposed to have been created using `zstd --train` */
 | 
			
		||||
static const ZSTD_CDict* createDict(const char* dictFileName)
 | 
			
		||||
{
 | 
			
		||||
    size_t dictSize;
 | 
			
		||||
    printf("loading dictionary %s \n", dictFileName);
 | 
			
		||||
    void* const dictBuffer = loadFile_X(dictFileName, &dictSize);
 | 
			
		||||
    const ZSTD_CDict* const ddict = ZSTD_createCDict(dictBuffer, dictSize, 3);
 | 
			
		||||
    free(dictBuffer);
 | 
			
		||||
    return ddict;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void compress(const char* fname, const char* oname, const ZSTD_CDict* cdict)
 | 
			
		||||
{
 | 
			
		||||
    size_t fSize;
 | 
			
		||||
    void* const fBuff = loadFile_X(fname, &fSize);
 | 
			
		||||
    size_t const cBuffSize = ZSTD_compressBound(fSize);
 | 
			
		||||
    void* const cBuff = malloc_X(cBuffSize);
 | 
			
		||||
 | 
			
		||||
    ZSTD_CCtx* const cctx = ZSTD_createCCtx();
 | 
			
		||||
    size_t const cSize = ZSTD_compress_usingCDict(cctx, cBuff, cBuffSize, fBuff, fSize, cdict);
 | 
			
		||||
    if (ZSTD_isError(cSize)) {
 | 
			
		||||
        fprintf(stderr, "error compressing %s : %s \n", fname, ZSTD_getErrorName(cSize));
 | 
			
		||||
        exit(7);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    saveFile_X(oname, cBuff, cSize);
 | 
			
		||||
 | 
			
		||||
    /* success */
 | 
			
		||||
    printf("%25s : %6u -> %7u - %s \n", fname, (unsigned)fSize, (unsigned)cSize, oname);
 | 
			
		||||
 | 
			
		||||
    ZSTD_freeCCtx(cctx);
 | 
			
		||||
    free(fBuff);
 | 
			
		||||
    free(cBuff);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static char* createOutFilename(const char* filename)
 | 
			
		||||
{
 | 
			
		||||
    size_t const inL = strlen(filename);
 | 
			
		||||
    size_t const outL = inL + 5;
 | 
			
		||||
    void* outSpace = malloc_X(outL);
 | 
			
		||||
    memset(outSpace, 0, outL);
 | 
			
		||||
    strcat(outSpace, filename);
 | 
			
		||||
    strcat(outSpace, ".zst");
 | 
			
		||||
    return (char*)outSpace;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, const char** argv)
 | 
			
		||||
{
 | 
			
		||||
    const char* const exeName = argv[0];
 | 
			
		||||
 | 
			
		||||
    if (argc<3) {
 | 
			
		||||
        fprintf(stderr, "wrong arguments\n");
 | 
			
		||||
        fprintf(stderr, "usage:\n");
 | 
			
		||||
        fprintf(stderr, "%s [FILES] dictionary\n", exeName);
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* load dictionary only once */
 | 
			
		||||
    const char* const dictName = argv[argc-1];
 | 
			
		||||
    const ZSTD_CDict* const dictPtr = createDict(dictName);
 | 
			
		||||
 | 
			
		||||
    int u;
 | 
			
		||||
    for (u=1; u<argc-1; u++) {
 | 
			
		||||
        const char* inFilename = argv[u];
 | 
			
		||||
        char* const outFilename = createOutFilename(inFilename);
 | 
			
		||||
        compress(inFilename, outFilename, dictPtr);
 | 
			
		||||
        free(outFilename);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf("All %u files compressed. \n", argc-2);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										136
									
								
								examples/dictionary_decompression.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								examples/dictionary_decompression.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,136 @@
 | 
			
		||||
/*
 | 
			
		||||
  Dictionary decompression
 | 
			
		||||
  Educational program using zstd library
 | 
			
		||||
  Copyright (C) Yann Collet 2016
 | 
			
		||||
 | 
			
		||||
  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 :
 | 
			
		||||
  - zstd homepage : http://www.zstd.net/
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>    // malloc, exit
 | 
			
		||||
#include <stdio.h>     // printf
 | 
			
		||||
#include <string.h>    // strerror
 | 
			
		||||
#include <errno.h>     // errno
 | 
			
		||||
#include <sys/stat.h>  // stat
 | 
			
		||||
#include <zstd.h>      // presumes zstd library is installed
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static off_t fsize_X(const char *filename)
 | 
			
		||||
{
 | 
			
		||||
    struct stat st;
 | 
			
		||||
    if (stat(filename, &st) == 0) return st.st_size;
 | 
			
		||||
    /* error */
 | 
			
		||||
    printf("stat: %s : %s \n", filename, strerror(errno));
 | 
			
		||||
    exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static FILE* fopen_X(const char *filename, const char *instruction)
 | 
			
		||||
{
 | 
			
		||||
    FILE* const inFile = fopen(filename, instruction);
 | 
			
		||||
    if (inFile) return inFile;
 | 
			
		||||
    /* error */
 | 
			
		||||
    printf("fopen: %s : %s \n", filename, strerror(errno));
 | 
			
		||||
    exit(2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void* malloc_X(size_t size)
 | 
			
		||||
{
 | 
			
		||||
    void* const buff = malloc(size);
 | 
			
		||||
    if (buff) return buff;
 | 
			
		||||
    /* error */
 | 
			
		||||
    printf("malloc: %s \n", strerror(errno));
 | 
			
		||||
    exit(3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void* loadFile_X(const char* fileName, size_t* size)
 | 
			
		||||
{
 | 
			
		||||
    off_t const buffSize = fsize_X(fileName);
 | 
			
		||||
    FILE* const inFile = fopen_X(fileName, "rb");
 | 
			
		||||
    void* const buffer = malloc_X(buffSize);
 | 
			
		||||
    size_t const readSize = fread(buffer, 1, buffSize, inFile);
 | 
			
		||||
    if (readSize != (size_t)buffSize) {
 | 
			
		||||
        printf("fread: %s : %s \n", fileName, strerror(errno));
 | 
			
		||||
        exit(4);
 | 
			
		||||
    }
 | 
			
		||||
    fclose(inFile);
 | 
			
		||||
    *size = buffSize;
 | 
			
		||||
    return buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* createDict() :
 | 
			
		||||
   `dictFileName` is supposed to have been created using `zstd --train` */
 | 
			
		||||
static const ZSTD_DDict* createDict(const char* dictFileName)
 | 
			
		||||
{
 | 
			
		||||
    size_t dictSize;
 | 
			
		||||
    printf("loading dictionary %s \n", dictFileName);
 | 
			
		||||
    void* const dictBuffer = loadFile_X(dictFileName, &dictSize);
 | 
			
		||||
    const ZSTD_DDict* const ddict = ZSTD_createDDict(dictBuffer, dictSize);
 | 
			
		||||
    free(dictBuffer);
 | 
			
		||||
    return ddict;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void decompress(const char* fname, const ZSTD_DDict* ddict)
 | 
			
		||||
{
 | 
			
		||||
    size_t cSize;
 | 
			
		||||
    void* const cBuff = loadFile_X(fname, &cSize);
 | 
			
		||||
    unsigned long long const rSize = ZSTD_getDecompressedSize(cBuff, cSize);
 | 
			
		||||
    if (rSize==0) {
 | 
			
		||||
        printf("%s : original size unknown \n", fname);
 | 
			
		||||
        exit(5);
 | 
			
		||||
    }
 | 
			
		||||
    void* const rBuff = malloc_X(rSize);
 | 
			
		||||
 | 
			
		||||
    ZSTD_DCtx* const dctx = ZSTD_createDCtx();
 | 
			
		||||
    size_t const dSize = ZSTD_decompress_usingDDict(dctx, rBuff, rSize, cBuff, cSize, ddict);
 | 
			
		||||
 | 
			
		||||
    if (dSize != rSize) {
 | 
			
		||||
        printf("error decoding %s : %s \n", fname, ZSTD_getErrorName(dSize));
 | 
			
		||||
        exit(7);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* success */
 | 
			
		||||
    printf("%25s : %6u -> %7u \n", fname, (unsigned)cSize, (unsigned)rSize);
 | 
			
		||||
 | 
			
		||||
    ZSTD_freeDCtx(dctx);
 | 
			
		||||
    free(rBuff);
 | 
			
		||||
    free(cBuff);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main(int argc, const char** argv)
 | 
			
		||||
{
 | 
			
		||||
    const char* const exeName = argv[0];
 | 
			
		||||
 | 
			
		||||
    if (argc<3) {
 | 
			
		||||
        printf("wrong arguments\n");
 | 
			
		||||
        printf("usage:\n");
 | 
			
		||||
        printf("%s [FILES] dictionary\n", exeName);
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* load dictionary only once */
 | 
			
		||||
    const char* const dictName = argv[argc-1];
 | 
			
		||||
    const ZSTD_DDict* const dictPtr = createDict(dictName);
 | 
			
		||||
 | 
			
		||||
    int u;
 | 
			
		||||
    for (u=1; u<argc-1; u++) decompress(argv[u], dictPtr);
 | 
			
		||||
 | 
			
		||||
    printf("All %u files correctly decoded (in memory) \n", argc-2);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										142
									
								
								examples/simple_compression.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								examples/simple_compression.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,142 @@
 | 
			
		||||
/*
 | 
			
		||||
  Simple compression
 | 
			
		||||
  Educational program using zstd library
 | 
			
		||||
  Copyright (C) Yann Collet 2016
 | 
			
		||||
 | 
			
		||||
  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 :
 | 
			
		||||
  - zstd homepage : http://www.zstd.net/
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>    // malloc, exit
 | 
			
		||||
#include <stdio.h>     // fprintf, perror
 | 
			
		||||
#include <string.h>    // strerror
 | 
			
		||||
#include <errno.h>     // errno
 | 
			
		||||
#include <sys/stat.h>  // stat
 | 
			
		||||
#include <zstd.h>      // presumes zstd library is installed
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static off_t fsize_X(const char *filename)
 | 
			
		||||
{
 | 
			
		||||
    struct stat st;
 | 
			
		||||
    if (stat(filename, &st) == 0) return st.st_size;
 | 
			
		||||
    /* error */
 | 
			
		||||
    perror(filename);
 | 
			
		||||
    exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static FILE* fopen_X(const char *filename, const char *instruction)
 | 
			
		||||
{
 | 
			
		||||
    FILE* const inFile = fopen(filename, instruction);
 | 
			
		||||
    if (inFile) return inFile;
 | 
			
		||||
    /* error */
 | 
			
		||||
    perror(filename);
 | 
			
		||||
    exit(2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void* malloc_X(size_t size)
 | 
			
		||||
{
 | 
			
		||||
    void* const buff = malloc(size);
 | 
			
		||||
    if (buff) return buff;
 | 
			
		||||
    /* error */
 | 
			
		||||
    perror(NULL);
 | 
			
		||||
    exit(3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void* loadFile_X(const char* fileName, size_t* size)
 | 
			
		||||
{
 | 
			
		||||
    off_t const buffSize = fsize_X(fileName);
 | 
			
		||||
    FILE* const inFile = fopen_X(fileName, "rb");
 | 
			
		||||
    void* const buffer = malloc_X(buffSize);
 | 
			
		||||
    size_t const readSize = fread(buffer, 1, buffSize, inFile);
 | 
			
		||||
    if (readSize != (size_t)buffSize) {
 | 
			
		||||
        fprintf(stderr, "fread: %s : %s \n", fileName, strerror(errno));
 | 
			
		||||
        exit(4);
 | 
			
		||||
    }
 | 
			
		||||
    fclose(inFile);
 | 
			
		||||
    *size = buffSize;
 | 
			
		||||
    return buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void saveFile_X(const char* fileName, const void* buff, size_t buffSize)
 | 
			
		||||
{
 | 
			
		||||
    FILE* const oFile = fopen_X(fileName, "wb");
 | 
			
		||||
    size_t const wSize = fwrite(buff, 1, buffSize, oFile);
 | 
			
		||||
    if (wSize != (size_t)buffSize) {
 | 
			
		||||
        fprintf(stderr, "fwrite: %s : %s \n", fileName, strerror(errno));
 | 
			
		||||
        exit(5);
 | 
			
		||||
    }
 | 
			
		||||
    if (fclose(oFile)) {
 | 
			
		||||
        perror(fileName);
 | 
			
		||||
        exit(6);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void compress(const char* fname, const char* oname)
 | 
			
		||||
{
 | 
			
		||||
    size_t fSize;
 | 
			
		||||
    void* const fBuff = loadFile_X(fname, &fSize);
 | 
			
		||||
    size_t const cBuffSize = ZSTD_compressBound(fSize);
 | 
			
		||||
    void* const cBuff = malloc_X(cBuffSize);
 | 
			
		||||
 | 
			
		||||
    size_t const cSize = ZSTD_compress(cBuff, cBuffSize, fBuff, fSize, 1);
 | 
			
		||||
    if (ZSTD_isError(cSize)) {
 | 
			
		||||
        fprintf(stderr, "error compressing %s : %s \n", fname, ZSTD_getErrorName(cSize));
 | 
			
		||||
        exit(7);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    saveFile_X(oname, cBuff, cSize);
 | 
			
		||||
 | 
			
		||||
    /* success */
 | 
			
		||||
    printf("%25s : %6u -> %7u - %s \n", fname, (unsigned)fSize, (unsigned)cSize, oname);
 | 
			
		||||
 | 
			
		||||
    free(fBuff);
 | 
			
		||||
    free(cBuff);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static const char* createOutFilename(const char* filename)
 | 
			
		||||
{
 | 
			
		||||
    size_t const inL = strlen(filename);
 | 
			
		||||
    size_t const outL = inL + 5;
 | 
			
		||||
    void* outSpace = malloc_X(outL);
 | 
			
		||||
    memset(outSpace, 0, outL);
 | 
			
		||||
    strcat(outSpace, filename);
 | 
			
		||||
    strcat(outSpace, ".zst");
 | 
			
		||||
    return (const char*)outSpace;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, const char** argv)
 | 
			
		||||
{
 | 
			
		||||
    const char* const exeName = argv[0];
 | 
			
		||||
    const char* const inFilename = argv[1];
 | 
			
		||||
 | 
			
		||||
    if (argc!=2) {
 | 
			
		||||
        printf("wrong arguments\n");
 | 
			
		||||
        printf("usage:\n");
 | 
			
		||||
        printf("%s FILE\n", exeName);
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const char* const outFilename = createOutFilename(inFilename);
 | 
			
		||||
    compress(inFilename, outFilename);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										119
									
								
								examples/simple_decompression.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								examples/simple_decompression.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,119 @@
 | 
			
		||||
/*
 | 
			
		||||
  Simple decompression
 | 
			
		||||
  Educational program using zstd library
 | 
			
		||||
  Copyright (C) Yann Collet 2016
 | 
			
		||||
 | 
			
		||||
  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 :
 | 
			
		||||
  - zstd homepage : http://www.zstd.net/
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>    // malloc, exit
 | 
			
		||||
#include <stdio.h>     // printf
 | 
			
		||||
#include <string.h>    // strerror
 | 
			
		||||
#include <errno.h>     // errno
 | 
			
		||||
#include <sys/stat.h>  // stat
 | 
			
		||||
#include <zstd.h>      // presumes zstd library is installed
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static off_t fsize_X(const char *filename)
 | 
			
		||||
{
 | 
			
		||||
    struct stat st;
 | 
			
		||||
    if (stat(filename, &st) == 0) return st.st_size;
 | 
			
		||||
    /* error */
 | 
			
		||||
    printf("stat: %s : %s \n", filename, strerror(errno));
 | 
			
		||||
    exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static FILE* fopen_X(const char *filename, const char *instruction)
 | 
			
		||||
{
 | 
			
		||||
    FILE* const inFile = fopen(filename, instruction);
 | 
			
		||||
    if (inFile) return inFile;
 | 
			
		||||
    /* error */
 | 
			
		||||
    printf("fopen: %s : %s \n", filename, strerror(errno));
 | 
			
		||||
    exit(2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void* malloc_X(size_t size)
 | 
			
		||||
{
 | 
			
		||||
    void* const buff = malloc(size);
 | 
			
		||||
    if (buff) return buff;
 | 
			
		||||
    /* error */
 | 
			
		||||
    printf("malloc: %s \n", strerror(errno));
 | 
			
		||||
    exit(3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void* loadFile_X(const char* fileName, size_t* size)
 | 
			
		||||
{
 | 
			
		||||
    off_t const buffSize = fsize_X(fileName);
 | 
			
		||||
    FILE* const inFile = fopen_X(fileName, "rb");
 | 
			
		||||
    void* const buffer = malloc_X(buffSize);
 | 
			
		||||
    size_t const readSize = fread(buffer, 1, buffSize, inFile);
 | 
			
		||||
    if (readSize != (size_t)buffSize) {
 | 
			
		||||
        printf("fread: %s : %s \n", fileName, strerror(errno));
 | 
			
		||||
        exit(4);
 | 
			
		||||
    }
 | 
			
		||||
    fclose(inFile);
 | 
			
		||||
    *size = buffSize;
 | 
			
		||||
    return buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void decompress(const char* fname)
 | 
			
		||||
{
 | 
			
		||||
    size_t cSize;
 | 
			
		||||
    void* const cBuff = loadFile_X(fname, &cSize);
 | 
			
		||||
    unsigned long long const rSize = ZSTD_getDecompressedSize(cBuff, cSize);
 | 
			
		||||
    if (rSize==0) {
 | 
			
		||||
        printf("%s : original size unknown \n", fname);
 | 
			
		||||
        exit(5);
 | 
			
		||||
    }
 | 
			
		||||
    void* const rBuff = malloc_X(rSize);
 | 
			
		||||
 | 
			
		||||
    size_t const dSize = ZSTD_decompress(rBuff, rSize, cBuff, cSize);
 | 
			
		||||
 | 
			
		||||
    if (dSize != rSize) {
 | 
			
		||||
        printf("error decoding %s : %s \n", fname, ZSTD_getErrorName(dSize));
 | 
			
		||||
        exit(7);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* success */
 | 
			
		||||
    printf("%25s : %6u -> %7u \n", fname, (unsigned)cSize, (unsigned)rSize);
 | 
			
		||||
 | 
			
		||||
    free(rBuff);
 | 
			
		||||
    free(cBuff);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main(int argc, const char** argv)
 | 
			
		||||
{
 | 
			
		||||
    const char* const exeName = argv[0];
 | 
			
		||||
 | 
			
		||||
    if (argc!=2) {
 | 
			
		||||
        printf("wrong arguments\n");
 | 
			
		||||
        printf("usage:\n");
 | 
			
		||||
        printf("%s FILE\n", exeName);
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    decompress(argv[1]);
 | 
			
		||||
 | 
			
		||||
    printf("%s correctly decoded (in memory). \n", argv[1]);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2
									
								
								lib/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								lib/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
# make install artefact
 | 
			
		||||
libzstd.pc
 | 
			
		||||
							
								
								
									
										10
									
								
								lib/Makefile
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								lib/Makefile
									
									
									
									
									
								
							@@ -31,9 +31,9 @@
 | 
			
		||||
# ################################################################
 | 
			
		||||
 | 
			
		||||
# Version numbers
 | 
			
		||||
LIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./common/zstd.h`
 | 
			
		||||
LIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./common/zstd.h`
 | 
			
		||||
LIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./common/zstd.h`
 | 
			
		||||
LIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
 | 
			
		||||
LIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
 | 
			
		||||
LIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
 | 
			
		||||
LIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT)
 | 
			
		||||
LIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT))
 | 
			
		||||
LIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT))
 | 
			
		||||
@@ -46,7 +46,7 @@ PREFIX ?= /usr/local
 | 
			
		||||
LIBDIR ?= $(PREFIX)/lib
 | 
			
		||||
INCLUDEDIR=$(PREFIX)/include
 | 
			
		||||
 | 
			
		||||
CPPFLAGS= -I./common -DXXH_NAMESPACE=ZSTD_
 | 
			
		||||
CPPFLAGS= -I. -I./common -DXXH_NAMESPACE=ZSTD_
 | 
			
		||||
CFLAGS ?= -O3
 | 
			
		||||
CFLAGS += -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement -Wstrict-prototypes -Wundef
 | 
			
		||||
FLAGS   = $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(MOREFLAGS)
 | 
			
		||||
@@ -117,7 +117,7 @@ install: libzstd libzstd.pc
 | 
			
		||||
	@cp -a libzstd.$(SHARED_EXT) $(DESTDIR)$(LIBDIR)
 | 
			
		||||
	@cp -a libzstd.pc $(DESTDIR)$(LIBDIR)/pkgconfig/
 | 
			
		||||
	@install -m 644 libzstd.a $(DESTDIR)$(LIBDIR)/libzstd.a
 | 
			
		||||
	@install -m 644 common/zstd.h $(DESTDIR)$(INCLUDEDIR)/zstd.h
 | 
			
		||||
	@install -m 644 zstd.h $(DESTDIR)$(INCLUDEDIR)/zstd.h
 | 
			
		||||
	@install -m 644 common/zbuff.h $(DESTDIR)$(INCLUDEDIR)/zbuff.h
 | 
			
		||||
	@install -m 644 dictBuilder/zdict.h $(DESTDIR)$(INCLUDEDIR)/zdict.h
 | 
			
		||||
	@echo zstd static and shared library installed
 | 
			
		||||
 
 | 
			
		||||
@@ -1,63 +1,57 @@
 | 
			
		||||
zstd - library files
 | 
			
		||||
================================
 | 
			
		||||
 | 
			
		||||
The __lib__ directory contains several files, but depending on target use case, some of them may not be necessary.
 | 
			
		||||
 | 
			
		||||
#### Minimal library files
 | 
			
		||||
 | 
			
		||||
To build the zstd library the following files are required:
 | 
			
		||||
 | 
			
		||||
- [common/bitstream.h](common/bitstream.h)
 | 
			
		||||
- [common/error_private.h](common/error_private.h)
 | 
			
		||||
- [common/error_public.h](common/error_public.h)
 | 
			
		||||
- common/fse.h
 | 
			
		||||
- common/fse_decompress.c
 | 
			
		||||
- common/huf.h
 | 
			
		||||
- [common/mem.h](common/mem.h)
 | 
			
		||||
- [common/zstd.h]
 | 
			
		||||
- common/zstd_internal.h
 | 
			
		||||
- compress/fse_compress.c
 | 
			
		||||
- compress/huf_compress.c
 | 
			
		||||
- compress/zstd_compress.c
 | 
			
		||||
- compress/zstd_opt.h
 | 
			
		||||
- decompress/huf_decompress.c
 | 
			
		||||
- decompress/zstd_decompress.c
 | 
			
		||||
 | 
			
		||||
Stable API is exposed in [common/zstd.h].
 | 
			
		||||
Advanced and experimental API can be enabled by defining `ZSTD_STATIC_LINKING_ONLY`.
 | 
			
		||||
Never use them with a dynamic library, as their definition may change in future versions.
 | 
			
		||||
 | 
			
		||||
[common/zstd.h]: common/zstd.h
 | 
			
		||||
The __lib__ directory contains several directories.
 | 
			
		||||
Depending on target use case, it's enough to include only files from relevant directories.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#### Separate compressor and decompressor
 | 
			
		||||
#### API
 | 
			
		||||
 | 
			
		||||
To build a separate zstd compressor all files from `common/` and `compressor/` directories are required.
 | 
			
		||||
In a similar way to build a separate zstd decompressor all files from `common/` and `decompressor/` directories are needed.
 | 
			
		||||
Zstandard's stable API is exposed within [zstd.h](zstd.h),
 | 
			
		||||
at the root of `lib` directory.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#### Buffered streaming
 | 
			
		||||
#### Advanced API
 | 
			
		||||
 | 
			
		||||
This complementary API makes streaming integration easier.
 | 
			
		||||
It is used by `zstd` command line utility, and [7zip plugin](http://mcmilk.de/projects/7-Zip-ZStd) :
 | 
			
		||||
Some additional API may be useful if you're looking into advanced features :
 | 
			
		||||
- common/error_public.h : transform function result into an `enum`,
 | 
			
		||||
                          for precise error handling.
 | 
			
		||||
- ZSTD_STATIC_LINKING_ONLY : if you define this macro _before_ including `zstd.h`,
 | 
			
		||||
                          it will give access to advanced and experimental API.
 | 
			
		||||
                          These APIs shall ___never be used with dynamic library___ !
 | 
			
		||||
                          They are not "stable", their definition may change in the future.
 | 
			
		||||
                          Only static linking is allowed.
 | 
			
		||||
 | 
			
		||||
- common/zbuff.h
 | 
			
		||||
- compress/zbuff_compress.c
 | 
			
		||||
- decompress/zbuff_decompress.c
 | 
			
		||||
 | 
			
		||||
#### Dictionary builder
 | 
			
		||||
#### Modular build
 | 
			
		||||
 | 
			
		||||
To create dictionaries from training sets :
 | 
			
		||||
Directory `common/` is required in all circumstances.
 | 
			
		||||
You can select to support compression only, by just adding files from the `compress/` directory,
 | 
			
		||||
In a similar way, you can build a decompressor-only library with the `decompress/` directory.
 | 
			
		||||
 | 
			
		||||
Other optional functionalities provided are :
 | 
			
		||||
 | 
			
		||||
- `dictBuilder/`  : this directory contains source files required to create dictionaries.
 | 
			
		||||
                    The API can be consulted in `dictBuilder/zdict.h`.
 | 
			
		||||
                    It also depends on `common/` and `compress/` .
 | 
			
		||||
 | 
			
		||||
- `legacy/` : this directory contains source code to decompress previous versions of Zstd,
 | 
			
		||||
              starting from `v0.1`. The main API can be consulted in `legacy/zstd_legacy.h`.
 | 
			
		||||
              Note that it's required to compile the library with `ZSTD_LEGACY_SUPPORT = 1` .
 | 
			
		||||
              Advanced API from each version can be found in its relevant header file.
 | 
			
		||||
              For example, advanced API for version `v0.4` is in `zstd_v04.h` .
 | 
			
		||||
              It also depends on `common/` and `decompress/` .
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#### Streaming API
 | 
			
		||||
 | 
			
		||||
Streaming is currently provided by `common/zbuff.h`.
 | 
			
		||||
 | 
			
		||||
- dictBuilder/divsufsort.c
 | 
			
		||||
- dictBuilder/divsufsort.h
 | 
			
		||||
- dictBuilder/zdict.c
 | 
			
		||||
- dictBuilder/zdict.h
 | 
			
		||||
 | 
			
		||||
#### Miscellaneous
 | 
			
		||||
 | 
			
		||||
The other files are not source code. There are :
 | 
			
		||||
 | 
			
		||||
 - LICENSE : contains the BSD license text
 | 
			
		||||
 - Makefile : script to compile or install zstd library (static or dynamic)
 | 
			
		||||
 - libzstd.pc.in : for pkg-config (make install)
 | 
			
		||||
 - Makefile : script to compile or install zstd library (static and dynamic)
 | 
			
		||||
 - libzstd.pc.in : for pkg-config (`make install`)
 | 
			
		||||
 
 | 
			
		||||
@@ -63,7 +63,11 @@ typedef enum {
 | 
			
		||||
  ZSTD_error_maxCode
 | 
			
		||||
} ZSTD_ErrorCode;
 | 
			
		||||
 | 
			
		||||
/* note : compare with size_t function results using ZSTD_getError() */
 | 
			
		||||
/*! ZSTD_getErrorCode() :
 | 
			
		||||
    convert a `size_t` function result into a `ZSTD_ErrorCode` enum type,
 | 
			
		||||
    which can be used to compare directly with enum list published into "error_public.h" */
 | 
			
		||||
ZSTD_ErrorCode ZSTD_getErrorCode(size_t functionResult);
 | 
			
		||||
const char* ZSTD_getErrorString(ZSTD_ErrorCode code);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
 
 | 
			
		||||
@@ -100,7 +100,7 @@ size_t HUF_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize
 | 
			
		||||
/* *** Constants *** */
 | 
			
		||||
#define HUF_TABLELOG_ABSOLUTEMAX  16   /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */
 | 
			
		||||
#define HUF_TABLELOG_MAX  12           /* max configured tableLog (for static allocation); can be modified up to HUF_ABSOLUTEMAX_TABLELOG */
 | 
			
		||||
#define HUF_TABLELOG_DEFAULT  HUF_TABLELOG_MAX   /* tableLog by default, when not specified */
 | 
			
		||||
#define HUF_TABLELOG_DEFAULT  11       /* tableLog by default, when not specified */
 | 
			
		||||
#define HUF_SYMBOLVALUE_MAX 255
 | 
			
		||||
#if (HUF_TABLELOG_MAX > HUF_TABLELOG_ABSOLUTEMAX)
 | 
			
		||||
#  error "HUF_TABLELOG_MAX is too large !"
 | 
			
		||||
 
 | 
			
		||||
@@ -44,16 +44,14 @@ extern "C" {
 | 
			
		||||
******************************************/
 | 
			
		||||
#include <stddef.h>     /* size_t, ptrdiff_t */
 | 
			
		||||
#include <string.h>     /* memcpy */
 | 
			
		||||
#if defined(_MSC_VER)   /* Visual Studio */
 | 
			
		||||
#   include <stdlib.h>  /* _byteswap_ulong */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-****************************************
 | 
			
		||||
*  Compiler specifics
 | 
			
		||||
******************************************/
 | 
			
		||||
#if defined(_MSC_VER)
 | 
			
		||||
#   include <intrin.h>   /* _byteswap_ */
 | 
			
		||||
#if defined(_MSC_VER)   /* Visual Studio */
 | 
			
		||||
#   include <stdlib.h>  /* _byteswap_ulong */
 | 
			
		||||
#   include <intrin.h>  /* _byteswap_* */
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(__GNUC__)
 | 
			
		||||
#  define MEM_STATIC static __attribute__((unused))
 | 
			
		||||
@@ -65,6 +63,10 @@ extern "C" {
 | 
			
		||||
#  define MEM_STATIC static  /* this version may generate warnings for unused static functions; disable the relevant warning */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* code only tested on 32 and 64 bits systems */
 | 
			
		||||
#define MEM_STATIC_ASSERT(c)   { enum { XXH_static_assert = 1/(int)(!!(c)) }; }
 | 
			
		||||
MEM_STATIC void MEM_check(void) { MEM_STATIC_ASSERT((sizeof(size_t)==4) || (sizeof(size_t)==8)); }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-**************************************************************
 | 
			
		||||
*  Basic Types
 | 
			
		||||
 
 | 
			
		||||
@@ -44,10 +44,8 @@ extern "C" {
 | 
			
		||||
/* ***************************************************************
 | 
			
		||||
*  Compiler specifics
 | 
			
		||||
*****************************************************************/
 | 
			
		||||
/*!
 | 
			
		||||
*  ZSTD_DLL_EXPORT :
 | 
			
		||||
*  Enable exporting of functions when building a Windows DLL
 | 
			
		||||
*/
 | 
			
		||||
/* ZSTD_DLL_EXPORT :
 | 
			
		||||
*  Enable exporting of functions when building a Windows DLL */
 | 
			
		||||
#if defined(_WIN32) && defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1)
 | 
			
		||||
#  define ZSTDLIB_API __declspec(dllexport)
 | 
			
		||||
#else
 | 
			
		||||
@@ -103,8 +101,8 @@ ZSTDLIB_API size_t ZBUFF_compressEnd(ZBUFF_CCtx* cctx, void* dst, size_t* dstCap
 | 
			
		||||
*  @return : nb of bytes still present into internal buffer (0 if it's empty)
 | 
			
		||||
*            or an error code, which can be tested using ZBUFF_isError().
 | 
			
		||||
*
 | 
			
		||||
*  Hint : recommended buffer sizes (not compulsory) : ZBUFF_recommendedCInSize / ZBUFF_recommendedCOutSize
 | 
			
		||||
*  input : ZBUFF_recommendedCInSize==128 KB block size is the internal unit, it improves latency to use this value (skipped buffering).
 | 
			
		||||
*  Hint : _recommended buffer_ sizes (not compulsory) : ZBUFF_recommendedCInSize() / ZBUFF_recommendedCOutSize()
 | 
			
		||||
*  input : ZBUFF_recommendedCInSize==128 KB block size is the internal unit, use this value to reduce intermediate stages (better latency)
 | 
			
		||||
*  output : ZBUFF_recommendedCOutSize==ZSTD_compressBound(128 KB) + 3 + 3 : ensures it's always possible to write/flush/end a full block. Skip some buffering.
 | 
			
		||||
*  By using both, it ensures that input will be entirely consumed, and output will always contain the result, reducing intermediate buffering.
 | 
			
		||||
* **************************************************/
 | 
			
		||||
@@ -187,7 +185,7 @@ ZSTDLIB_API ZBUFF_DCtx* ZBUFF_createDCtx_advanced(ZSTD_customMem customMem);
 | 
			
		||||
/*--- Advanced Streaming function ---*/
 | 
			
		||||
ZSTDLIB_API size_t ZBUFF_compressInit_advanced(ZBUFF_CCtx* zbc,
 | 
			
		||||
                                               const void* dict, size_t dictSize,
 | 
			
		||||
                                               ZSTD_parameters params, U64 pledgedSrcSize);
 | 
			
		||||
                                               ZSTD_parameters params, unsigned long long pledgedSrcSize);
 | 
			
		||||
 | 
			
		||||
#endif /* ZBUFF_STATIC_LINKING_ONLY */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,7 @@
 | 
			
		||||
/*-*************************************
 | 
			
		||||
*  Common constants
 | 
			
		||||
***************************************/
 | 
			
		||||
#define ZSTD_OPT_DEBUG 0     // 3 = compression stats;  5 = check encoded sequences;  9 = full logs
 | 
			
		||||
#define ZSTD_OPT_DEBUG 0     /* 3 = compression stats;  5 = check encoded sequences;  9 = full logs */
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#if defined(ZSTD_OPT_DEBUG) && ZSTD_OPT_DEBUG>=9
 | 
			
		||||
    #define ZSTD_LOG_PARSER(...) printf(__VA_ARGS__)
 | 
			
		||||
@@ -233,6 +233,6 @@ int ZSTD_isSkipFrame(ZSTD_DCtx* dctx);
 | 
			
		||||
/* custom memory allocation functions */
 | 
			
		||||
void* ZSTD_defaultAllocFunction(void* opaque, size_t size);
 | 
			
		||||
void ZSTD_defaultFreeFunction(void* opaque, void* address);
 | 
			
		||||
static ZSTD_customMem const defaultCustomMem = { ZSTD_defaultAllocFunction, ZSTD_defaultFreeFunction, NULL };
 | 
			
		||||
static const ZSTD_customMem defaultCustomMem = { ZSTD_defaultAllocFunction, ZSTD_defaultFreeFunction, NULL };
 | 
			
		||||
 | 
			
		||||
#endif   /* ZSTD_CCOMMON_H_MODULE */
 | 
			
		||||
 
 | 
			
		||||
@@ -239,7 +239,7 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits)
 | 
			
		||||
 | 
			
		||||
        /* repay normalized cost */
 | 
			
		||||
        {   U32 const noSymbol = 0xF0F0F0F0;
 | 
			
		||||
            U32 rankLast[HUF_TABLELOG_MAX+1];
 | 
			
		||||
            U32 rankLast[HUF_TABLELOG_MAX+2];
 | 
			
		||||
            int pos;
 | 
			
		||||
 | 
			
		||||
            /* Get pos of last (smallest) symbol per rank */
 | 
			
		||||
@@ -535,6 +535,7 @@ static size_t HUF_compress_internal (
 | 
			
		||||
    {   size_t const hSize = HUF_writeCTable (op, dstSize, CTable, maxSymbolValue, huffLog);
 | 
			
		||||
        if (HUF_isError(hSize)) return hSize;
 | 
			
		||||
        if (hSize + 12 >= srcSize) return 0;   /* not useful to try compression */
 | 
			
		||||
        //static U64 totalHSize = 0; static U32 nbHSize = 0; totalHSize += hSize; nbHSize++; if ((nbHSize & 63) == 1) printf("average : %6.3f \n", (double)totalHSize / nbHSize);
 | 
			
		||||
        op += hSize;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -137,7 +137,7 @@ size_t ZBUFF_freeCCtx(ZBUFF_CCtx* zbc)
 | 
			
		||||
 | 
			
		||||
size_t ZBUFF_compressInit_advanced(ZBUFF_CCtx* zbc,
 | 
			
		||||
                                   const void* dict, size_t dictSize,
 | 
			
		||||
                                   ZSTD_parameters params, U64 pledgedSrcSize)
 | 
			
		||||
                                   ZSTD_parameters params, unsigned long long pledgedSrcSize)
 | 
			
		||||
{
 | 
			
		||||
    /* allocate buffers */
 | 
			
		||||
    {   size_t const neededInBuffSize = (size_t)1 << params.cParams.windowLog;
 | 
			
		||||
@@ -170,9 +170,7 @@ size_t ZBUFF_compressInit_advanced(ZBUFF_CCtx* zbc,
 | 
			
		||||
 | 
			
		||||
size_t ZBUFF_compressInitDictionary(ZBUFF_CCtx* zbc, const void* dict, size_t dictSize, int compressionLevel)
 | 
			
		||||
{
 | 
			
		||||
    ZSTD_parameters params;
 | 
			
		||||
    memset(¶ms, 0, sizeof(params));
 | 
			
		||||
    params.cParams = ZSTD_getCParams(compressionLevel, 0, dictSize);
 | 
			
		||||
    ZSTD_parameters const params = ZSTD_getParams(compressionLevel, 0, dictSize);
 | 
			
		||||
    return ZBUFF_compressInit_advanced(zbc, dict, dictSize, params, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -152,7 +152,7 @@ ZSTD_CCtx* ZSTD_createCCtx(void)
 | 
			
		||||
 | 
			
		||||
ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem)
 | 
			
		||||
{
 | 
			
		||||
    ZSTD_CCtx* ctx;
 | 
			
		||||
    ZSTD_CCtx* cctx;
 | 
			
		||||
 | 
			
		||||
    if (!customMem.customAlloc && !customMem.customFree)
 | 
			
		||||
        customMem = defaultCustomMem;
 | 
			
		||||
@@ -160,11 +160,11 @@ ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem)
 | 
			
		||||
    if (!customMem.customAlloc || !customMem.customFree)
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    ctx = (ZSTD_CCtx*) customMem.customAlloc(customMem.opaque, sizeof(ZSTD_CCtx));
 | 
			
		||||
    if (!ctx) return NULL;
 | 
			
		||||
    memset(ctx, 0, sizeof(ZSTD_CCtx));
 | 
			
		||||
    memcpy(&ctx->customMem, &customMem, sizeof(ZSTD_customMem));
 | 
			
		||||
    return ctx;
 | 
			
		||||
    cctx = (ZSTD_CCtx*) customMem.customAlloc(customMem.opaque, sizeof(ZSTD_CCtx));
 | 
			
		||||
    if (!cctx) return NULL;
 | 
			
		||||
    memset(cctx, 0, sizeof(ZSTD_CCtx));
 | 
			
		||||
    memcpy(&(cctx->customMem), &customMem, sizeof(ZSTD_customMem));
 | 
			
		||||
    return cctx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx)
 | 
			
		||||
@@ -175,6 +175,11 @@ size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx)
 | 
			
		||||
    return 0;   /* reserved as a potential error code in the future */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t ZSTD_sizeofCCtx(const ZSTD_CCtx* cctx)
 | 
			
		||||
{
 | 
			
		||||
    return sizeof(*cctx) + cctx->workSpaceSize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx)   /* hidden interface */
 | 
			
		||||
{
 | 
			
		||||
    return &(ctx->seqStore);
 | 
			
		||||
@@ -221,7 +226,7 @@ size_t ZSTD_checkCParams_advanced(ZSTD_compressionParameters cParams, U64 srcSiz
 | 
			
		||||
    Both `srcSize` and `dictSize` are optional (use 0 if unknown),
 | 
			
		||||
    but if both are 0, no optimization can be done.
 | 
			
		||||
    Note : cPar is considered validated at this stage. Use ZSTD_checkParams() to ensure that. */
 | 
			
		||||
ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, U64 srcSize, size_t dictSize)
 | 
			
		||||
ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize)
 | 
			
		||||
{
 | 
			
		||||
    if (srcSize+dictSize == 0) return cPar;   /* no size information available : no adjustment */
 | 
			
		||||
 | 
			
		||||
@@ -244,23 +249,32 @@ ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, U
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
size_t ZSTD_sizeofCCtx(ZSTD_compressionParameters cParams)   /* hidden interface, for paramagrill */
 | 
			
		||||
size_t ZSTD_estimateCCtxSize(ZSTD_compressionParameters cParams)
 | 
			
		||||
{
 | 
			
		||||
    ZSTD_CCtx* const zc = ZSTD_createCCtx();
 | 
			
		||||
    ZSTD_parameters params;
 | 
			
		||||
    memset(¶ms, 0, sizeof(params));
 | 
			
		||||
    params.cParams = cParams;
 | 
			
		||||
    params.fParams.contentSizeFlag = 1;
 | 
			
		||||
    ZSTD_compressBegin_advanced(zc, NULL, 0, params, 0);
 | 
			
		||||
    { size_t const ccsize = sizeof(*zc) + zc->workSpaceSize;
 | 
			
		||||
      ZSTD_freeCCtx(zc);
 | 
			
		||||
      return ccsize; }
 | 
			
		||||
    const size_t blockSize = MIN(ZSTD_BLOCKSIZE_MAX, (size_t)1 << cParams.windowLog);
 | 
			
		||||
    const U32    divider = (cParams.searchLength==3) ? 3 : 4;
 | 
			
		||||
    const size_t maxNbSeq = blockSize / divider;
 | 
			
		||||
    const size_t tokenSpace = blockSize + 11*maxNbSeq;
 | 
			
		||||
 | 
			
		||||
    const size_t chainSize = (cParams.strategy == ZSTD_fast) ? 0 : (1 << cParams.chainLog);
 | 
			
		||||
    const size_t hSize = ((size_t)1) << cParams.hashLog;
 | 
			
		||||
    const U32 hashLog3 = (cParams.searchLength>3) ? 0 : MIN(ZSTD_HASHLOG3_MAX, cParams.windowLog);
 | 
			
		||||
    const size_t h3Size = ((size_t)1) << hashLog3;
 | 
			
		||||
    const size_t tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
 | 
			
		||||
 | 
			
		||||
    size_t const optSpace = ((MaxML+1) + (MaxLL+1) + (MaxOff+1) + (1<<Litbits))*sizeof(U32)
 | 
			
		||||
                          + (ZSTD_OPT_NUM+1)*(sizeof(ZSTD_match_t) + sizeof(ZSTD_optimal_t));
 | 
			
		||||
    size_t const neededSpace = tableSpace + (256*sizeof(U32)) /* huffTable */ + tokenSpace
 | 
			
		||||
                             + ((cParams.strategy == ZSTD_btopt) ? optSpace : 0);
 | 
			
		||||
 | 
			
		||||
    return sizeof(ZSTD_CCtx) + neededSpace;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_resetCCtx_advanced() :
 | 
			
		||||
    note : 'params' is expected to be validated */
 | 
			
		||||
static size_t ZSTD_resetCCtx_advanced (ZSTD_CCtx* zc,
 | 
			
		||||
                                       ZSTD_parameters params, U64 frameContentSize, U32 reset)
 | 
			
		||||
                                       ZSTD_parameters params, U64 frameContentSize,
 | 
			
		||||
                                       U32 reset)
 | 
			
		||||
{   /* note : params considered validated here */
 | 
			
		||||
    const size_t blockSize = MIN(ZSTD_BLOCKSIZE_MAX, (size_t)1 << params.cParams.windowLog);
 | 
			
		||||
    const U32    divider = (params.cParams.searchLength==3) ? 3 : 4;
 | 
			
		||||
@@ -268,9 +282,7 @@ static size_t ZSTD_resetCCtx_advanced (ZSTD_CCtx* zc,
 | 
			
		||||
    const size_t tokenSpace = blockSize + 11*maxNbSeq;
 | 
			
		||||
    const size_t chainSize = (params.cParams.strategy == ZSTD_fast) ? 0 : (1 << params.cParams.chainLog);
 | 
			
		||||
    const size_t hSize = ((size_t)1) << params.cParams.hashLog;
 | 
			
		||||
    const U32 hashLog3 = (params.cParams.searchLength>3) ? 0 :
 | 
			
		||||
                        ( (!frameContentSize || frameContentSize >= 8192) ? ZSTD_HASHLOG3_MAX :
 | 
			
		||||
                          ((frameContentSize >= 2048) ? ZSTD_HASHLOG3_MIN + 1 : ZSTD_HASHLOG3_MIN) );
 | 
			
		||||
    const U32 hashLog3 = (params.cParams.searchLength>3) ? 0 : MIN(ZSTD_HASHLOG3_MAX, params.cParams.windowLog);
 | 
			
		||||
    const size_t h3Size = ((size_t)1) << hashLog3;
 | 
			
		||||
    const size_t tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
 | 
			
		||||
 | 
			
		||||
@@ -427,21 +439,8 @@ static void ZSTD_reduceIndex (ZSTD_CCtx* zc, const U32 reducerValue)
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Frame descriptor
 | 
			
		||||
/* Frame header :
 | 
			
		||||
 | 
			
		||||
    // old
 | 
			
		||||
   1 byte - Alloc :
 | 
			
		||||
   bit 0-3 : windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN   (see zstd_internal.h)
 | 
			
		||||
   bit 4   : reserved for windowLog (must be zero)
 | 
			
		||||
   bit 5   : reserved (must be zero)
 | 
			
		||||
   bit 6-7 : Frame content size : unknown, 1 byte, 2 bytes, 8 bytes
 | 
			
		||||
 | 
			
		||||
   1 byte - checker :
 | 
			
		||||
   bit 0-1 : dictID (0, 1, 2 or 4 bytes)
 | 
			
		||||
   bit 2-7 : reserved (must be zero)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // new
 | 
			
		||||
   1 byte - FrameHeaderDescription :
 | 
			
		||||
   bit 0-1 : dictID (0, 1, 2 or 4 bytes)
 | 
			
		||||
   bit 2-4 : reserved (must be zero)
 | 
			
		||||
@@ -453,24 +452,24 @@ static void ZSTD_reduceIndex (ZSTD_CCtx* zc, const U32 reducerValue)
 | 
			
		||||
   bit 0-2 : octal Fractional (1/8th)
 | 
			
		||||
   bit 3-7 : Power of 2, with 0 = 1 KB (up to 2 TB)
 | 
			
		||||
 | 
			
		||||
   Optional : content size (0, 1, 2, 4 or 8 bytes)
 | 
			
		||||
   0 : unknown
 | 
			
		||||
   1 : 0-255 bytes
 | 
			
		||||
   2 : 256 - 65535+256
 | 
			
		||||
   8 : up to 16 exa
 | 
			
		||||
 | 
			
		||||
   Optional : dictID (0, 1, 2 or 4 bytes)
 | 
			
		||||
   Automatic adaptation
 | 
			
		||||
   0 : no dictID
 | 
			
		||||
   1 : 1 - 255
 | 
			
		||||
   2 : 256 - 65535
 | 
			
		||||
   4 : all other values
 | 
			
		||||
 | 
			
		||||
   Optional : content size (0, 1, 2, 4 or 8 bytes)
 | 
			
		||||
   0 : unknown
 | 
			
		||||
   1 : 0-255 bytes
 | 
			
		||||
   2 : 256 - 65535+256
 | 
			
		||||
   8 : up to 16 exa
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Block format description
 | 
			
		||||
 | 
			
		||||
   Block = Literal Section - Sequences Section
 | 
			
		||||
   Block = Literals Section - Sequences Section
 | 
			
		||||
   Prerequisite : size of (compressed) block, maximum size of regenerated data
 | 
			
		||||
 | 
			
		||||
   1) Literal Section
 | 
			
		||||
@@ -478,7 +477,7 @@ static void ZSTD_reduceIndex (ZSTD_CCtx* zc, const U32 reducerValue)
 | 
			
		||||
   1.1) Header : 1-5 bytes
 | 
			
		||||
        flags: 2 bits
 | 
			
		||||
            00 compressed by Huff0
 | 
			
		||||
            01 unused
 | 
			
		||||
            01 repeat
 | 
			
		||||
            10 is Raw (uncompressed)
 | 
			
		||||
            11 is Rle
 | 
			
		||||
            Note : using 01 => Huff0 with precomputed table ?
 | 
			
		||||
@@ -514,7 +513,7 @@ static void ZSTD_reduceIndex (ZSTD_CCtx* zc, const U32 reducerValue)
 | 
			
		||||
            else           => 5 bytes (2-2-18-18)
 | 
			
		||||
            big endian convention
 | 
			
		||||
 | 
			
		||||
        1- CTable available (stored into workspace ?)
 | 
			
		||||
        1- CTable available (stored into workspace)
 | 
			
		||||
        2- Small input (fast heuristic ? Full comparison ? depend on clevel ?)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -654,11 +653,11 @@ static size_t ZSTD_compressLiterals (ZSTD_CCtx* zc,
 | 
			
		||||
        singleStream = 1;
 | 
			
		||||
        cLitSize = HUF_compress1X_usingCTable(ostart+lhSize, dstCapacity-lhSize, src, srcSize, zc->hufTable);
 | 
			
		||||
    } else {
 | 
			
		||||
        cLitSize = singleStream ? HUF_compress1X(ostart+lhSize, dstCapacity-lhSize, src, srcSize, 255, 12)
 | 
			
		||||
                                : HUF_compress2 (ostart+lhSize, dstCapacity-lhSize, src, srcSize, 255, 12);
 | 
			
		||||
        cLitSize = singleStream ? HUF_compress1X(ostart+lhSize, dstCapacity-lhSize, src, srcSize, 255, 11)
 | 
			
		||||
                                : HUF_compress2 (ostart+lhSize, dstCapacity-lhSize, src, srcSize, 255, 11);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((cLitSize==0) || (cLitSize >= srcSize - minGain))
 | 
			
		||||
    if ((cLitSize==0) | (cLitSize >= srcSize - minGain))
 | 
			
		||||
        return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
 | 
			
		||||
    if (cLitSize==1)
 | 
			
		||||
        return ZSTD_compressRleLiteralsBlock(dst, dstCapacity, src, srcSize);
 | 
			
		||||
@@ -936,7 +935,7 @@ _check_compressibility:
 | 
			
		||||
    `offsetCode` : distance to match, or 0 == repCode.
 | 
			
		||||
    `matchCode` : matchLength - MINMATCH
 | 
			
		||||
*/
 | 
			
		||||
MEM_STATIC void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const void* literals, size_t offsetCode, size_t matchCode)
 | 
			
		||||
MEM_STATIC void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const void* literals, U32 offsetCode, size_t matchCode)
 | 
			
		||||
{
 | 
			
		||||
#if 0  /* for debug */
 | 
			
		||||
    static const BYTE* g_start = NULL;
 | 
			
		||||
@@ -957,7 +956,7 @@ MEM_STATIC void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const v
 | 
			
		||||
    *seqStorePtr->litLength++ = (U16)litLength;
 | 
			
		||||
 | 
			
		||||
    /* match offset */
 | 
			
		||||
    *(seqStorePtr->offset++) = (U32)offsetCode + 1;
 | 
			
		||||
    *(seqStorePtr->offset++) = offsetCode + 1;
 | 
			
		||||
 | 
			
		||||
    /* match Length */
 | 
			
		||||
    if (matchCode>0xFFFF) { seqStorePtr->longLengthID = 2; seqStorePtr->longLengthPos = (U32)(seqStorePtr->matchLength - seqStorePtr->matchLengthStart); }
 | 
			
		||||
@@ -1063,7 +1062,7 @@ static size_t ZSTD_count_2segments(const BYTE* ip, const BYTE* match, const BYTE
 | 
			
		||||
***************************************/
 | 
			
		||||
static const U32 prime3bytes = 506832829U;
 | 
			
		||||
static U32    ZSTD_hash3(U32 u, U32 h) { return ((u << (32-24)) * prime3bytes)  >> (32-h) ; }
 | 
			
		||||
static size_t ZSTD_hash3Ptr(const void* ptr, U32 h) { return ZSTD_hash3(MEM_readLE32(ptr), h); }
 | 
			
		||||
MEM_STATIC size_t ZSTD_hash3Ptr(const void* ptr, U32 h) { return ZSTD_hash3(MEM_readLE32(ptr), h); }   /* only in zstd_opt.h */
 | 
			
		||||
 | 
			
		||||
static const U32 prime4bytes = 2654435761U;
 | 
			
		||||
static U32    ZSTD_hash4(U32 u, U32 h) { return (u * prime4bytes) >> (32-h) ; }
 | 
			
		||||
@@ -1081,6 +1080,11 @@ static const U64 prime7bytes = 58295818150454627ULL;
 | 
			
		||||
static size_t ZSTD_hash7(U64 u, U32 h) { return (size_t)(((u  << (64-56)) * prime7bytes) >> (64-h)) ; }
 | 
			
		||||
static size_t ZSTD_hash7Ptr(const void* p, U32 h) { return ZSTD_hash7(MEM_readLE64(p), h); }
 | 
			
		||||
 | 
			
		||||
//static const U64 prime8bytes = 58295818150454627ULL;
 | 
			
		||||
static const U64 prime8bytes = 0xCF1BBCDCB7A56463ULL;
 | 
			
		||||
static size_t ZSTD_hash8(U64 u, U32 h) { return (size_t)(((u) * prime8bytes) >> (64-h)) ; }
 | 
			
		||||
static size_t ZSTD_hash8Ptr(const void* p, U32 h) { return ZSTD_hash8(MEM_readLE64(p), h); }
 | 
			
		||||
 | 
			
		||||
static size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls)
 | 
			
		||||
{
 | 
			
		||||
    switch(mls)
 | 
			
		||||
@@ -1090,6 +1094,7 @@ static size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls)
 | 
			
		||||
    case 5: return ZSTD_hash5Ptr(p, hBits);
 | 
			
		||||
    case 6: return ZSTD_hash6Ptr(p, hBits);
 | 
			
		||||
    case 7: return ZSTD_hash7Ptr(p, hBits);
 | 
			
		||||
    case 8: return ZSTD_hash8Ptr(p, hBits);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1129,13 +1134,14 @@ void ZSTD_compressBlock_fast_generic(ZSTD_CCtx* cctx,
 | 
			
		||||
    const BYTE* const lowest = base + lowestIndex;
 | 
			
		||||
    const BYTE* const iend = istart + srcSize;
 | 
			
		||||
    const BYTE* const ilimit = iend - 8;
 | 
			
		||||
    size_t offset_1=cctx->rep[0], offset_2=cctx->rep[1];
 | 
			
		||||
    U32 offset_1=cctx->rep[0], offset_2=cctx->rep[1];
 | 
			
		||||
    U32 offsetSaved = 0;
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    ip += (ip==lowest);
 | 
			
		||||
    {   U32 const maxRep = (U32)(ip-lowest);
 | 
			
		||||
        if (offset_1 > maxRep) offset_1 = 0;
 | 
			
		||||
        if (offset_2 > maxRep) offset_2 = 0;
 | 
			
		||||
        if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0;
 | 
			
		||||
        if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Main Search Loop */
 | 
			
		||||
@@ -1148,17 +1154,17 @@ void ZSTD_compressBlock_fast_generic(ZSTD_CCtx* cctx,
 | 
			
		||||
        hashTable[h] = current;   /* update hash table */
 | 
			
		||||
 | 
			
		||||
        if ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1))) { /* note : by construction, offset_1 <= current */
 | 
			
		||||
            mLength = ZSTD_count(ip+1+EQUAL_READ32, ip+1+EQUAL_READ32-offset_1, iend) + EQUAL_READ32;
 | 
			
		||||
            mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4;
 | 
			
		||||
            ip++;
 | 
			
		||||
            ZSTD_storeSeq(seqStorePtr, ip-anchor, anchor, 0, mLength-MINMATCH);
 | 
			
		||||
        } else {
 | 
			
		||||
            size_t offset;
 | 
			
		||||
            U32 offset;
 | 
			
		||||
            if ( (matchIndex <= lowestIndex) || (MEM_read32(match) != MEM_read32(ip)) ) {
 | 
			
		||||
                ip += ((ip-anchor) >> g_searchStrength) + 1;
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            mLength = ZSTD_count(ip+EQUAL_READ32, match+EQUAL_READ32, iend) + EQUAL_READ32;
 | 
			
		||||
            offset = ip-match;
 | 
			
		||||
            mLength = ZSTD_count(ip+4, match+4, iend) + 4;
 | 
			
		||||
            offset = (U32)(ip-match);
 | 
			
		||||
            while (((ip>anchor) & (match>lowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
 | 
			
		||||
            offset_2 = offset_1;
 | 
			
		||||
            offset_1 = offset;
 | 
			
		||||
@@ -1179,8 +1185,8 @@ void ZSTD_compressBlock_fast_generic(ZSTD_CCtx* cctx,
 | 
			
		||||
                 && ( (offset_2>0)
 | 
			
		||||
                 & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) {
 | 
			
		||||
                /* store sequence */
 | 
			
		||||
                size_t const rLength = ZSTD_count(ip+EQUAL_READ32, ip+EQUAL_READ32-offset_2, iend) + EQUAL_READ32;
 | 
			
		||||
                { size_t const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; } /* swap offset_2 <=> offset_1 */
 | 
			
		||||
                size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4;
 | 
			
		||||
                { U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; }  /* swap offset_2 <=> offset_1 */
 | 
			
		||||
                hashTable[ZSTD_hashPtr(ip, hBits, mls)] = (U32)(ip-base);
 | 
			
		||||
                ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, rLength-MINMATCH);
 | 
			
		||||
                ip += rLength;
 | 
			
		||||
@@ -1189,8 +1195,8 @@ void ZSTD_compressBlock_fast_generic(ZSTD_CCtx* cctx,
 | 
			
		||||
    }   }   }
 | 
			
		||||
 | 
			
		||||
    /* save reps for next block */
 | 
			
		||||
    cctx->savedRep[0] = offset_1 ? (U32)offset_1 : (U32)(iend - base) + 1;
 | 
			
		||||
    cctx->savedRep[1] = offset_2 ? (U32)offset_2 : (U32)(iend - base) + 1;
 | 
			
		||||
    cctx->savedRep[0] = offset_1 ? offset_1 : offsetSaved;
 | 
			
		||||
    cctx->savedRep[1] = offset_2 ? offset_2 : offsetSaved;
 | 
			
		||||
 | 
			
		||||
    /* Last Literals */
 | 
			
		||||
    {   size_t const lastLLSize = iend - anchor;
 | 
			
		||||
@@ -1333,6 +1339,283 @@ static void ZSTD_compressBlock_fast_extDict(ZSTD_CCtx* ctx,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-*************************************
 | 
			
		||||
*  Double Fast
 | 
			
		||||
***************************************/
 | 
			
		||||
static void ZSTD_fillDoubleHashTable (ZSTD_CCtx* cctx, const void* end, const U32 mls)
 | 
			
		||||
{
 | 
			
		||||
    U32* const hashLarge = cctx->hashTable;
 | 
			
		||||
    const U32 hBitsL = cctx->params.cParams.hashLog;
 | 
			
		||||
    U32* const hashSmall = cctx->chainTable;
 | 
			
		||||
    const U32 hBitsS = cctx->params.cParams.chainLog;
 | 
			
		||||
    const BYTE* const base = cctx->base;
 | 
			
		||||
    const BYTE* ip = base + cctx->nextToUpdate;
 | 
			
		||||
    const BYTE* const iend = ((const BYTE*)end) - 8;
 | 
			
		||||
    const size_t fastHashFillStep = 3;
 | 
			
		||||
 | 
			
		||||
    while(ip <= iend) {
 | 
			
		||||
        hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip - base);
 | 
			
		||||
        hashLarge[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip - base);
 | 
			
		||||
        ip += fastHashFillStep;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
FORCE_INLINE
 | 
			
		||||
void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx* cctx,
 | 
			
		||||
                                 const void* src, size_t srcSize,
 | 
			
		||||
                                 const U32 mls)
 | 
			
		||||
{
 | 
			
		||||
    U32* const hashLong = cctx->hashTable;
 | 
			
		||||
    const U32 hBitsL = cctx->params.cParams.hashLog;
 | 
			
		||||
    U32* const hashSmall = cctx->chainTable;
 | 
			
		||||
    const U32 hBitsS = cctx->params.cParams.chainLog;
 | 
			
		||||
    seqStore_t* seqStorePtr = &(cctx->seqStore);
 | 
			
		||||
    const BYTE* const base = cctx->base;
 | 
			
		||||
    const BYTE* const istart = (const BYTE*)src;
 | 
			
		||||
    const BYTE* ip = istart;
 | 
			
		||||
    const BYTE* anchor = istart;
 | 
			
		||||
    const U32 lowestIndex = cctx->dictLimit;
 | 
			
		||||
    const BYTE* const lowest = base + lowestIndex;
 | 
			
		||||
    const BYTE* const iend = istart + srcSize;
 | 
			
		||||
    const BYTE* const ilimit = iend - 8;
 | 
			
		||||
    U32 offset_1=cctx->rep[0], offset_2=cctx->rep[1];
 | 
			
		||||
    U32 offsetSaved = 0;
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    ip += (ip==lowest);
 | 
			
		||||
    {   U32 const maxRep = (U32)(ip-lowest);
 | 
			
		||||
        if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0;
 | 
			
		||||
        if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Main Search Loop */
 | 
			
		||||
    while (ip < ilimit) {   /* < instead of <=, because repcode check at (ip+1) */
 | 
			
		||||
        size_t mLength;
 | 
			
		||||
        size_t const h2 = ZSTD_hashPtr(ip, hBitsL, 8);
 | 
			
		||||
        size_t const h = ZSTD_hashPtr(ip, hBitsS, mls);
 | 
			
		||||
        U32 const current = (U32)(ip-base);
 | 
			
		||||
        U32 const matchIndexL = hashLong[h2];
 | 
			
		||||
        U32 const matchIndexS = hashSmall[h];
 | 
			
		||||
        const BYTE* matchLong = base + matchIndexL;
 | 
			
		||||
        const BYTE* match = base + matchIndexS;
 | 
			
		||||
        hashLong[h2] = hashSmall[h] = current;   /* update hash tables */
 | 
			
		||||
 | 
			
		||||
        if ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1))) { /* note : by construction, offset_1 <= current */
 | 
			
		||||
            mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4;
 | 
			
		||||
            ip++;
 | 
			
		||||
            ZSTD_storeSeq(seqStorePtr, ip-anchor, anchor, 0, mLength-MINMATCH);
 | 
			
		||||
        } else {
 | 
			
		||||
            U32 offset;
 | 
			
		||||
            if ( (matchIndexL > lowestIndex) && (MEM_read64(matchLong) == MEM_read64(ip)) ) {
 | 
			
		||||
                mLength = ZSTD_count(ip+8, matchLong+8, iend) + 8;
 | 
			
		||||
                offset = (U32)(ip-matchLong);
 | 
			
		||||
                while (((ip>anchor) & (matchLong>lowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */
 | 
			
		||||
            } else if ( (matchIndexS > lowestIndex) && (MEM_read32(match) == MEM_read32(ip)) ) {
 | 
			
		||||
                mLength = ZSTD_count(ip+4, match+4, iend) + 4;
 | 
			
		||||
                offset = (U32)(ip-match);
 | 
			
		||||
                while (((ip>anchor) & (match>lowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
 | 
			
		||||
            } else {
 | 
			
		||||
                ip += ((ip-anchor) >> g_searchStrength) + 1;
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            offset_2 = offset_1;
 | 
			
		||||
            offset_1 = offset;
 | 
			
		||||
 | 
			
		||||
            ZSTD_storeSeq(seqStorePtr, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* match found */
 | 
			
		||||
        ip += mLength;
 | 
			
		||||
        anchor = ip;
 | 
			
		||||
 | 
			
		||||
        if (ip <= ilimit) {
 | 
			
		||||
            /* Fill Table */
 | 
			
		||||
            hashLong[ZSTD_hashPtr(base+current+2, hBitsL, 8)] =
 | 
			
		||||
                hashSmall[ZSTD_hashPtr(base+current+2, hBitsS, mls)] = current+2;  /* here because current+2 could be > iend-8 */
 | 
			
		||||
            hashLong[ZSTD_hashPtr(ip-2, hBitsL, 8)] =
 | 
			
		||||
                hashSmall[ZSTD_hashPtr(ip-2, hBitsS, mls)] = (U32)(ip-2-base);
 | 
			
		||||
 | 
			
		||||
            /* check immediate repcode */
 | 
			
		||||
            while ( (ip <= ilimit)
 | 
			
		||||
                 && ( (offset_2>0)
 | 
			
		||||
                 & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) {
 | 
			
		||||
                /* store sequence */
 | 
			
		||||
                size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4;
 | 
			
		||||
                { U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; } /* swap offset_2 <=> offset_1 */
 | 
			
		||||
                hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip-base);
 | 
			
		||||
                hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip-base);
 | 
			
		||||
                ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, rLength-MINMATCH);
 | 
			
		||||
                ip += rLength;
 | 
			
		||||
                anchor = ip;
 | 
			
		||||
                continue;   /* faster when present ... (?) */
 | 
			
		||||
    }   }   }
 | 
			
		||||
 | 
			
		||||
    /* save reps for next block */
 | 
			
		||||
    cctx->savedRep[0] = offset_1 ? offset_1 : offsetSaved;
 | 
			
		||||
    cctx->savedRep[1] = offset_2 ? offset_2 : offsetSaved;
 | 
			
		||||
 | 
			
		||||
    /* Last Literals */
 | 
			
		||||
    {   size_t const lastLLSize = iend - anchor;
 | 
			
		||||
        memcpy(seqStorePtr->lit, anchor, lastLLSize);
 | 
			
		||||
        seqStorePtr->lit += lastLLSize;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void ZSTD_compressBlock_doubleFast(ZSTD_CCtx* ctx, const void* src, size_t srcSize)
 | 
			
		||||
{
 | 
			
		||||
    const U32 mls = ctx->params.cParams.searchLength;
 | 
			
		||||
    switch(mls)
 | 
			
		||||
    {
 | 
			
		||||
    default:
 | 
			
		||||
    case 4 :
 | 
			
		||||
        ZSTD_compressBlock_doubleFast_generic(ctx, src, srcSize, 4); return;
 | 
			
		||||
    case 5 :
 | 
			
		||||
        ZSTD_compressBlock_doubleFast_generic(ctx, src, srcSize, 5); return;
 | 
			
		||||
    case 6 :
 | 
			
		||||
        ZSTD_compressBlock_doubleFast_generic(ctx, src, srcSize, 6); return;
 | 
			
		||||
    case 7 :
 | 
			
		||||
        ZSTD_compressBlock_doubleFast_generic(ctx, src, srcSize, 7); return;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx* ctx,
 | 
			
		||||
                                 const void* src, size_t srcSize,
 | 
			
		||||
                                 const U32 mls)
 | 
			
		||||
{
 | 
			
		||||
    U32* const hashLong = ctx->hashTable;
 | 
			
		||||
    const U32 hBitsL = ctx->params.cParams.hashLog;
 | 
			
		||||
    U32* const hashSmall = ctx->chainTable;
 | 
			
		||||
    const U32 hBitsS = ctx->params.cParams.chainLog;
 | 
			
		||||
    seqStore_t* seqStorePtr = &(ctx->seqStore);
 | 
			
		||||
    const BYTE* const base = ctx->base;
 | 
			
		||||
    const BYTE* const dictBase = ctx->dictBase;
 | 
			
		||||
    const BYTE* const istart = (const BYTE*)src;
 | 
			
		||||
    const BYTE* ip = istart;
 | 
			
		||||
    const BYTE* anchor = istart;
 | 
			
		||||
    const U32   lowestIndex = ctx->lowLimit;
 | 
			
		||||
    const BYTE* const dictStart = dictBase + lowestIndex;
 | 
			
		||||
    const U32   dictLimit = ctx->dictLimit;
 | 
			
		||||
    const BYTE* const lowPrefixPtr = base + dictLimit;
 | 
			
		||||
    const BYTE* const dictEnd = dictBase + dictLimit;
 | 
			
		||||
    const BYTE* const iend = istart + srcSize;
 | 
			
		||||
    const BYTE* const ilimit = iend - 8;
 | 
			
		||||
    U32 offset_1=ctx->rep[0], offset_2=ctx->rep[1];
 | 
			
		||||
 | 
			
		||||
    /* Search Loop */
 | 
			
		||||
    while (ip < ilimit) {  /* < instead of <=, because (ip+1) */
 | 
			
		||||
        const size_t hSmall = ZSTD_hashPtr(ip, hBitsS, mls);
 | 
			
		||||
        const U32 matchIndex = hashSmall[hSmall];
 | 
			
		||||
        const BYTE* matchBase = matchIndex < dictLimit ? dictBase : base;
 | 
			
		||||
        const BYTE* match = matchBase + matchIndex;
 | 
			
		||||
 | 
			
		||||
        const size_t hLong = ZSTD_hashPtr(ip, hBitsL, 8);
 | 
			
		||||
        const U32 matchLongIndex = hashLong[hLong];
 | 
			
		||||
        const BYTE* matchLongBase = matchLongIndex < dictLimit ? dictBase : base;
 | 
			
		||||
        const BYTE* matchLong = matchLongBase + matchLongIndex;
 | 
			
		||||
 | 
			
		||||
        const U32 current = (U32)(ip-base);
 | 
			
		||||
        const U32 repIndex = current + 1 - offset_1;   /* offset_1 expected <= current +1 */
 | 
			
		||||
        const BYTE* repBase = repIndex < dictLimit ? dictBase : base;
 | 
			
		||||
        const BYTE* repMatch = repBase + repIndex;
 | 
			
		||||
        size_t mLength;
 | 
			
		||||
        hashSmall[hSmall] = hashLong[hLong] = current;   /* update hash table */
 | 
			
		||||
 | 
			
		||||
        if ( (((U32)((dictLimit-1) - repIndex) >= 3) /* intentional underflow */ & (repIndex > lowestIndex))
 | 
			
		||||
           && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) {
 | 
			
		||||
            const BYTE* repMatchEnd = repIndex < dictLimit ? dictEnd : iend;
 | 
			
		||||
            mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, lowPrefixPtr) + 4;
 | 
			
		||||
            ip++;
 | 
			
		||||
            ZSTD_storeSeq(seqStorePtr, ip-anchor, anchor, 0, mLength-MINMATCH);
 | 
			
		||||
        } else {
 | 
			
		||||
            if ((matchLongIndex > lowestIndex) && (MEM_read64(matchLong) == MEM_read64(ip))) {
 | 
			
		||||
                const BYTE* matchEnd = matchLongIndex < dictLimit ? dictEnd : iend;
 | 
			
		||||
                const BYTE* lowMatchPtr = matchLongIndex < dictLimit ? dictStart : lowPrefixPtr;
 | 
			
		||||
                U32 offset;
 | 
			
		||||
                mLength = ZSTD_count_2segments(ip+8, matchLong+8, iend, matchEnd, lowPrefixPtr) + 8;
 | 
			
		||||
                offset = current - matchLongIndex;
 | 
			
		||||
                while (((ip>anchor) & (matchLong>lowMatchPtr)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; }   /* catch up */
 | 
			
		||||
                offset_2 = offset_1;
 | 
			
		||||
                offset_1 = offset;
 | 
			
		||||
                ZSTD_storeSeq(seqStorePtr, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
 | 
			
		||||
            } else if ((matchIndex > lowestIndex) && (MEM_read32(match) == MEM_read32(ip))) {
 | 
			
		||||
                const BYTE* matchEnd = matchIndex < dictLimit ? dictEnd : iend;
 | 
			
		||||
                const BYTE* lowMatchPtr = matchIndex < dictLimit ? dictStart : lowPrefixPtr;
 | 
			
		||||
                U32 offset;
 | 
			
		||||
                mLength = ZSTD_count_2segments(ip+4, match+4, iend, matchEnd, lowPrefixPtr) + 4;
 | 
			
		||||
                while (((ip>anchor) & (match>lowMatchPtr)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; }   /* catch up */
 | 
			
		||||
                offset = current - matchIndex;
 | 
			
		||||
                offset_2 = offset_1;
 | 
			
		||||
                offset_1 = offset;
 | 
			
		||||
                ZSTD_storeSeq(seqStorePtr, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
 | 
			
		||||
            } else {
 | 
			
		||||
                ip += ((ip-anchor) >> g_searchStrength) + 1;
 | 
			
		||||
                continue;
 | 
			
		||||
        }   }
 | 
			
		||||
 | 
			
		||||
        /* found a match : store it */
 | 
			
		||||
        ip += mLength;
 | 
			
		||||
        anchor = ip;
 | 
			
		||||
 | 
			
		||||
        if (ip <= ilimit) {
 | 
			
		||||
            /* Fill Table */
 | 
			
		||||
			hashSmall[ZSTD_hashPtr(base+current+2, hBitsS, mls)] = current+2;
 | 
			
		||||
			hashLong[ZSTD_hashPtr(base+current+2, hBitsL, 8)] = current+2;
 | 
			
		||||
            hashSmall[ZSTD_hashPtr(ip-2, hBitsS, mls)] = (U32)(ip-2-base);
 | 
			
		||||
            hashLong[ZSTD_hashPtr(ip-2, hBitsL, 8)] = (U32)(ip-2-base);
 | 
			
		||||
            /* check immediate repcode */
 | 
			
		||||
            while (ip <= ilimit) {
 | 
			
		||||
                U32 const current2 = (U32)(ip-base);
 | 
			
		||||
                U32 const repIndex2 = current2 - offset_2;
 | 
			
		||||
                const BYTE* repMatch2 = repIndex2 < dictLimit ? dictBase + repIndex2 : base + repIndex2;
 | 
			
		||||
                if ( (((U32)((dictLimit-1) - repIndex2) >= 3) & (repIndex2 > lowestIndex))  /* intentional overflow */
 | 
			
		||||
                   && (MEM_read32(repMatch2) == MEM_read32(ip)) ) {
 | 
			
		||||
                    const BYTE* const repEnd2 = repIndex2 < dictLimit ? dictEnd : iend;
 | 
			
		||||
                    size_t const repLength2 = ZSTD_count_2segments(ip+EQUAL_READ32, repMatch2+EQUAL_READ32, iend, repEnd2, lowPrefixPtr) + EQUAL_READ32;
 | 
			
		||||
                    U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset;   /* swap offset_2 <=> offset_1 */
 | 
			
		||||
                    ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, repLength2-MINMATCH);
 | 
			
		||||
                    hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2;
 | 
			
		||||
                    hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2;
 | 
			
		||||
                    ip += repLength2;
 | 
			
		||||
                    anchor = ip;
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
    }   }   }
 | 
			
		||||
 | 
			
		||||
    /* save reps for next block */
 | 
			
		||||
    ctx->savedRep[0] = offset_1; ctx->savedRep[1] = offset_2;
 | 
			
		||||
 | 
			
		||||
    /* Last Literals */
 | 
			
		||||
    {   size_t const lastLLSize = iend - anchor;
 | 
			
		||||
        memcpy(seqStorePtr->lit, anchor, lastLLSize);
 | 
			
		||||
        seqStorePtr->lit += lastLLSize;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void ZSTD_compressBlock_doubleFast_extDict(ZSTD_CCtx* ctx,
 | 
			
		||||
                         const void* src, size_t srcSize)
 | 
			
		||||
{
 | 
			
		||||
    const U32 mls = ctx->params.cParams.searchLength;
 | 
			
		||||
    switch(mls)
 | 
			
		||||
    {
 | 
			
		||||
    default:
 | 
			
		||||
    case 4 :
 | 
			
		||||
        ZSTD_compressBlock_doubleFast_extDict_generic(ctx, src, srcSize, 4); return;
 | 
			
		||||
    case 5 :
 | 
			
		||||
        ZSTD_compressBlock_doubleFast_extDict_generic(ctx, src, srcSize, 5); return;
 | 
			
		||||
    case 6 :
 | 
			
		||||
        ZSTD_compressBlock_doubleFast_extDict_generic(ctx, src, srcSize, 6); return;
 | 
			
		||||
    case 7 :
 | 
			
		||||
        ZSTD_compressBlock_doubleFast_extDict_generic(ctx, src, srcSize, 7); return;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-*************************************
 | 
			
		||||
*  Binary Tree search
 | 
			
		||||
***************************************/
 | 
			
		||||
@@ -1364,17 +1647,19 @@ static U32 ZSTD_insertBt1(ZSTD_CCtx* zc, const BYTE* const ip, const U32 mls, co
 | 
			
		||||
    const U32 windowLow = zc->lowLimit;
 | 
			
		||||
    U32 matchEndIdx = current+8;
 | 
			
		||||
    size_t bestLength = 8;
 | 
			
		||||
#ifdef ZSTD_C_PREDICT
 | 
			
		||||
    U32 predictedSmall = *(bt + 2*((current-1)&btMask) + 0);
 | 
			
		||||
    U32 predictedLarge = *(bt + 2*((current-1)&btMask) + 1);
 | 
			
		||||
    predictedSmall += (predictedSmall>0);
 | 
			
		||||
    predictedLarge += (predictedLarge>0);
 | 
			
		||||
#endif /* ZSTD_C_PREDICT */
 | 
			
		||||
 | 
			
		||||
    hashTable[h] = current;   /* Update Hash Table */
 | 
			
		||||
 | 
			
		||||
    while (nbCompares-- && (matchIndex > windowLow)) {
 | 
			
		||||
        U32* nextPtr = bt + 2*(matchIndex & btMask);
 | 
			
		||||
        size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger);   /* guaranteed minimum nb of common bytes */
 | 
			
		||||
#if 0   /* note : can create issues when hlog small <= 11 */
 | 
			
		||||
#ifdef ZSTD_C_PREDICT   /* note : can create issues when hlog small <= 11 */
 | 
			
		||||
        const U32* predictPtr = bt + 2*((matchIndex-1) & btMask);   /* written this way, as bt is a roll buffer */
 | 
			
		||||
        if (matchIndex == predictedSmall) {
 | 
			
		||||
            /* no need to check length, result known */
 | 
			
		||||
@@ -1731,17 +2016,15 @@ void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx* ctx,
 | 
			
		||||
                        size_t* offsetPtr,
 | 
			
		||||
                        U32 maxNbAttempts, U32 matchLengthSearch);
 | 
			
		||||
    searchMax_f const searchMax = searchMethod ? ZSTD_BtFindBestMatch_selectMLS : ZSTD_HcFindBestMatch_selectMLS;
 | 
			
		||||
    U32 rep[ZSTD_REP_INIT];
 | 
			
		||||
    U32 offset_1 = ctx->rep[0], offset_2 = ctx->rep[1], savedOffset=0;
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    ip += (ip==base);
 | 
			
		||||
    ctx->nextToUpdate3 = ctx->nextToUpdate;
 | 
			
		||||
    {   U32 i;
 | 
			
		||||
        U32 const maxRep = (U32)(ip-base);
 | 
			
		||||
        for (i=0; i<ZSTD_REP_INIT; i++) {
 | 
			
		||||
            rep[i]=ctx->rep[i];
 | 
			
		||||
            if (rep[i]>maxRep) rep[i]=0;
 | 
			
		||||
    }   }
 | 
			
		||||
    {   U32 const maxRep = (U32)(ip-base);
 | 
			
		||||
        if (offset_2 > maxRep) savedOffset = offset_2, offset_2 = 0;
 | 
			
		||||
        if (offset_1 > maxRep) savedOffset = offset_1, offset_1 = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Match Loop */
 | 
			
		||||
    while (ip < ilimit) {
 | 
			
		||||
@@ -1750,9 +2033,9 @@ void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx* ctx,
 | 
			
		||||
        const BYTE* start=ip+1;
 | 
			
		||||
 | 
			
		||||
        /* check repCode */
 | 
			
		||||
        if ((rep[0]>0) & (MEM_read32(ip+1) == MEM_read32(ip+1 - rep[0]))) {
 | 
			
		||||
        if ((offset_1>0) & (MEM_read32(ip+1) == MEM_read32(ip+1 - offset_1))) {
 | 
			
		||||
            /* repcode : we take it */
 | 
			
		||||
            matchLength = ZSTD_count(ip+1+EQUAL_READ32, ip+1+EQUAL_READ32-rep[0], iend) + EQUAL_READ32;
 | 
			
		||||
            matchLength = ZSTD_count(ip+1+EQUAL_READ32, ip+1+EQUAL_READ32-offset_1, iend) + EQUAL_READ32;
 | 
			
		||||
            if (depth==0) goto _storeSequence;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1772,8 +2055,8 @@ void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx* ctx,
 | 
			
		||||
        if (depth>=1)
 | 
			
		||||
        while (ip<ilimit) {
 | 
			
		||||
            ip ++;
 | 
			
		||||
            if ((offset) && ((rep[0]>0) & (MEM_read32(ip) == MEM_read32(ip - rep[0])))) {
 | 
			
		||||
                size_t const mlRep = ZSTD_count(ip+EQUAL_READ32, ip+EQUAL_READ32-rep[0], iend) + EQUAL_READ32;
 | 
			
		||||
            if ((offset) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) {
 | 
			
		||||
                size_t const mlRep = ZSTD_count(ip+EQUAL_READ32, ip+EQUAL_READ32-offset_1, iend) + EQUAL_READ32;
 | 
			
		||||
                int const gain2 = (int)(mlRep * 3);
 | 
			
		||||
                int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offset+1) + 1);
 | 
			
		||||
                if ((mlRep >= EQUAL_READ32) && (gain2 > gain1))
 | 
			
		||||
@@ -1791,8 +2074,8 @@ void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx* ctx,
 | 
			
		||||
            /* let's find an even better one */
 | 
			
		||||
            if ((depth==2) && (ip<ilimit)) {
 | 
			
		||||
                ip ++;
 | 
			
		||||
                if ((offset) && ((rep[0]>0) & (MEM_read32(ip) == MEM_read32(ip - rep[0])))) {
 | 
			
		||||
                    size_t const ml2 = ZSTD_count(ip+EQUAL_READ32, ip+EQUAL_READ32-rep[0], iend) + EQUAL_READ32;
 | 
			
		||||
                if ((offset) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) {
 | 
			
		||||
                    size_t const ml2 = ZSTD_count(ip+EQUAL_READ32, ip+EQUAL_READ32-offset_1, iend) + EQUAL_READ32;
 | 
			
		||||
                    int const gain2 = (int)(ml2 * 4);
 | 
			
		||||
                    int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 1);
 | 
			
		||||
                    if ((ml2 >= EQUAL_READ32) && (gain2 > gain1))
 | 
			
		||||
@@ -1813,23 +2096,23 @@ void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx* ctx,
 | 
			
		||||
        if (offset) {
 | 
			
		||||
            while ((start>anchor) && (start>base+offset-ZSTD_REP_MOVE) && (start[-1] == start[-1-offset+ZSTD_REP_MOVE]))   /* only search for offset within prefix */
 | 
			
		||||
                { start--; matchLength++; }
 | 
			
		||||
            rep[1] = rep[0]; rep[0] = (U32)(offset - ZSTD_REP_MOVE);
 | 
			
		||||
            offset_2 = offset_1; offset_1 = (U32)(offset - ZSTD_REP_MOVE);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* store sequence */
 | 
			
		||||
_storeSequence:
 | 
			
		||||
        {   size_t const litLength = start - anchor;
 | 
			
		||||
            ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, matchLength-MINMATCH);
 | 
			
		||||
            ZSTD_storeSeq(seqStorePtr, litLength, anchor, (U32)offset, matchLength-MINMATCH);
 | 
			
		||||
            anchor = ip = start + matchLength;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* check immediate repcode */
 | 
			
		||||
        while ( (ip <= ilimit)
 | 
			
		||||
             && ((rep[1]>0)
 | 
			
		||||
             & (MEM_read32(ip) == MEM_read32(ip - rep[1])) )) {
 | 
			
		||||
             && ((offset_2>0)
 | 
			
		||||
             & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) {
 | 
			
		||||
            /* store sequence */
 | 
			
		||||
            matchLength = ZSTD_count(ip+EQUAL_READ32, ip+EQUAL_READ32-rep[1], iend) + EQUAL_READ32;
 | 
			
		||||
            offset = rep[1]; rep[1] = rep[0]; rep[0] = (U32)offset; /* swap repcodes */
 | 
			
		||||
            matchLength = ZSTD_count(ip+EQUAL_READ32, ip+EQUAL_READ32-offset_2, iend) + EQUAL_READ32;
 | 
			
		||||
            offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap repcodes */
 | 
			
		||||
            ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, matchLength-MINMATCH);
 | 
			
		||||
            ip += matchLength;
 | 
			
		||||
            anchor = ip;
 | 
			
		||||
@@ -1837,11 +2120,8 @@ _storeSequence:
 | 
			
		||||
    }   }
 | 
			
		||||
 | 
			
		||||
    /* Save reps for next block */
 | 
			
		||||
    {   int i;
 | 
			
		||||
        for (i=0; i<ZSTD_REP_NUM; i++) {
 | 
			
		||||
            if (!rep[i]) rep[i] = (U32)(iend - ctx->base) + 1;   /* in case some zero are left */
 | 
			
		||||
            ctx->savedRep[i] = rep[i];
 | 
			
		||||
    }   }
 | 
			
		||||
    ctx->savedRep[0] = offset_1 ? offset_1 : savedOffset;
 | 
			
		||||
    ctx->savedRep[1] = offset_2 ? offset_2 : savedOffset;
 | 
			
		||||
 | 
			
		||||
    /* Last Literals */
 | 
			
		||||
    {   size_t const lastLLSize = iend - anchor;
 | 
			
		||||
@@ -1900,10 +2180,9 @@ void ZSTD_compressBlock_lazy_extDict_generic(ZSTD_CCtx* ctx,
 | 
			
		||||
                        U32 maxNbAttempts, U32 matchLengthSearch);
 | 
			
		||||
    searchMax_f searchMax = searchMethod ? ZSTD_BtFindBestMatch_selectMLS_extDict : ZSTD_HcFindBestMatch_extDict_selectMLS;
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    U32 rep[ZSTD_REP_INIT];
 | 
			
		||||
    { U32 i; for (i=0; i<ZSTD_REP_INIT; i++) rep[i]=ctx->rep[i]; }
 | 
			
		||||
    U32 offset_1 = ctx->rep[0], offset_2 = ctx->rep[1];
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    ctx->nextToUpdate3 = ctx->nextToUpdate;
 | 
			
		||||
    ip += (ip == prefixStart);
 | 
			
		||||
 | 
			
		||||
@@ -1915,7 +2194,7 @@ void ZSTD_compressBlock_lazy_extDict_generic(ZSTD_CCtx* ctx,
 | 
			
		||||
        U32 current = (U32)(ip-base);
 | 
			
		||||
 | 
			
		||||
        /* check repCode */
 | 
			
		||||
        {   const U32 repIndex = (U32)(current+1 - rep[0]);
 | 
			
		||||
        {   const U32 repIndex = (U32)(current+1 - offset_1);
 | 
			
		||||
            const BYTE* const repBase = repIndex < dictLimit ? dictBase : base;
 | 
			
		||||
            const BYTE* const repMatch = repBase + repIndex;
 | 
			
		||||
            if (((U32)((dictLimit-1) - repIndex) >= 3) & (repIndex > lowestIndex))   /* intentional overflow */
 | 
			
		||||
@@ -1945,7 +2224,7 @@ void ZSTD_compressBlock_lazy_extDict_generic(ZSTD_CCtx* ctx,
 | 
			
		||||
            current++;
 | 
			
		||||
            /* check repCode */
 | 
			
		||||
            if (offset) {
 | 
			
		||||
                const U32 repIndex = (U32)(current - rep[0]);
 | 
			
		||||
                const U32 repIndex = (U32)(current - offset_1);
 | 
			
		||||
                const BYTE* const repBase = repIndex < dictLimit ? dictBase : base;
 | 
			
		||||
                const BYTE* const repMatch = repBase + repIndex;
 | 
			
		||||
                if (((U32)((dictLimit-1) - repIndex) >= 3) & (repIndex > lowestIndex))  /* intentional overflow */
 | 
			
		||||
@@ -1975,7 +2254,7 @@ void ZSTD_compressBlock_lazy_extDict_generic(ZSTD_CCtx* ctx,
 | 
			
		||||
                current++;
 | 
			
		||||
                /* check repCode */
 | 
			
		||||
                if (offset) {
 | 
			
		||||
                    const U32 repIndex = (U32)(current - rep[0]);
 | 
			
		||||
                    const U32 repIndex = (U32)(current - offset_1);
 | 
			
		||||
                    const BYTE* const repBase = repIndex < dictLimit ? dictBase : base;
 | 
			
		||||
                    const BYTE* const repMatch = repBase + repIndex;
 | 
			
		||||
                    if (((U32)((dictLimit-1) - repIndex) >= 3) & (repIndex > lowestIndex))  /* intentional overflow */
 | 
			
		||||
@@ -2007,19 +2286,19 @@ void ZSTD_compressBlock_lazy_extDict_generic(ZSTD_CCtx* ctx,
 | 
			
		||||
            const BYTE* match = (matchIndex < dictLimit) ? dictBase + matchIndex : base + matchIndex;
 | 
			
		||||
            const BYTE* const mStart = (matchIndex < dictLimit) ? dictStart : prefixStart;
 | 
			
		||||
            while ((start>anchor) && (match>mStart) && (start[-1] == match[-1])) { start--; match--; matchLength++; }  /* catch up */
 | 
			
		||||
            rep[1] = rep[0]; rep[0] = (U32)(offset - ZSTD_REP_MOVE);
 | 
			
		||||
            offset_2 = offset_1; offset_1 = (U32)(offset - ZSTD_REP_MOVE);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* store sequence */
 | 
			
		||||
_storeSequence:
 | 
			
		||||
        {   size_t const litLength = start - anchor;
 | 
			
		||||
            ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, matchLength-MINMATCH);
 | 
			
		||||
            ZSTD_storeSeq(seqStorePtr, litLength, anchor, (U32)offset, matchLength-MINMATCH);
 | 
			
		||||
            anchor = ip = start + matchLength;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* check immediate repcode */
 | 
			
		||||
        while (ip <= ilimit) {
 | 
			
		||||
            const U32 repIndex = (U32)((ip-base) - rep[1]);
 | 
			
		||||
            const U32 repIndex = (U32)((ip-base) - offset_2);
 | 
			
		||||
            const BYTE* const repBase = repIndex < dictLimit ? dictBase : base;
 | 
			
		||||
            const BYTE* const repMatch = repBase + repIndex;
 | 
			
		||||
            if (((U32)((dictLimit-1) - repIndex) >= 3) & (repIndex > lowestIndex))  /* intentional overflow */
 | 
			
		||||
@@ -2027,7 +2306,7 @@ _storeSequence:
 | 
			
		||||
                /* repcode detected we should take it */
 | 
			
		||||
                const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend;
 | 
			
		||||
                matchLength = ZSTD_count_2segments(ip+EQUAL_READ32, repMatch+EQUAL_READ32, iend, repEnd, prefixStart) + EQUAL_READ32;
 | 
			
		||||
                offset = rep[1]; rep[1] = rep[0]; rep[0] = (U32)offset;   /* swap offset history */
 | 
			
		||||
                offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset;   /* swap offset history */
 | 
			
		||||
                ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, matchLength-MINMATCH);
 | 
			
		||||
                ip += matchLength;
 | 
			
		||||
                anchor = ip;
 | 
			
		||||
@@ -2037,7 +2316,7 @@ _storeSequence:
 | 
			
		||||
    }   }
 | 
			
		||||
 | 
			
		||||
    /* Save reps for next block */
 | 
			
		||||
    ctx->savedRep[0] = rep[0]; ctx->savedRep[1] = rep[1]; ctx->savedRep[2] = rep[2];
 | 
			
		||||
    ctx->savedRep[0] = offset_1; ctx->savedRep[1] = offset_2;
 | 
			
		||||
 | 
			
		||||
    /* Last Literals */
 | 
			
		||||
    {   size_t const lastLLSize = iend - anchor;
 | 
			
		||||
@@ -2068,18 +2347,27 @@ static void ZSTD_compressBlock_btlazy2_extDict(ZSTD_CCtx* ctx, const void* src,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* The optimal parser */
 | 
			
		||||
#include "zstd_opt.h"
 | 
			
		||||
 | 
			
		||||
static void ZSTD_compressBlock_btopt(ZSTD_CCtx* ctx, const void* src, size_t srcSize)
 | 
			
		||||
{
 | 
			
		||||
#ifdef ZSTD_OPT_H_91842398743
 | 
			
		||||
    ZSTD_compressBlock_opt_generic(ctx, src, srcSize);
 | 
			
		||||
#else
 | 
			
		||||
    (void)ctx; (void)src; (void)srcSize;
 | 
			
		||||
    return;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ZSTD_compressBlock_btopt_extDict(ZSTD_CCtx* ctx, const void* src, size_t srcSize)
 | 
			
		||||
{
 | 
			
		||||
#ifdef ZSTD_OPT_H_91842398743
 | 
			
		||||
    ZSTD_compressBlock_opt_extDict_generic(ctx, src, srcSize);
 | 
			
		||||
#else
 | 
			
		||||
    (void)ctx; (void)src; (void)srcSize;
 | 
			
		||||
    return;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -2087,9 +2375,9 @@ typedef void (*ZSTD_blockCompressor) (ZSTD_CCtx* ctx, const void* src, size_t sr
 | 
			
		||||
 | 
			
		||||
static ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, int extDict)
 | 
			
		||||
{
 | 
			
		||||
    static const ZSTD_blockCompressor blockCompressor[2][6] = {
 | 
			
		||||
        { ZSTD_compressBlock_fast, ZSTD_compressBlock_greedy, ZSTD_compressBlock_lazy, ZSTD_compressBlock_lazy2, ZSTD_compressBlock_btlazy2, ZSTD_compressBlock_btopt },
 | 
			
		||||
        { ZSTD_compressBlock_fast_extDict, ZSTD_compressBlock_greedy_extDict, ZSTD_compressBlock_lazy_extDict,ZSTD_compressBlock_lazy2_extDict, ZSTD_compressBlock_btlazy2_extDict, ZSTD_compressBlock_btopt_extDict }
 | 
			
		||||
    static const ZSTD_blockCompressor blockCompressor[2][7] = {
 | 
			
		||||
        { ZSTD_compressBlock_fast, ZSTD_compressBlock_doubleFast, ZSTD_compressBlock_greedy, ZSTD_compressBlock_lazy, ZSTD_compressBlock_lazy2, ZSTD_compressBlock_btlazy2, ZSTD_compressBlock_btopt },
 | 
			
		||||
        { ZSTD_compressBlock_fast_extDict, ZSTD_compressBlock_doubleFast_extDict, ZSTD_compressBlock_greedy_extDict, ZSTD_compressBlock_lazy_extDict,ZSTD_compressBlock_lazy2_extDict, ZSTD_compressBlock_btlazy2_extDict, ZSTD_compressBlock_btopt_extDict }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    return blockCompressor[extDict][(U32)strat];
 | 
			
		||||
@@ -2119,7 +2407,7 @@ static size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
 | 
			
		||||
    BYTE* op = ostart;
 | 
			
		||||
    const U32 maxDist = 1 << cctx->params.cParams.windowLog;
 | 
			
		||||
    ZSTD_stats_t* stats = &cctx->seqStore.stats;
 | 
			
		||||
    ZSTD_statsInit(stats);
 | 
			
		||||
    ZSTD_statsInit(stats);   /* debug only */
 | 
			
		||||
 | 
			
		||||
    if (cctx->params.fParams.checksumFlag)
 | 
			
		||||
        XXH64_update(&cctx->xxhState, src, srcSize);
 | 
			
		||||
@@ -2272,7 +2560,8 @@ size_t ZSTD_compressContinue (ZSTD_CCtx* zc,
 | 
			
		||||
 | 
			
		||||
size_t ZSTD_compressBlock(ZSTD_CCtx* zc, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
 | 
			
		||||
{
 | 
			
		||||
    if (srcSize > ZSTD_BLOCKSIZE_MAX) return ERROR(srcSize_wrong);
 | 
			
		||||
    size_t const blockSizeMax = MIN (ZSTD_BLOCKSIZE_MAX, 1 << zc->params.cParams.windowLog);
 | 
			
		||||
    if (srcSize > blockSizeMax) return ERROR(srcSize_wrong);
 | 
			
		||||
    ZSTD_LOG_BLOCK("%p: ZSTD_compressBlock searchLength=%d\n", zc->base, zc->params.cParams.searchLength);
 | 
			
		||||
    return ZSTD_compressContinue_internal(zc, dst, dstCapacity, src, srcSize, 0);
 | 
			
		||||
}
 | 
			
		||||
@@ -2300,6 +2589,10 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_CCtx* zc, const void* src, size_t
 | 
			
		||||
        ZSTD_fillHashTable (zc, iend, zc->params.cParams.searchLength);
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case ZSTD_dfast:
 | 
			
		||||
        ZSTD_fillDoubleHashTable (zc, iend, zc->params.cParams.searchLength);
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case ZSTD_greedy:
 | 
			
		||||
    case ZSTD_lazy:
 | 
			
		||||
    case ZSTD_lazy2:
 | 
			
		||||
@@ -2414,7 +2707,7 @@ static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* zc,
 | 
			
		||||
*   @return : 0, or an error code */
 | 
			
		||||
size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx,
 | 
			
		||||
                             const void* dict, size_t dictSize,
 | 
			
		||||
                                   ZSTD_parameters params, U64 pledgedSrcSize)
 | 
			
		||||
                                   ZSTD_parameters params, unsigned long long pledgedSrcSize)
 | 
			
		||||
{
 | 
			
		||||
    /* compression parameters verification and optimization */
 | 
			
		||||
    { size_t const errorCode = ZSTD_checkCParams_advanced(params.cParams, pledgedSrcSize);
 | 
			
		||||
@@ -2426,9 +2719,7 @@ size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx,
 | 
			
		||||
 | 
			
		||||
size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel)
 | 
			
		||||
{
 | 
			
		||||
    ZSTD_parameters params;
 | 
			
		||||
    memset(¶ms, 0, sizeof(params));
 | 
			
		||||
    params.cParams = ZSTD_getCParams(compressionLevel, 0, dictSize);
 | 
			
		||||
    ZSTD_parameters const params = ZSTD_getParams(compressionLevel, 0, dictSize);
 | 
			
		||||
    ZSTD_LOG_BLOCK("%p: ZSTD_compressBegin_usingDict compressionLevel=%d\n", cctx->base, compressionLevel);
 | 
			
		||||
    return ZSTD_compressBegin_internal(cctx, dict, dictSize, params, 0);
 | 
			
		||||
}
 | 
			
		||||
@@ -2538,11 +2829,9 @@ size_t ZSTD_compress_advanced (ZSTD_CCtx* ctx,
 | 
			
		||||
 | 
			
		||||
size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, const void* dict, size_t dictSize, int compressionLevel)
 | 
			
		||||
{
 | 
			
		||||
    ZSTD_parameters params;
 | 
			
		||||
    memset(¶ms, 0, sizeof(params));
 | 
			
		||||
    ZSTD_LOG_BLOCK("%p: ZSTD_compress_usingDict srcSize=%d dictSize=%d compressionLevel=%d\n", ctx->base, (int)srcSize, (int)dictSize, compressionLevel);
 | 
			
		||||
    params.cParams =  ZSTD_getCParams(compressionLevel, srcSize, dictSize);
 | 
			
		||||
    ZSTD_parameters params = ZSTD_getParams(compressionLevel, srcSize, dictSize);
 | 
			
		||||
    params.fParams.contentSizeFlag = 1;
 | 
			
		||||
    ZSTD_LOG_BLOCK("%p: ZSTD_compress_usingDict srcSize=%d dictSize=%d compressionLevel=%d\n", ctx->base, (int)srcSize, (int)dictSize, compressionLevel);
 | 
			
		||||
    return ZSTD_compress_internal(ctx, dst, dstCapacity, src, srcSize, dict, dictSize, params);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -2577,7 +2866,7 @@ ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, ZSTD_pa
 | 
			
		||||
    if (!customMem.customAlloc && !customMem.customFree)
 | 
			
		||||
        customMem = defaultCustomMem;
 | 
			
		||||
 | 
			
		||||
    if (!customMem.customAlloc || !customMem.customFree)
 | 
			
		||||
    if (!customMem.customAlloc || !customMem.customFree)  /* can't have 1/2 custom alloc/free as NULL */
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    {   ZSTD_CDict* const cdict = (ZSTD_CDict*) customMem.customAlloc(customMem.opaque, sizeof(*cdict));
 | 
			
		||||
@@ -2648,24 +2937,24 @@ unsigned ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; }
 | 
			
		||||
static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL+1] = {
 | 
			
		||||
{   /* "default" */
 | 
			
		||||
    /* W,  C,  H,  S,  L, TL, strat */
 | 
			
		||||
    {  0,  0,  0,  0,  0,  0, ZSTD_fast    },  /* level  0 - never used */
 | 
			
		||||
    { 19, 13, 14,  1,  7,  4, ZSTD_fast    },  /* level  1 */
 | 
			
		||||
    { 19, 15, 16,  1,  6,  4, ZSTD_fast    },  /* level  2 */
 | 
			
		||||
    { 20, 18, 20,  1,  6,  4, ZSTD_fast    },  /* level  3 */
 | 
			
		||||
    { 20, 13, 17,  2,  5,  4, ZSTD_greedy  },  /* level  4.*/
 | 
			
		||||
    { 20, 15, 18,  3,  5,  4, ZSTD_greedy  },  /* level  5 */
 | 
			
		||||
    { 21, 16, 19,  2,  5,  4, ZSTD_lazy    },  /* level  6 */
 | 
			
		||||
    { 21, 17, 20,  3,  5,  4, ZSTD_lazy    },  /* level  7 */
 | 
			
		||||
    { 21, 18, 20,  3,  5,  4, ZSTD_lazy2   },  /* level  8.*/
 | 
			
		||||
    { 21, 20, 20,  3,  5,  4, ZSTD_lazy2   },  /* level  9 */
 | 
			
		||||
    { 21, 19, 21,  4,  5,  4, ZSTD_lazy2   },  /* level 10 */
 | 
			
		||||
    { 22, 20, 22,  4,  5,  4, ZSTD_lazy2   },  /* level 11 */
 | 
			
		||||
    { 22, 20, 22,  5,  5,  4, ZSTD_lazy2   },  /* level 12 */
 | 
			
		||||
    { 22, 21, 22,  5,  5,  4, ZSTD_lazy2   },  /* level 13 */
 | 
			
		||||
    { 22, 21, 22,  6,  5,  4, ZSTD_lazy2   },  /* level 14 */
 | 
			
		||||
    { 22, 21, 21,  5,  5,  4, ZSTD_btlazy2 },  /* level 15 */
 | 
			
		||||
    { 23, 22, 22,  5,  5,  4, ZSTD_btlazy2 },  /* level 16 */
 | 
			
		||||
    { 23, 23, 22,  5,  5,  4, ZSTD_btlazy2 },  /* level 17.*/
 | 
			
		||||
    { 18, 12, 12,  1,  7, 16, ZSTD_fast    },  /* level  0 - not used */
 | 
			
		||||
    { 19, 13, 14,  1,  7, 16, ZSTD_fast    },  /* level  1 */
 | 
			
		||||
    { 19, 15, 16,  1,  6, 16, ZSTD_fast    },  /* level  2 */
 | 
			
		||||
    { 20, 16, 18,  1,  5, 16, ZSTD_dfast   },  /* level  3 */
 | 
			
		||||
    { 20, 13, 17,  2,  5, 16, ZSTD_greedy  },  /* level  4.*/
 | 
			
		||||
    { 20, 15, 18,  3,  5, 16, ZSTD_greedy  },  /* level  5 */
 | 
			
		||||
    { 21, 16, 19,  2,  5, 16, ZSTD_lazy    },  /* level  6 */
 | 
			
		||||
    { 21, 17, 20,  3,  5, 16, ZSTD_lazy    },  /* level  7 */
 | 
			
		||||
    { 21, 18, 20,  3,  5, 16, ZSTD_lazy2   },  /* level  8.*/
 | 
			
		||||
    { 21, 20, 20,  3,  5, 16, ZSTD_lazy2   },  /* level  9 */
 | 
			
		||||
    { 21, 19, 21,  4,  5, 16, ZSTD_lazy2   },  /* level 10 */
 | 
			
		||||
    { 22, 20, 22,  4,  5, 16, ZSTD_lazy2   },  /* level 11 */
 | 
			
		||||
    { 22, 20, 22,  5,  5, 16, ZSTD_lazy2   },  /* level 12 */
 | 
			
		||||
    { 22, 21, 22,  5,  5, 16, ZSTD_lazy2   },  /* level 13 */
 | 
			
		||||
    { 22, 21, 22,  6,  5, 16, ZSTD_lazy2   },  /* level 14 */
 | 
			
		||||
    { 22, 21, 21,  5,  5, 16, ZSTD_btlazy2 },  /* level 15 */
 | 
			
		||||
    { 23, 22, 22,  5,  5, 16, ZSTD_btlazy2 },  /* level 16 */
 | 
			
		||||
    { 23, 23, 22,  5,  5, 16, ZSTD_btlazy2 },  /* level 17.*/
 | 
			
		||||
    { 23, 23, 22,  6,  5, 24, ZSTD_btopt   },  /* level 18.*/
 | 
			
		||||
    { 23, 23, 22,  6,  3, 48, ZSTD_btopt   },  /* level 19.*/
 | 
			
		||||
    { 25, 26, 23,  7,  3, 64, ZSTD_btopt   },  /* level 20.*/
 | 
			
		||||
@@ -2674,7 +2963,7 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
 | 
			
		||||
},
 | 
			
		||||
{   /* for srcSize <= 256 KB */
 | 
			
		||||
    /* W,  C,  H,  S,  L,  T, strat */
 | 
			
		||||
    {  0,  0,  0,  0,  0,  0, ZSTD_fast    },  /* level  0 */
 | 
			
		||||
    { 18, 12, 12,  1,  7,  4, ZSTD_fast    },  /* level  0 - not used */
 | 
			
		||||
    { 18, 13, 14,  1,  6,  4, ZSTD_fast    },  /* level  1 */
 | 
			
		||||
    { 18, 15, 17,  1,  5,  4, ZSTD_fast    },  /* level  2 */
 | 
			
		||||
    { 18, 13, 15,  1,  5,  4, ZSTD_greedy  },  /* level  3.*/
 | 
			
		||||
@@ -2700,7 +2989,7 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
 | 
			
		||||
},
 | 
			
		||||
{   /* for srcSize <= 128 KB */
 | 
			
		||||
    /* W,  C,  H,  S,  L,  T, strat */
 | 
			
		||||
    {  0,  0,  0,  0,  0,  0, ZSTD_fast    },  /* level  0 - never used */
 | 
			
		||||
    { 17, 12, 12,  1,  7,  4, ZSTD_fast    },  /* level  0 - not used */
 | 
			
		||||
    { 17, 12, 13,  1,  6,  4, ZSTD_fast    },  /* level  1 */
 | 
			
		||||
    { 17, 13, 16,  1,  5,  4, ZSTD_fast    },  /* level  2 */
 | 
			
		||||
    { 17, 13, 14,  2,  5,  4, ZSTD_greedy  },  /* level  3 */
 | 
			
		||||
@@ -2726,16 +3015,16 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
 | 
			
		||||
},
 | 
			
		||||
{   /* for srcSize <= 16 KB */
 | 
			
		||||
    /* W,  C,  H,  S,  L,  T, strat */
 | 
			
		||||
    {  0,  0,  0,  0,  0,  0, ZSTD_fast    },  /* level  0 -- never used */
 | 
			
		||||
    { 14, 14, 14,  1,  4,  4, ZSTD_fast    },  /* level  1 */
 | 
			
		||||
    { 14, 14, 15,  1,  4,  4, ZSTD_fast    },  /* level  2 */
 | 
			
		||||
    { 14, 14, 14,  4,  4,  4, ZSTD_greedy  },  /* level  3.*/
 | 
			
		||||
    { 14, 14, 14,  3,  4,  4, ZSTD_lazy    },  /* level  4.*/
 | 
			
		||||
    { 14, 14, 14,  4,  4,  4, ZSTD_lazy2   },  /* level  5 */
 | 
			
		||||
    { 14, 14, 14,  5,  4,  4, ZSTD_lazy2   },  /* level  6 */
 | 
			
		||||
    { 14, 14, 14,  6,  4,  4, ZSTD_lazy2   },  /* level  7.*/
 | 
			
		||||
    { 14, 14, 14,  7,  4,  4, ZSTD_lazy2   },  /* level  8.*/
 | 
			
		||||
    { 14, 15, 14,  6,  4,  4, ZSTD_btlazy2 },  /* level  9.*/
 | 
			
		||||
    { 14, 12, 12,  1,  7,  6, ZSTD_fast    },  /* level  0 - not used */
 | 
			
		||||
    { 14, 14, 14,  1,  6,  6, ZSTD_fast    },  /* level  1 */
 | 
			
		||||
    { 14, 14, 14,  1,  4,  6, ZSTD_fast    },  /* level  2 */
 | 
			
		||||
    { 14, 14, 14,  1,  4,  6, ZSTD_dfast   },  /* level  3.*/
 | 
			
		||||
    { 14, 14, 14,  4,  4,  6, ZSTD_greedy  },  /* level  4.*/
 | 
			
		||||
    { 14, 14, 14,  3,  4,  6, ZSTD_lazy    },  /* level  5.*/
 | 
			
		||||
    { 14, 14, 14,  4,  4,  6, ZSTD_lazy2   },  /* level  6 */
 | 
			
		||||
    { 14, 14, 14,  5,  4,  6, ZSTD_lazy2   },  /* level  7 */
 | 
			
		||||
    { 14, 14, 14,  6,  4,  6, ZSTD_lazy2   },  /* level  8.*/
 | 
			
		||||
    { 14, 15, 14,  6,  4,  6, ZSTD_btlazy2 },  /* level  9.*/
 | 
			
		||||
    { 14, 15, 14,  3,  3,  6, ZSTD_btopt   },  /* level 10.*/
 | 
			
		||||
    { 14, 15, 14,  6,  3,  8, ZSTD_btopt   },  /* level 11.*/
 | 
			
		||||
    { 14, 15, 14,  6,  3, 16, ZSTD_btopt   },  /* level 12.*/
 | 
			
		||||
@@ -2755,7 +3044,7 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
 | 
			
		||||
/*! ZSTD_getCParams() :
 | 
			
		||||
*   @return ZSTD_compressionParameters structure for a selected compression level, `srcSize` and `dictSize`.
 | 
			
		||||
*   Size values are optional, provide 0 if not known or unused */
 | 
			
		||||
ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, U64 srcSize, size_t dictSize)
 | 
			
		||||
ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long srcSize, size_t dictSize)
 | 
			
		||||
{
 | 
			
		||||
    ZSTD_compressionParameters cp;
 | 
			
		||||
    size_t const addedSize = srcSize ? 0 : 500;
 | 
			
		||||
@@ -2772,3 +3061,14 @@ ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, U64 srcSize, si
 | 
			
		||||
    cp = ZSTD_adjustCParams(cp, srcSize, dictSize);
 | 
			
		||||
    return cp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_getParams() :
 | 
			
		||||
*   same as ZSTD_getCParams(), but @return a `ZSTD_parameters` object (instead of `ZSTD_compressionParameters`).
 | 
			
		||||
*   All fields of `ZSTD_frameParameters` are set to default (0) */
 | 
			
		||||
ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long srcSize, size_t dictSize) {
 | 
			
		||||
    ZSTD_parameters params;
 | 
			
		||||
    ZSTD_compressionParameters const cParams = ZSTD_getCParams(compressionLevel, srcSize, dictSize);
 | 
			
		||||
    memset(¶ms, 0, sizeof(params));
 | 
			
		||||
    params.cParams = cParams;
 | 
			
		||||
    return params;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,10 @@
 | 
			
		||||
/* Note : this file is intended to be included within zstd_compress.c */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef ZSTD_OPT_H_91842398743
 | 
			
		||||
#define ZSTD_OPT_H_91842398743
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define ZSTD_FREQ_DIV   5
 | 
			
		||||
 | 
			
		||||
/*-*************************************
 | 
			
		||||
@@ -110,7 +114,7 @@ FORCE_INLINE U32 ZSTD_getLiteralPrice(seqStore_t* ssPtr, U32 litLength, const BY
 | 
			
		||||
 | 
			
		||||
    /* literals */
 | 
			
		||||
    if (ssPtr->cachedLiterals == literals) {
 | 
			
		||||
        U32 additional = litLength - ssPtr->cachedLitLength;
 | 
			
		||||
        U32 const additional = litLength - ssPtr->cachedLitLength;
 | 
			
		||||
        const BYTE* literals2 = ssPtr->cachedLiterals + ssPtr->cachedLitLength;
 | 
			
		||||
        price = ssPtr->cachedPrice + additional * ssPtr->log2litSum;
 | 
			
		||||
        for (u=0; u < additional; u++)
 | 
			
		||||
@@ -150,7 +154,7 @@ FORCE_INLINE U32 ZSTD_getLiteralPrice(seqStore_t* ssPtr, U32 litLength, const BY
 | 
			
		||||
FORCE_INLINE U32 ZSTD_getPrice(seqStore_t* seqStorePtr, U32 litLength, const BYTE* literals, U32 offset, U32 matchLength)
 | 
			
		||||
{
 | 
			
		||||
    /* offset */
 | 
			
		||||
    BYTE offCode = (BYTE)ZSTD_highbit32(offset+1);
 | 
			
		||||
    BYTE const offCode = (BYTE)ZSTD_highbit32(offset+1);
 | 
			
		||||
    U32 price = offCode + seqStorePtr->log2offCodeSum - ZSTD_highbit32(seqStorePtr->offCodeFreq[offCode]+1);
 | 
			
		||||
 | 
			
		||||
    /* match Length */
 | 
			
		||||
@@ -196,7 +200,7 @@ MEM_STATIC void ZSTD_updatePrice(seqStore_t* seqStorePtr, U32 litLength, const B
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* match offset */
 | 
			
		||||
	{   BYTE offCode = (BYTE)ZSTD_highbit32(offset+1);
 | 
			
		||||
	{   BYTE const offCode = (BYTE)ZSTD_highbit32(offset+1);
 | 
			
		||||
		seqStorePtr->offCodeSum++;
 | 
			
		||||
		seqStorePtr->offCodeFreq[offCode]++;
 | 
			
		||||
	}
 | 
			
		||||
@@ -232,7 +236,6 @@ MEM_STATIC void ZSTD_updatePrice(seqStore_t* seqStorePtr, U32 litLength, const B
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Update hashTable3 up to ip (excluded)
 | 
			
		||||
   Assumption : always within prefix (ie. not within extDict) */
 | 
			
		||||
FORCE_INLINE
 | 
			
		||||
@@ -1039,3 +1042,5 @@ _storeSequence:   /* cur, last_pos, best_mlen, best_off have to be set */
 | 
			
		||||
        seqStorePtr->lit += lastLLSize;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif  /* ZSTD_OPT_H_91842398743 */
 | 
			
		||||
 
 | 
			
		||||
@@ -173,7 +173,7 @@ size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbd,
 | 
			
		||||
                    if (ZSTD_isError(hSize)) return hSize;
 | 
			
		||||
                    if (toLoad > (size_t)(iend-ip)) {   /* not enough input to load full header */
 | 
			
		||||
                        memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip);
 | 
			
		||||
                        zbd->lhSize += iend-ip; ip = iend; notDone = 0;
 | 
			
		||||
                        zbd->lhSize += iend-ip;
 | 
			
		||||
                        *dstCapacityPtr = 0;
 | 
			
		||||
                        return (hSize - zbd->lhSize) + ZSTD_blockHeaderSize;   /* remaining header bytes + next block header */
 | 
			
		||||
                    }
 | 
			
		||||
 
 | 
			
		||||
@@ -135,7 +135,9 @@ struct ZSTD_DCtx_s
 | 
			
		||||
    BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX];
 | 
			
		||||
};  /* typedef'd to ZSTD_DCtx within "zstd_static.h" */
 | 
			
		||||
 | 
			
		||||
size_t ZSTD_sizeofDCtx (void) { return sizeof(ZSTD_DCtx); }   /* non published interface */
 | 
			
		||||
size_t ZSTD_sizeofDCtx (const ZSTD_DCtx* dctx) { return sizeof(*dctx); }
 | 
			
		||||
 | 
			
		||||
size_t ZSTD_estimateDCtxSize(void) { return sizeof(ZSTD_DCtx); }
 | 
			
		||||
 | 
			
		||||
size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx)
 | 
			
		||||
{
 | 
			
		||||
@@ -195,7 +197,7 @@ void ZSTD_copyDCtx(ZSTD_DCtx* dstDCtx, const ZSTD_DCtx* srcDCtx)
 | 
			
		||||
/* Frame format description
 | 
			
		||||
   Frame Header -  [ Block Header - Block ] - Frame End
 | 
			
		||||
   1) Frame Header
 | 
			
		||||
      - 4 bytes - Magic Number : ZSTD_MAGICNUMBER (defined within zstd_static.h)
 | 
			
		||||
      - 4 bytes - Magic Number : ZSTD_MAGICNUMBER (defined within zstd.h)
 | 
			
		||||
      - 1 byte  - Frame Descriptor
 | 
			
		||||
   2) Block Header
 | 
			
		||||
      - 3 bytes, starting with a 2-bits descriptor
 | 
			
		||||
@@ -207,20 +209,8 @@ void ZSTD_copyDCtx(ZSTD_DCtx* dstDCtx, const ZSTD_DCtx* srcDCtx)
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Frame descriptor
 | 
			
		||||
/* Frame Header :
 | 
			
		||||
 | 
			
		||||
    // old
 | 
			
		||||
   1 byte - Alloc :
 | 
			
		||||
   bit 0-3 : windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN   (see zstd_internal.h)
 | 
			
		||||
   bit 4   : reserved for windowLog (must be zero)
 | 
			
		||||
   bit 5   : reserved (must be zero)
 | 
			
		||||
   bit 6-7 : Frame content size : unknown, 1 byte, 2 bytes, 8 bytes
 | 
			
		||||
 | 
			
		||||
   1 byte - checker :
 | 
			
		||||
   bit 0-1 : dictID (0, 1, 2 or 4 bytes)
 | 
			
		||||
   bit 2-7 : reserved (must be zero)
 | 
			
		||||
 | 
			
		||||
    // new
 | 
			
		||||
   1 byte - FrameHeaderDescription :
 | 
			
		||||
   bit 0-1 : dictID (0, 1, 2 or 4 bytes)
 | 
			
		||||
   bit 2   : checksumFlag
 | 
			
		||||
@@ -403,6 +393,26 @@ size_t ZSTD_getFrameParams(ZSTD_frameParams* fparamsPtr, const void* src, size_t
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** ZSTD_getDecompressedSize() :
 | 
			
		||||
*   compatible with legacy mode
 | 
			
		||||
*   @return : decompressed size if known, 0 otherwise
 | 
			
		||||
              note : 0 can mean any of the following :
 | 
			
		||||
                   - decompressed size is not provided within frame header
 | 
			
		||||
                   - frame header unknown / not supported
 | 
			
		||||
                   - frame header not completely provided (`srcSize` too small) */
 | 
			
		||||
unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize)
 | 
			
		||||
{
 | 
			
		||||
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT==1)
 | 
			
		||||
    if (ZSTD_isLegacy(src, srcSize)) return ZSTD_getDecompressedSize_legacy(src, srcSize);
 | 
			
		||||
#endif
 | 
			
		||||
    {   ZSTD_frameParams fparams;
 | 
			
		||||
        size_t const frResult = ZSTD_getFrameParams(&fparams, src, srcSize);
 | 
			
		||||
        if (frResult!=0) return 0;
 | 
			
		||||
        return fparams.frameContentSize;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** ZSTD_decodeFrameHeader() :
 | 
			
		||||
*   `srcSize` must be the size provided by ZSTD_frameHeaderSize().
 | 
			
		||||
*   @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */
 | 
			
		||||
@@ -454,16 +464,14 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
 | 
			
		||||
                          const void* src, size_t srcSize)   /* note : srcSize < BLOCKSIZE */
 | 
			
		||||
{
 | 
			
		||||
    const BYTE* const istart = (const BYTE*) src;
 | 
			
		||||
    litBlockType_t lbt;
 | 
			
		||||
 | 
			
		||||
    if (srcSize < MIN_CBLOCK_SIZE) return ERROR(corruption_detected);
 | 
			
		||||
    lbt = (litBlockType_t)(istart[0]>> 6);
 | 
			
		||||
 | 
			
		||||
    switch(lbt)
 | 
			
		||||
    switch((litBlockType_t)(istart[0]>> 6))
 | 
			
		||||
    {
 | 
			
		||||
    case lbt_huffman:
 | 
			
		||||
        {   size_t litSize, litCSize, singleStream=0;
 | 
			
		||||
            U32 lhSize = ((istart[0]) >> 4) & 3;
 | 
			
		||||
            U32 lhSize = (istart[0] >> 4) & 3;
 | 
			
		||||
            if (srcSize < 5) return ERROR(corruption_detected);   /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for lhSize, + cSize (+nbSeq) */
 | 
			
		||||
            switch(lhSize)
 | 
			
		||||
            {
 | 
			
		||||
@@ -643,7 +651,7 @@ size_t ZSTD_decodeSeqHeaders(int* nbSeqPtr,
 | 
			
		||||
 | 
			
		||||
    /* FSE table descriptors */
 | 
			
		||||
    {   U32 const LLtype  = *ip >> 6;
 | 
			
		||||
        U32 const Offtype = (*ip >> 4) & 3;
 | 
			
		||||
        U32 const OFtype = (*ip >> 4) & 3;
 | 
			
		||||
        U32 const MLtype  = (*ip >> 2) & 3;
 | 
			
		||||
        ip++;
 | 
			
		||||
 | 
			
		||||
@@ -651,17 +659,17 @@ size_t ZSTD_decodeSeqHeaders(int* nbSeqPtr,
 | 
			
		||||
        if (ip > iend-3) return ERROR(srcSize_wrong); /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
 | 
			
		||||
 | 
			
		||||
        /* Build DTables */
 | 
			
		||||
        {   size_t const bhSize = ZSTD_buildSeqTable(DTableLL, LLtype, MaxLL, LLFSELog, ip, iend-ip, LL_defaultNorm, LL_defaultNormLog, flagRepeatTable);
 | 
			
		||||
            if (ZSTD_isError(bhSize)) return ERROR(corruption_detected);
 | 
			
		||||
            ip += bhSize;
 | 
			
		||||
        {   size_t const llhSize = ZSTD_buildSeqTable(DTableLL, LLtype, MaxLL, LLFSELog, ip, iend-ip, LL_defaultNorm, LL_defaultNormLog, flagRepeatTable);
 | 
			
		||||
            if (ZSTD_isError(llhSize)) return ERROR(corruption_detected);
 | 
			
		||||
            ip += llhSize;
 | 
			
		||||
        }
 | 
			
		||||
        {   size_t const bhSize = ZSTD_buildSeqTable(DTableOffb, Offtype, MaxOff, OffFSELog, ip, iend-ip, OF_defaultNorm, OF_defaultNormLog, flagRepeatTable);
 | 
			
		||||
            if (ZSTD_isError(bhSize)) return ERROR(corruption_detected);
 | 
			
		||||
            ip += bhSize;
 | 
			
		||||
        {   size_t const ofhSize = ZSTD_buildSeqTable(DTableOffb, OFtype, MaxOff, OffFSELog, ip, iend-ip, OF_defaultNorm, OF_defaultNormLog, flagRepeatTable);
 | 
			
		||||
            if (ZSTD_isError(ofhSize)) return ERROR(corruption_detected);
 | 
			
		||||
            ip += ofhSize;
 | 
			
		||||
        }
 | 
			
		||||
        {   size_t const bhSize = ZSTD_buildSeqTable(DTableML, MLtype, MaxML, MLFSELog, ip, iend-ip, ML_defaultNorm, ML_defaultNormLog, flagRepeatTable);
 | 
			
		||||
            if (ZSTD_isError(bhSize)) return ERROR(corruption_detected);
 | 
			
		||||
            ip += bhSize;
 | 
			
		||||
        {   size_t const mlhSize = ZSTD_buildSeqTable(DTableML, MLtype, MaxML, MLFSELog, ip, iend-ip, ML_defaultNorm, ML_defaultNormLog, flagRepeatTable);
 | 
			
		||||
            if (ZSTD_isError(mlhSize)) return ERROR(corruption_detected);
 | 
			
		||||
            ip += mlhSize;
 | 
			
		||||
    }   }
 | 
			
		||||
 | 
			
		||||
    return ip-istart;
 | 
			
		||||
@@ -702,42 +710,37 @@ static seq_t ZSTD_decodeSequence(seqState_t* seqState)
 | 
			
		||||
                            0x2000, 0x4000, 0x8000, 0x10000 };
 | 
			
		||||
 | 
			
		||||
    static const U32 ML_base[MaxML+1] = {
 | 
			
		||||
                             0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10,   11,    12,    13,    14,    15,
 | 
			
		||||
                            16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,   27,    28,    29,    30,    31,
 | 
			
		||||
                            32, 34, 36, 38, 40, 44, 48, 56, 64, 80, 96, 0x80, 0x100, 0x200, 0x400, 0x800,
 | 
			
		||||
                            0x1000, 0x2000, 0x4000, 0x8000, 0x10000 };
 | 
			
		||||
                             3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,   14,    15,    16,    17,    18,
 | 
			
		||||
                            19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,   30,    31,    32,    33,    34,
 | 
			
		||||
                            35, 37, 39, 41, 43, 47, 51, 59, 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803,
 | 
			
		||||
                            0x1003, 0x2003, 0x4003, 0x8003, 0x10003 };
 | 
			
		||||
 | 
			
		||||
    static const U32 OF_base[MaxOff+1] = {
 | 
			
		||||
                 0,        1,       3,       7,     0xF,     0x1F,     0x3F,     0x7F,
 | 
			
		||||
                 0xFF,   0x1FF,   0x3FF,   0x7FF,   0xFFF,   0x1FFF,   0x3FFF,   0x7FFF,
 | 
			
		||||
                 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF,
 | 
			
		||||
                 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, /*fake*/ 1, 1 };
 | 
			
		||||
                 0,        1,       1,       5,     0xD,     0x1D,     0x3D,     0x7D,
 | 
			
		||||
                 0xFD,   0x1FD,   0x3FD,   0x7FD,   0xFFD,   0x1FFD,   0x3FFD,   0x7FFD,
 | 
			
		||||
                 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD,
 | 
			
		||||
                 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD };
 | 
			
		||||
 | 
			
		||||
    /* sequence */
 | 
			
		||||
    {   size_t offset;
 | 
			
		||||
        if (!ofCode)
 | 
			
		||||
            offset = 0;
 | 
			
		||||
        else {
 | 
			
		||||
            offset = OF_base[ofCode] + BIT_readBits(&(seqState->DStream), ofBits);   /* <=  26 bits */
 | 
			
		||||
            offset = OF_base[ofCode] + BIT_readBits(&(seqState->DStream), ofBits);   /* <=  (ZSTD_WINDOWLOG_MAX-1) bits */
 | 
			
		||||
            if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (offset < ZSTD_REP_NUM) {
 | 
			
		||||
            if (llCode == 0 && offset <= 1) offset = 1-offset;
 | 
			
		||||
 | 
			
		||||
            if (offset != 0) {
 | 
			
		||||
                size_t temp = seqState->prevOffset[offset];
 | 
			
		||||
                if (offset != 1) {
 | 
			
		||||
                    seqState->prevOffset[2] = seqState->prevOffset[1];
 | 
			
		||||
                }
 | 
			
		||||
        if (ofCode <= 1) {
 | 
			
		||||
            if ((llCode == 0) & (offset <= 1)) offset = 1-offset;
 | 
			
		||||
            if (offset) {
 | 
			
		||||
                size_t const temp = seqState->prevOffset[offset];
 | 
			
		||||
                if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
 | 
			
		||||
                seqState->prevOffset[1] = seqState->prevOffset[0];
 | 
			
		||||
                seqState->prevOffset[0] = offset = temp;
 | 
			
		||||
 | 
			
		||||
            } else {
 | 
			
		||||
                offset = seqState->prevOffset[0];
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            offset -= ZSTD_REP_MOVE;
 | 
			
		||||
            seqState->prevOffset[2] = seqState->prevOffset[1];
 | 
			
		||||
            seqState->prevOffset[1] = seqState->prevOffset[0];
 | 
			
		||||
            seqState->prevOffset[0] = offset;
 | 
			
		||||
@@ -745,11 +748,11 @@ static seq_t ZSTD_decodeSequence(seqState_t* seqState)
 | 
			
		||||
        seq.offset = offset;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    seq.matchLength = ML_base[mlCode] + MINMATCH + ((mlCode>31) ? BIT_readBits(&(seqState->DStream), mlBits) : 0);   /* <=  16 bits */
 | 
			
		||||
    seq.matchLength = ML_base[mlCode] + ((mlCode>31) ? BIT_readBits(&(seqState->DStream), mlBits) : 0);   /* <=  16 bits */
 | 
			
		||||
    if (MEM_32bits() && (mlBits+llBits>24)) BIT_reloadDStream(&(seqState->DStream));
 | 
			
		||||
 | 
			
		||||
    seq.litLength = LL_base[llCode] + ((llCode>15) ? BIT_readBits(&(seqState->DStream), llBits) : 0);   /* <=  16 bits */
 | 
			
		||||
    if (MEM_32bits() |
 | 
			
		||||
    if (MEM_32bits() ||
 | 
			
		||||
       (totalBits > 64 - 7 - (LLFSELog+MLFSELog+OffFSELog)) ) BIT_reloadDStream(&(seqState->DStream));
 | 
			
		||||
 | 
			
		||||
    /* ANS state update */
 | 
			
		||||
@@ -930,12 +933,25 @@ size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx,
 | 
			
		||||
                            void* dst, size_t dstCapacity,
 | 
			
		||||
                      const void* src, size_t srcSize)
 | 
			
		||||
{
 | 
			
		||||
    size_t dSize;
 | 
			
		||||
    ZSTD_checkContinuity(dctx, dst);
 | 
			
		||||
    return ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize);
 | 
			
		||||
    dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize);
 | 
			
		||||
    dctx->previousDstEnd = (char*)dst + dSize;
 | 
			
		||||
    return dSize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
size_t ZSTD_generateNxByte(void* dst, size_t dstCapacity, BYTE byte, size_t length)
 | 
			
		||||
/** ZSTD_insertBlock() :
 | 
			
		||||
    insert `src` block into `dctx` history. Useful to track uncompressed blocks. */
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize)
 | 
			
		||||
{
 | 
			
		||||
    ZSTD_checkContinuity(dctx, blockStart);
 | 
			
		||||
    dctx->previousDstEnd = (const char*)blockStart + blockSize;
 | 
			
		||||
    return blockSize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
size_t ZSTD_generateNxBytes(void* dst, size_t dstCapacity, BYTE byte, size_t length)
 | 
			
		||||
{
 | 
			
		||||
    if (length > dstCapacity) return ERROR(dstSize_tooSmall);
 | 
			
		||||
    memset(dst, byte, length);
 | 
			
		||||
@@ -987,7 +1003,7 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
 | 
			
		||||
            decodedSize = ZSTD_copyRawBlock(op, oend-op, ip, cBlockSize);
 | 
			
		||||
            break;
 | 
			
		||||
        case bt_rle :
 | 
			
		||||
            decodedSize = ZSTD_generateNxByte(op, oend-op, *ip, blockProperties.origSize);
 | 
			
		||||
            decodedSize = ZSTD_generateNxBytes(op, oend-op, *ip, blockProperties.origSize);
 | 
			
		||||
            break;
 | 
			
		||||
        case bt_end :
 | 
			
		||||
            /* end of frame */
 | 
			
		||||
@@ -997,7 +1013,7 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
 | 
			
		||||
        default:
 | 
			
		||||
            return ERROR(GENERIC);   /* impossible */
 | 
			
		||||
        }
 | 
			
		||||
        if (cBlockSize == 0) break;   /* bt_end */
 | 
			
		||||
        if (blockProperties.blockType == bt_end) break;   /* bt_end */
 | 
			
		||||
 | 
			
		||||
        if (ZSTD_isError(decodedSize)) return decodedSize;
 | 
			
		||||
        if (dctx->fParams.checksumFlag) XXH64_update(&dctx->xxhState, op, decodedSize);
 | 
			
		||||
@@ -1031,10 +1047,7 @@ size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx,
 | 
			
		||||
                                 const void* dict, size_t dictSize)
 | 
			
		||||
{
 | 
			
		||||
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT==1)
 | 
			
		||||
    {   U32 const magicNumber = MEM_readLE32(src);
 | 
			
		||||
        if (ZSTD_isLegacy(magicNumber))
 | 
			
		||||
            return ZSTD_decompressLegacy(dst, dstCapacity, src, srcSize, dict, dictSize, magicNumber);
 | 
			
		||||
    }
 | 
			
		||||
    if (ZSTD_isLegacy(src, srcSize)) return ZSTD_decompressLegacy(dst, dstCapacity, src, srcSize, dict, dictSize);
 | 
			
		||||
#endif
 | 
			
		||||
    ZSTD_decompressBegin_usingDict(dctx, dict, dictSize);
 | 
			
		||||
    ZSTD_checkContinuity(dctx, dst);
 | 
			
		||||
@@ -1273,8 +1286,8 @@ size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct ZSTD_DDict_s {
 | 
			
		||||
    void* dictContent;
 | 
			
		||||
    size_t dictContentSize;
 | 
			
		||||
    void* dict;
 | 
			
		||||
    size_t dictSize;
 | 
			
		||||
    ZSTD_DCtx* refContext;
 | 
			
		||||
};  /* typedef'd tp ZSTD_CDict within zstd.h */
 | 
			
		||||
 | 
			
		||||
@@ -1306,8 +1319,8 @@ ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictSize, ZSTD_cu
 | 
			
		||||
                return NULL;
 | 
			
		||||
        }   }
 | 
			
		||||
 | 
			
		||||
        ddict->dictContent = dictContent;
 | 
			
		||||
        ddict->dictContentSize = dictSize;
 | 
			
		||||
        ddict->dict = dictContent;
 | 
			
		||||
        ddict->dictSize = dictSize;
 | 
			
		||||
        ddict->refContext = dctx;
 | 
			
		||||
        return ddict;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1327,7 +1340,7 @@ size_t ZSTD_freeDDict(ZSTD_DDict* ddict)
 | 
			
		||||
    ZSTD_freeFunction const cFree = ddict->refContext->customMem.customFree;
 | 
			
		||||
    void* const opaque = ddict->refContext->customMem.opaque;
 | 
			
		||||
    ZSTD_freeDCtx(ddict->refContext);
 | 
			
		||||
    cFree(opaque, ddict->dictContent);
 | 
			
		||||
    cFree(opaque, ddict->dict);
 | 
			
		||||
    cFree(opaque, ddict);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1340,6 +1353,9 @@ ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx,
 | 
			
		||||
                                     const void* src, size_t srcSize,
 | 
			
		||||
                                     const ZSTD_DDict* ddict)
 | 
			
		||||
{
 | 
			
		||||
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT==1)
 | 
			
		||||
    if (ZSTD_isLegacy(src, srcSize)) return ZSTD_decompressLegacy(dst, dstCapacity, src, srcSize, ddict->dict, ddict->dictSize);
 | 
			
		||||
#endif
 | 
			
		||||
    return ZSTD_decompress_usingPreparedDCtx(dctx, ddict->refContext,
 | 
			
		||||
                                           dst, dstCapacity,
 | 
			
		||||
                                           src, srcSize);
 | 
			
		||||
 
 | 
			
		||||
@@ -31,14 +31,15 @@
 | 
			
		||||
    - Zstd homepage : https://www.zstd.net
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*-**************************************
 | 
			
		||||
*  Tuning parameters
 | 
			
		||||
****************************************/
 | 
			
		||||
#define ZDICT_MAX_SAMPLES_SIZE (2000U << 20)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-**************************************
 | 
			
		||||
*  Compiler Options
 | 
			
		||||
****************************************/
 | 
			
		||||
/* Disable some Visual warning messages */
 | 
			
		||||
#ifdef _MSC_VER
 | 
			
		||||
#  pragma warning(disable : 4127)                /* disable: C4127: conditional expression is constant */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Unix Large Files support (>4GB) */
 | 
			
		||||
#define _FILE_OFFSET_BITS 64
 | 
			
		||||
#if (defined(__sun__) && (!defined(__LP64__)))   /* Sun Solaris 32-bits requires specific definitions */
 | 
			
		||||
@@ -58,13 +59,15 @@
 | 
			
		||||
 | 
			
		||||
#include "mem.h"           /* read */
 | 
			
		||||
#include "error_private.h"
 | 
			
		||||
#include "fse.h"
 | 
			
		||||
#include "fse.h"           /* FSE_normalizeCount, FSE_writeNCount */
 | 
			
		||||
#define HUF_STATIC_LINKING_ONLY
 | 
			
		||||
#include "huf.h"
 | 
			
		||||
#include "zstd_internal.h" /* includes zstd.h */
 | 
			
		||||
#include "xxhash.h"
 | 
			
		||||
#include "divsufsort.h"
 | 
			
		||||
#define ZDICT_STATIC_LINKING_ONLY
 | 
			
		||||
#ifndef ZDICT_STATIC_LINKING_ONLY
 | 
			
		||||
#  define ZDICT_STATIC_LINKING_ONLY
 | 
			
		||||
#endif
 | 
			
		||||
#include "zdict.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -91,17 +94,19 @@ static const size_t g_min_fast_dictContent = 192;
 | 
			
		||||
/*-*************************************
 | 
			
		||||
*  Console display
 | 
			
		||||
***************************************/
 | 
			
		||||
#define DISPLAY(...)         fprintf(stderr, __VA_ARGS__)
 | 
			
		||||
#define DISPLAY(...)         { fprintf(stderr, __VA_ARGS__); fflush( stderr ); }
 | 
			
		||||
#define DISPLAYLEVEL(l, ...) if (g_displayLevel>=l) { DISPLAY(__VA_ARGS__); }
 | 
			
		||||
static unsigned g_displayLevel = 0;   /* 0 : no display;   1: errors;   2: default;  4: full information */
 | 
			
		||||
 | 
			
		||||
#define DISPLAYUPDATE(l, ...) if (g_displayLevel>=l) { \
 | 
			
		||||
            if (ZDICT_GetMilliSpan(g_time) > refreshRate)  \
 | 
			
		||||
            if (ZDICT_clockSpan(g_time) > refreshRate)  \
 | 
			
		||||
            { g_time = clock(); DISPLAY(__VA_ARGS__); \
 | 
			
		||||
            if (g_displayLevel>=4) fflush(stdout); } }
 | 
			
		||||
static const unsigned refreshRate = 300;
 | 
			
		||||
static const clock_t refreshRate = CLOCKS_PER_SEC * 3 / 10;
 | 
			
		||||
static clock_t g_time = 0;
 | 
			
		||||
 | 
			
		||||
static clock_t ZDICT_clockSpan(clock_t nPrevious) { return clock() - nPrevious; }
 | 
			
		||||
 | 
			
		||||
static void ZDICT_printHex(U32 dlevel, const void* ptr, size_t length)
 | 
			
		||||
{
 | 
			
		||||
    const BYTE* const b = (const BYTE*)ptr;
 | 
			
		||||
@@ -117,13 +122,6 @@ static void ZDICT_printHex(U32 dlevel, const void* ptr, size_t length)
 | 
			
		||||
/*-********************************************************
 | 
			
		||||
*  Helper functions
 | 
			
		||||
**********************************************************/
 | 
			
		||||
static unsigned ZDICT_GetMilliSpan(clock_t nPrevious)
 | 
			
		||||
{
 | 
			
		||||
    clock_t nCurrent = clock();
 | 
			
		||||
    unsigned nSpan = (unsigned)(((nCurrent - nPrevious) * 1000) / CLOCKS_PER_SEC);
 | 
			
		||||
    return nSpan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned ZDICT_isError(size_t errorCode) { return ERR_isError(errorCode); }
 | 
			
		||||
 | 
			
		||||
const char* ZDICT_getErrorName(size_t errorCode) { return ERR_getErrorName(errorCode); }
 | 
			
		||||
@@ -286,7 +284,7 @@ static dictItem ZDICT_analyzePos(
 | 
			
		||||
        U32 refinedEnd = end;
 | 
			
		||||
 | 
			
		||||
        DISPLAYLEVEL(4, "\n");
 | 
			
		||||
        DISPLAYLEVEL(4, "found %3u matches of length >= %u at pos %7u  ", (U32)(end-start), MINMATCHLENGTH, (U32)pos);
 | 
			
		||||
        DISPLAYLEVEL(4, "found %3u matches of length >= %i at pos %7u  ", (U32)(end-start), MINMATCHLENGTH, (U32)pos);
 | 
			
		||||
        DISPLAYLEVEL(4, "\n");
 | 
			
		||||
 | 
			
		||||
        for (searchLength = MINMATCHLENGTH ; ; searchLength++) {
 | 
			
		||||
@@ -489,7 +487,7 @@ static U32 ZDICT_dictSize(const dictItem* dictList)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static size_t ZDICT_trainBuffer(dictItem* dictList, U32 dictListSize,
 | 
			
		||||
                            const void* const buffer, const size_t bufferSize,   /* buffer must end with noisy guard band */
 | 
			
		||||
                            const void* const buffer, size_t bufferSize,   /* buffer must end with noisy guard band */
 | 
			
		||||
                            const size_t* fileSizes, unsigned nbFiles,
 | 
			
		||||
                            U32 shiftRatio, unsigned maxDictSize)
 | 
			
		||||
{
 | 
			
		||||
@@ -499,7 +497,6 @@ static size_t ZDICT_trainBuffer(dictItem* dictList, U32 dictListSize,
 | 
			
		||||
    BYTE* doneMarks = (BYTE*)malloc((bufferSize+16)*sizeof(*doneMarks));   /* +16 for overflow security */
 | 
			
		||||
    U32* filePos = (U32*)malloc(nbFiles * sizeof(*filePos));
 | 
			
		||||
    U32 minRatio = nbFiles >> shiftRatio;
 | 
			
		||||
    int divSuftSortResult;
 | 
			
		||||
    size_t result = 0;
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
@@ -511,15 +508,19 @@ static size_t ZDICT_trainBuffer(dictItem* dictList, U32 dictListSize,
 | 
			
		||||
    if (minRatio < MINRATIO) minRatio = MINRATIO;
 | 
			
		||||
    memset(doneMarks, 0, bufferSize+16);
 | 
			
		||||
 | 
			
		||||
    /* limit sample set size (divsufsort limitation)*/
 | 
			
		||||
    if (bufferSize > ZDICT_MAX_SAMPLES_SIZE) DISPLAYLEVEL(3, "sample set too large : reduced to %u MB ...\n", (U32)(ZDICT_MAX_SAMPLES_SIZE>>20));
 | 
			
		||||
    while (bufferSize > ZDICT_MAX_SAMPLES_SIZE) bufferSize -= fileSizes[--nbFiles];
 | 
			
		||||
 | 
			
		||||
    /* sort */
 | 
			
		||||
    DISPLAYLEVEL(2, "sorting %u files of total size %u MB ...\n", nbFiles, (U32)(bufferSize>>20));
 | 
			
		||||
    divSuftSortResult = divsufsort((const unsigned char*)buffer, suffix, (int)bufferSize, 0);
 | 
			
		||||
    if (divSuftSortResult != 0) { result = ERROR(GENERIC); goto _cleanup; }
 | 
			
		||||
    {   int const divSuftSortResult = divsufsort((const unsigned char*)buffer, suffix, (int)bufferSize, 0);
 | 
			
		||||
        if (divSuftSortResult != 0) { result = ERROR(GENERIC); goto _cleanup; }
 | 
			
		||||
    }
 | 
			
		||||
    suffix[bufferSize] = (int)bufferSize;   /* leads into noise */
 | 
			
		||||
    suffix0[0] = (int)bufferSize;           /* leads into noise */
 | 
			
		||||
    {
 | 
			
		||||
        /* build reverse suffix sort */
 | 
			
		||||
        size_t pos;
 | 
			
		||||
    /* build reverse suffix sort */
 | 
			
		||||
    {   size_t pos;
 | 
			
		||||
        for (pos=0; pos < bufferSize; pos++)
 | 
			
		||||
            reverseSuffix[suffix[pos]] = (U32)pos;
 | 
			
		||||
        /* build file pos */
 | 
			
		||||
@@ -580,14 +581,17 @@ typedef struct
 | 
			
		||||
 | 
			
		||||
#define MAXREPOFFSET 1024
 | 
			
		||||
 | 
			
		||||
static void ZDICT_countEStats(EStats_ress_t esr,
 | 
			
		||||
static void ZDICT_countEStats(EStats_ress_t esr, ZSTD_parameters params,
 | 
			
		||||
                            U32* countLit, U32* offsetcodeCount, U32* matchlengthCount, U32* litlengthCount, U32* repOffsets,
 | 
			
		||||
                            const void* src, size_t srcSize)
 | 
			
		||||
{
 | 
			
		||||
    size_t const blockSizeMax = MIN (ZSTD_BLOCKSIZE_MAX, 1 << params.cParams.windowLog);
 | 
			
		||||
    size_t cSize;
 | 
			
		||||
 | 
			
		||||
    if (srcSize > ZSTD_BLOCKSIZE_MAX) srcSize = ZSTD_BLOCKSIZE_MAX;   /* protection vs large samples */
 | 
			
		||||
    ZSTD_copyCCtx(esr.zc, esr.ref);
 | 
			
		||||
    if (srcSize > blockSizeMax) srcSize = blockSizeMax;   /* protection vs large samples */
 | 
			
		||||
	{	size_t const errorCode = ZSTD_copyCCtx(esr.zc, esr.ref);
 | 
			
		||||
		if (ZSTD_isError(errorCode)) { DISPLAYLEVEL(1, "warning : ZSTD_copyCCtx failed \n"); return; }
 | 
			
		||||
	}
 | 
			
		||||
    cSize = ZSTD_compressBlock(esr.zc, esr.workPlace, ZSTD_BLOCKSIZE_MAX, src, srcSize);
 | 
			
		||||
    if (ZSTD_isError(cSize)) { DISPLAYLEVEL(1, "warning : could not compress sample size %u \n", (U32)srcSize); return; }
 | 
			
		||||
 | 
			
		||||
@@ -685,7 +689,7 @@ static size_t ZDICT_analyzeEntropy(void*  dstBuffer, size_t maxDstSize,
 | 
			
		||||
    offsetCount_t bestRepOffset[ZSTD_REP_NUM+1];
 | 
			
		||||
    EStats_ress_t esr;
 | 
			
		||||
    ZSTD_parameters params;
 | 
			
		||||
    U32 u, huffLog = 12, Offlog = OffFSELog, mlLog = MLFSELog, llLog = LLFSELog, total;
 | 
			
		||||
    U32 u, huffLog = 11, Offlog = OffFSELog, mlLog = MLFSELog, llLog = LLFSELog, total;
 | 
			
		||||
    size_t pos = 0, errorCode;
 | 
			
		||||
    size_t eSize = 0;
 | 
			
		||||
    size_t const totalSrcSize = ZDICT_totalSampleSize(fileSizes, nbFiles);
 | 
			
		||||
@@ -708,14 +712,17 @@ static size_t ZDICT_analyzeEntropy(void*  dstBuffer, size_t maxDstSize,
 | 
			
		||||
            goto _cleanup;
 | 
			
		||||
    }
 | 
			
		||||
    if (compressionLevel==0) compressionLevel=g_compressionLevel_default;
 | 
			
		||||
    params.cParams = ZSTD_getCParams(compressionLevel, averageSampleSize, dictBufferSize);
 | 
			
		||||
    params.cParams.strategy = ZSTD_greedy;
 | 
			
		||||
    params.fParams.contentSizeFlag = 0;
 | 
			
		||||
    ZSTD_compressBegin_advanced(esr.ref, dictBuffer, dictBufferSize, params, 0);
 | 
			
		||||
    params = ZSTD_getParams(compressionLevel, averageSampleSize, dictBufferSize);
 | 
			
		||||
	{	size_t const beginResult = ZSTD_compressBegin_advanced(esr.ref, dictBuffer, dictBufferSize, params, 0);
 | 
			
		||||
		if (ZSTD_isError(beginResult)) {
 | 
			
		||||
			eSize = ERROR(GENERIC);
 | 
			
		||||
			DISPLAYLEVEL(1, "error : ZSTD_compressBegin_advanced failed ");
 | 
			
		||||
			goto _cleanup;
 | 
			
		||||
	}	}
 | 
			
		||||
 | 
			
		||||
    /* collect stats on all files */
 | 
			
		||||
    for (u=0; u<nbFiles; u++) {
 | 
			
		||||
        ZDICT_countEStats(esr,
 | 
			
		||||
        ZDICT_countEStats(esr, params,
 | 
			
		||||
                        countLit, offcodeCount, matchLengthCount, litLengthCount, repOffset,
 | 
			
		||||
           (const char*)srcBuffer + pos, fileSizes[u]);
 | 
			
		||||
        pos += fileSizes[u];
 | 
			
		||||
@@ -887,7 +894,8 @@ size_t ZDICT_addEntropyTablesFromBuffer_advanced(void* dictBuffer, size_t dictCo
 | 
			
		||||
    /* dictionary header */
 | 
			
		||||
    MEM_writeLE32(dictBuffer, ZSTD_DICT_MAGIC);
 | 
			
		||||
    {   U64 const randomID = XXH64((char*)dictBuffer + dictBufferCapacity - dictContentSize, dictContentSize, 0);
 | 
			
		||||
        U32 const dictID = params.dictID ? params.dictID : (U32)(randomID>>11);
 | 
			
		||||
        U32 const compliantID = (randomID % ((1U<<31)-32768)) + 32768;
 | 
			
		||||
        U32 const dictID = params.dictID ? params.dictID : compliantID;
 | 
			
		||||
        MEM_writeLE32((char*)dictBuffer+4, dictID);
 | 
			
		||||
    }
 | 
			
		||||
    hSize = 8;
 | 
			
		||||
@@ -905,6 +913,7 @@ size_t ZDICT_addEntropyTablesFromBuffer_advanced(void* dictBuffer, size_t dictCo
 | 
			
		||||
    return MIN(dictBufferCapacity, hSize+dictContentSize);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define DIB_MINSAMPLESSIZE (DIB_FASTSEGMENTSIZE*3)
 | 
			
		||||
/*! ZDICT_trainFromBuffer_unsafe() :
 | 
			
		||||
*   `samplesBuffer` must be followed by noisy guard band.
 | 
			
		||||
@@ -923,12 +932,12 @@ size_t ZDICT_trainFromBuffer_unsafe(
 | 
			
		||||
    size_t dictSize = 0;
 | 
			
		||||
 | 
			
		||||
    /* checks */
 | 
			
		||||
    if (maxDictSize <= g_provision_entropySize + g_min_fast_dictContent) return ERROR(dstSize_tooSmall);
 | 
			
		||||
    if (!dictList) return ERROR(memory_allocation);
 | 
			
		||||
    if (maxDictSize <= g_provision_entropySize + g_min_fast_dictContent) { free(dictList); return ERROR(dstSize_tooSmall); }
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    { unsigned u; for (u=0, sBuffSize=0; u<nbSamples; u++) sBuffSize += samplesSizes[u]; }
 | 
			
		||||
    if (sBuffSize < DIB_MINSAMPLESSIZE) return 0;   /* not enough source to create dictionary */
 | 
			
		||||
    if (sBuffSize < DIB_MINSAMPLESSIZE) { free(dictList); return 0; }   /* not enough source to create dictionary */
 | 
			
		||||
    ZDICT_initDictItem(dictList);
 | 
			
		||||
    g_displayLevel = params.notificationLevel;
 | 
			
		||||
    if (selectivity==0) selectivity = g_selectivity_default;
 | 
			
		||||
@@ -966,7 +975,7 @@ size_t ZDICT_trainFromBuffer_unsafe(
 | 
			
		||||
            for (u=1; u<dictList->pos; u++) {
 | 
			
		||||
                U32 l = dictList[u].length;
 | 
			
		||||
                ptr -= l;
 | 
			
		||||
                if (ptr<(BYTE*)dictBuffer) return ERROR(GENERIC);   /* should not happen */
 | 
			
		||||
                if (ptr<(BYTE*)dictBuffer) { free(dictList); return ERROR(GENERIC); }   /* should not happen */
 | 
			
		||||
                memcpy(ptr, (const char*)samplesBuffer+dictList[u].pos, l);
 | 
			
		||||
        }   }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -84,10 +84,6 @@ const char* ZDICT_getErrorName(size_t errorCode);
 | 
			
		||||
 * Use them only in association with static linking.
 | 
			
		||||
 * ==================================================================================== */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-*************************************
 | 
			
		||||
*  Public type
 | 
			
		||||
***************************************/
 | 
			
		||||
typedef struct {
 | 
			
		||||
    unsigned selectivityLevel;   /* 0 means default; larger => bigger selection => larger dictionary */
 | 
			
		||||
    unsigned compressionLevel;   /* 0 means default; target a specific zstd compression level */
 | 
			
		||||
@@ -97,9 +93,6 @@ typedef struct {
 | 
			
		||||
} ZDICT_params_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-*************************************
 | 
			
		||||
*  Public functions
 | 
			
		||||
***************************************/
 | 
			
		||||
/*! ZDICT_trainFromBuffer_advanced() :
 | 
			
		||||
    Same as ZDICT_trainFromBuffer() with control over more parameters.
 | 
			
		||||
    `parameters` is optional and can be provided with values set to 0 to mean "default".
 | 
			
		||||
@@ -117,4 +110,4 @@ size_t ZDICT_trainFromBuffer_advanced(void* dictBuffer, size_t dictBufferCapacit
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
#endif   /* DICTBUILDER_H_001 */
 | 
			
		||||
 
 | 
			
		||||
@@ -54,8 +54,11 @@ extern "C" {
 | 
			
		||||
    @return : > 0 if supported by legacy decoder. 0 otherwise.
 | 
			
		||||
              return value is the version.
 | 
			
		||||
*/
 | 
			
		||||
MEM_STATIC unsigned ZSTD_isLegacy (U32 magicNumberLE)
 | 
			
		||||
MEM_STATIC unsigned ZSTD_isLegacy(const void* src, size_t srcSize)
 | 
			
		||||
{
 | 
			
		||||
    U32 magicNumberLE;
 | 
			
		||||
    if (srcSize<4) return 0;
 | 
			
		||||
    magicNumberLE = MEM_readLE32(src);
 | 
			
		||||
    switch(magicNumberLE)
 | 
			
		||||
    {
 | 
			
		||||
        case ZSTDv01_magicNumberLE:return 1;
 | 
			
		||||
@@ -69,23 +72,45 @@ MEM_STATIC unsigned ZSTD_isLegacy (U32 magicNumberLE)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
MEM_STATIC unsigned long long ZSTD_getDecompressedSize_legacy(const void* src, size_t srcSize)
 | 
			
		||||
{
 | 
			
		||||
    if (srcSize < 4) return 0;
 | 
			
		||||
 | 
			
		||||
    {   U32 const version = ZSTD_isLegacy(src, srcSize);
 | 
			
		||||
        if (version < 5) return 0;  /* no decompressed size in frame header, or not a legacy format */
 | 
			
		||||
        if (version==5) {
 | 
			
		||||
            ZSTDv05_parameters fParams;
 | 
			
		||||
            size_t const frResult = ZSTDv05_getFrameParams(&fParams, src, srcSize);
 | 
			
		||||
            if (frResult != 0) return 0;
 | 
			
		||||
            return fParams.srcSize;
 | 
			
		||||
        }
 | 
			
		||||
        if (version==6) {
 | 
			
		||||
            ZSTDv06_frameParams fParams;
 | 
			
		||||
            size_t const frResult = ZSTDv06_getFrameParams(&fParams, src, srcSize);
 | 
			
		||||
            if (frResult != 0) return 0;
 | 
			
		||||
            return fParams.frameContentSize;
 | 
			
		||||
        }
 | 
			
		||||
        return 0;   /* should not be possible */
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MEM_STATIC size_t ZSTD_decompressLegacy(
 | 
			
		||||
                     void* dst, size_t dstCapacity,
 | 
			
		||||
               const void* src, size_t compressedSize,
 | 
			
		||||
               const void* dict,size_t dictSize,
 | 
			
		||||
                     U32 magicNumberLE)
 | 
			
		||||
               const void* dict,size_t dictSize)
 | 
			
		||||
{
 | 
			
		||||
    switch(magicNumberLE)
 | 
			
		||||
    U32 const version = ZSTD_isLegacy(src, compressedSize);
 | 
			
		||||
    switch(version)
 | 
			
		||||
    {
 | 
			
		||||
        case ZSTDv01_magicNumberLE :
 | 
			
		||||
        case 1 :
 | 
			
		||||
            return ZSTDv01_decompress(dst, dstCapacity, src, compressedSize);
 | 
			
		||||
        case ZSTDv02_magicNumber :
 | 
			
		||||
        case 2 :
 | 
			
		||||
            return ZSTDv02_decompress(dst, dstCapacity, src, compressedSize);
 | 
			
		||||
        case ZSTDv03_magicNumber :
 | 
			
		||||
        case 3 :
 | 
			
		||||
            return ZSTDv03_decompress(dst, dstCapacity, src, compressedSize);
 | 
			
		||||
        case ZSTDv04_magicNumber :
 | 
			
		||||
        case 4 :
 | 
			
		||||
            return ZSTDv04_decompress(dst, dstCapacity, src, compressedSize);
 | 
			
		||||
        case ZSTDv05_MAGICNUMBER :
 | 
			
		||||
        case 5 :
 | 
			
		||||
            {   size_t result;
 | 
			
		||||
                ZSTDv05_DCtx* const zd = ZSTDv05_createDCtx();
 | 
			
		||||
                if (zd==NULL) return ERROR(memory_allocation);
 | 
			
		||||
@@ -93,7 +118,7 @@ MEM_STATIC size_t ZSTD_decompressLegacy(
 | 
			
		||||
                ZSTDv05_freeDCtx(zd);
 | 
			
		||||
                return result;
 | 
			
		||||
            }
 | 
			
		||||
        case ZSTDv06_MAGICNUMBER :
 | 
			
		||||
        case 6 :
 | 
			
		||||
            {   size_t result;
 | 
			
		||||
                ZSTDv06_DCtx* const zd = ZSTDv06_createDCtx();
 | 
			
		||||
                if (zd==NULL) return ERROR(memory_allocation);
 | 
			
		||||
 
 | 
			
		||||
@@ -3620,36 +3620,26 @@ static size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSi
 | 
			
		||||
    switch (ctx->stage)
 | 
			
		||||
    {
 | 
			
		||||
    case ZSTDds_getFrameHeaderSize :
 | 
			
		||||
        {
 | 
			
		||||
            /* get frame header size */
 | 
			
		||||
            if (srcSize != ZSTD_frameHeaderSize_min) return ERROR(srcSize_wrong);   /* impossible */
 | 
			
		||||
            ctx->headerSize = ZSTD_decodeFrameHeader_Part1(ctx, src, ZSTD_frameHeaderSize_min);
 | 
			
		||||
            if (ZSTD_isError(ctx->headerSize)) return ctx->headerSize;
 | 
			
		||||
            memcpy(ctx->headerBuffer, src, ZSTD_frameHeaderSize_min);
 | 
			
		||||
            if (ctx->headerSize > ZSTD_frameHeaderSize_min)
 | 
			
		||||
            {
 | 
			
		||||
                ctx->expected = ctx->headerSize - ZSTD_frameHeaderSize_min;
 | 
			
		||||
                ctx->stage = ZSTDds_decodeFrameHeader;
 | 
			
		||||
                return 0;
 | 
			
		||||
            }
 | 
			
		||||
            ctx->expected = 0;   /* not necessary to copy more */
 | 
			
		||||
        }
 | 
			
		||||
        /* get frame header size */
 | 
			
		||||
        if (srcSize != ZSTD_frameHeaderSize_min) return ERROR(srcSize_wrong);   /* impossible */
 | 
			
		||||
        ctx->headerSize = ZSTD_decodeFrameHeader_Part1(ctx, src, ZSTD_frameHeaderSize_min);
 | 
			
		||||
        if (ZSTD_isError(ctx->headerSize)) return ctx->headerSize;
 | 
			
		||||
        memcpy(ctx->headerBuffer, src, ZSTD_frameHeaderSize_min);
 | 
			
		||||
        if (ctx->headerSize > ZSTD_frameHeaderSize_min) return ERROR(GENERIC);   /* impossible */
 | 
			
		||||
        ctx->expected = 0;   /* not necessary to copy more */
 | 
			
		||||
        /* fallthrough */
 | 
			
		||||
    case ZSTDds_decodeFrameHeader:
 | 
			
		||||
        {
 | 
			
		||||
            /* get frame header */
 | 
			
		||||
            size_t result;
 | 
			
		||||
            memcpy(ctx->headerBuffer + ZSTD_frameHeaderSize_min, src, ctx->expected);
 | 
			
		||||
            result = ZSTD_decodeFrameHeader_Part2(ctx, ctx->headerBuffer, ctx->headerSize);
 | 
			
		||||
        /* get frame header */
 | 
			
		||||
        {   size_t const result = ZSTD_decodeFrameHeader_Part2(ctx, ctx->headerBuffer, ctx->headerSize);
 | 
			
		||||
            if (ZSTD_isError(result)) return result;
 | 
			
		||||
            ctx->expected = ZSTD_blockHeaderSize;
 | 
			
		||||
            ctx->stage = ZSTDds_decodeBlockHeader;
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    case ZSTDds_decodeBlockHeader:
 | 
			
		||||
        {
 | 
			
		||||
            /* Decode block header */
 | 
			
		||||
            blockProperties_t bp;
 | 
			
		||||
            size_t blockSize = ZSTD_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
 | 
			
		||||
        /* Decode block header */
 | 
			
		||||
        {   blockProperties_t bp;
 | 
			
		||||
            size_t const blockSize = ZSTD_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
 | 
			
		||||
            if (ZSTD_isError(blockSize)) return blockSize;
 | 
			
		||||
            if (bp.blockType == bt_end)
 | 
			
		||||
            {
 | 
			
		||||
@@ -3864,11 +3854,9 @@ static size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDs
 | 
			
		||||
 | 
			
		||||
        case ZBUFFds_readHeader :
 | 
			
		||||
            /* read header from src */
 | 
			
		||||
            {
 | 
			
		||||
                size_t headerSize = ZSTD_getFrameParams(&(zbc->params), src, *srcSizePtr);
 | 
			
		||||
            {   size_t const headerSize = ZSTD_getFrameParams(&(zbc->params), src, *srcSizePtr);
 | 
			
		||||
                if (ZSTD_isError(headerSize)) return headerSize;
 | 
			
		||||
                if (headerSize)
 | 
			
		||||
                {
 | 
			
		||||
                if (headerSize) {
 | 
			
		||||
                    /* not enough input to decode header : tell how many bytes would be necessary */
 | 
			
		||||
                    memcpy(zbc->headerBuffer+zbc->hPos, src, *srcSizePtr);
 | 
			
		||||
                    zbc->hPos += *srcSizePtr;
 | 
			
		||||
@@ -3882,8 +3870,7 @@ static size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDs
 | 
			
		||||
 | 
			
		||||
        case ZBUFFds_loadHeader:
 | 
			
		||||
            /* complete header from src */
 | 
			
		||||
            {
 | 
			
		||||
                size_t headerSize = ZBUFF_limitCopy(
 | 
			
		||||
            {   size_t headerSize = ZBUFF_limitCopy(
 | 
			
		||||
                    zbc->headerBuffer + zbc->hPos, ZSTD_frameHeaderSize_max - zbc->hPos,
 | 
			
		||||
                    src, *srcSizePtr);
 | 
			
		||||
                zbc->hPos += headerSize;
 | 
			
		||||
@@ -3895,12 +3882,12 @@ static size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDs
 | 
			
		||||
                    *maxDstSizePtr = 0;
 | 
			
		||||
                    return headerSize - zbc->hPos;
 | 
			
		||||
            }   }
 | 
			
		||||
            /* intentional fallthrough */
 | 
			
		||||
 | 
			
		||||
        case ZBUFFds_decodeHeader:
 | 
			
		||||
                /* apply header to create / resize buffers */
 | 
			
		||||
                {
 | 
			
		||||
                    size_t neededOutSize = (size_t)1 << zbc->params.windowLog;
 | 
			
		||||
                    size_t neededInSize = BLOCKSIZE;   /* a block is never > BLOCKSIZE */
 | 
			
		||||
                {   size_t const neededOutSize = (size_t)1 << zbc->params.windowLog;
 | 
			
		||||
                    size_t const neededInSize = BLOCKSIZE;   /* a block is never > BLOCKSIZE */
 | 
			
		||||
                    if (zbc->inBuffSize < neededInSize) {
 | 
			
		||||
                        free(zbc->inBuff);
 | 
			
		||||
                        zbc->inBuffSize = neededInSize;
 | 
			
		||||
@@ -4067,3 +4054,11 @@ size_t ZBUFFv04_decompressContinue(ZBUFFv04_DCtx* dctx, void* dst, size_t* maxDs
 | 
			
		||||
{
 | 
			
		||||
    return ZBUFF_decompressContinue(dctx, dst, maxDstSizePtr, src, srcSizePtr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ZSTD_DCtx* ZSTDv04_createDCtx(void) { return ZSTD_createDCtx(); }
 | 
			
		||||
size_t ZSTDv04_freeDCtx(ZSTD_DCtx* dctx) { return ZSTD_freeDCtx(dctx); }
 | 
			
		||||
 | 
			
		||||
size_t ZSTDv04_getFrameParams(ZSTD_parameters* params, const void* src, size_t srcSize)
 | 
			
		||||
{
 | 
			
		||||
    return ZSTD_getFrameParams(params, src, srcSize);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3872,25 +3872,17 @@ size_t ZSTDv05_decompressContinue(ZSTDv05_DCtx* dctx, void* dst, size_t maxDstSi
 | 
			
		||||
    switch (dctx->stage)
 | 
			
		||||
    {
 | 
			
		||||
    case ZSTDv05ds_getFrameHeaderSize :
 | 
			
		||||
        {
 | 
			
		||||
            /* get frame header size */
 | 
			
		||||
            if (srcSize != ZSTDv05_frameHeaderSize_min) return ERROR(srcSize_wrong);   /* impossible */
 | 
			
		||||
            dctx->headerSize = ZSTDv05_decodeFrameHeader_Part1(dctx, src, ZSTDv05_frameHeaderSize_min);
 | 
			
		||||
            if (ZSTDv05_isError(dctx->headerSize)) return dctx->headerSize;
 | 
			
		||||
            memcpy(dctx->headerBuffer, src, ZSTDv05_frameHeaderSize_min);
 | 
			
		||||
            if (dctx->headerSize > ZSTDv05_frameHeaderSize_min) {
 | 
			
		||||
                dctx->expected = dctx->headerSize - ZSTDv05_frameHeaderSize_min;
 | 
			
		||||
                dctx->stage = ZSTDv05ds_decodeFrameHeader;
 | 
			
		||||
                return 0;
 | 
			
		||||
            }
 | 
			
		||||
            dctx->expected = 0;   /* not necessary to copy more */
 | 
			
		||||
        }
 | 
			
		||||
        /* get frame header size */
 | 
			
		||||
        if (srcSize != ZSTDv05_frameHeaderSize_min) return ERROR(srcSize_wrong);   /* impossible */
 | 
			
		||||
        dctx->headerSize = ZSTDv05_decodeFrameHeader_Part1(dctx, src, ZSTDv05_frameHeaderSize_min);
 | 
			
		||||
        if (ZSTDv05_isError(dctx->headerSize)) return dctx->headerSize;
 | 
			
		||||
        memcpy(dctx->headerBuffer, src, ZSTDv05_frameHeaderSize_min);
 | 
			
		||||
        if (dctx->headerSize > ZSTDv05_frameHeaderSize_min) return ERROR(GENERIC); /* should never happen */
 | 
			
		||||
        dctx->expected = 0;   /* not necessary to copy more */
 | 
			
		||||
        /* fallthrough */
 | 
			
		||||
    case ZSTDv05ds_decodeFrameHeader:
 | 
			
		||||
        {
 | 
			
		||||
            /* get frame header */
 | 
			
		||||
            size_t result;
 | 
			
		||||
            memcpy(dctx->headerBuffer + ZSTDv05_frameHeaderSize_min, src, dctx->expected);
 | 
			
		||||
            result = ZSTDv05_decodeFrameHeader_Part2(dctx, dctx->headerBuffer, dctx->headerSize);
 | 
			
		||||
        /* get frame header */
 | 
			
		||||
        {   size_t const result = ZSTDv05_decodeFrameHeader_Part2(dctx, dctx->headerBuffer, dctx->headerSize);
 | 
			
		||||
            if (ZSTDv05_isError(result)) return result;
 | 
			
		||||
            dctx->expected = ZSTDv05_blockHeaderSize;
 | 
			
		||||
            dctx->stage = ZSTDv05ds_decodeBlockHeader;
 | 
			
		||||
 
 | 
			
		||||
@@ -535,8 +535,6 @@ ZSTDLIB_API size_t ZSTDv06_decompress_usingPreparedDCtx(
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct ZSTDv06_frameParams_s { U64 frameContentSize; U32 windowLog; };
 | 
			
		||||
 | 
			
		||||
#define ZSTDv06_FRAMEHEADERSIZE_MAX 13    /* for static allocation */
 | 
			
		||||
static const size_t ZSTDv06_frameHeaderSize_min = 5;
 | 
			
		||||
static const size_t ZSTDv06_frameHeaderSize_max = ZSTDv06_FRAMEHEADERSIZE_MAX;
 | 
			
		||||
 
 | 
			
		||||
@@ -107,7 +107,7 @@ ZSTDLIB_API size_t ZSTDv06_decompress_usingDict(ZSTDv06_DCtx* dctx,
 | 
			
		||||
/*-************************
 | 
			
		||||
*  Advanced Streaming API
 | 
			
		||||
***************************/
 | 
			
		||||
 | 
			
		||||
struct ZSTDv06_frameParams_s { unsigned long long frameContentSize; unsigned windowLog; };
 | 
			
		||||
typedef struct ZSTDv06_frameParams_s ZSTDv06_frameParams;
 | 
			
		||||
 | 
			
		||||
ZSTDLIB_API size_t ZSTDv06_getFrameParams(ZSTDv06_frameParams* fparamsPtr, const void* src, size_t srcSize);   /**< doesn't consume input */
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,7 @@ extern "C" {
 | 
			
		||||
***************************************/
 | 
			
		||||
#define ZSTD_VERSION_MAJOR    0
 | 
			
		||||
#define ZSTD_VERSION_MINOR    7
 | 
			
		||||
#define ZSTD_VERSION_RELEASE  1
 | 
			
		||||
#define ZSTD_VERSION_RELEASE  5
 | 
			
		||||
 | 
			
		||||
#define ZSTD_LIB_VERSION ZSTD_VERSION_MAJOR.ZSTD_VERSION_MINOR.ZSTD_VERSION_RELEASE
 | 
			
		||||
#define ZSTD_QUOTE(str) #str
 | 
			
		||||
@@ -85,9 +85,14 @@ ZSTDLIB_API size_t ZSTD_compress(   void* dst, size_t dstCapacity,
 | 
			
		||||
                              const void* src, size_t srcSize,
 | 
			
		||||
                                     int  compressionLevel);
 | 
			
		||||
 | 
			
		||||
/** ZSTD_getDecompressedSize() :
 | 
			
		||||
*   @return : decompressed size if known, 0 otherwise.
 | 
			
		||||
        note : to know precise reason why result is `0`, follow up with ZSTD_getFrameParams() */
 | 
			
		||||
unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_decompress() :
 | 
			
		||||
    `compressedSize` : is the _exact_ size of the compressed blob, otherwise decompression will fail.
 | 
			
		||||
    `dstCapacity` must be large enough, equal or larger than originalSize.
 | 
			
		||||
    `compressedSize` : is the _exact_ size of compressed input, otherwise decompression will fail.
 | 
			
		||||
    `dstCapacity` must be equal or larger than originalSize.
 | 
			
		||||
    @return : the number of bytes decompressed into `dst` (<= `dstCapacity`),
 | 
			
		||||
              or an errorCode if it fails (which can be tested using ZSTD_isError()) */
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity,
 | 
			
		||||
@@ -197,22 +202,20 @@ ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx,
 | 
			
		||||
 * Use them only in association with static linking.
 | 
			
		||||
 * ==================================================================================== */
 | 
			
		||||
 | 
			
		||||
/*--- Dependency ---*/
 | 
			
		||||
#include "mem.h"   /* U32 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--- Constants ---*/
 | 
			
		||||
#define ZSTD_MAGICNUMBER            0xFD2FB527   /* v0.7 */
 | 
			
		||||
#define ZSTD_MAGIC_SKIPPABLE_START  0x184D2A50U
 | 
			
		||||
 | 
			
		||||
#define ZSTD_WINDOWLOG_MAX    ((U32)(MEM_32bits() ? 25 : 27))
 | 
			
		||||
#define ZSTD_WINDOWLOG_MAX_32  25
 | 
			
		||||
#define ZSTD_WINDOWLOG_MAX_64  27
 | 
			
		||||
#define ZSTD_WINDOWLOG_MAX    ((U32)(MEM_32bits() ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64))
 | 
			
		||||
#define ZSTD_WINDOWLOG_MIN     18
 | 
			
		||||
#define ZSTD_CHAINLOG_MAX     (ZSTD_WINDOWLOG_MAX+1)
 | 
			
		||||
#define ZSTD_CHAINLOG_MIN       4
 | 
			
		||||
#define ZSTD_HASHLOG_MAX       ZSTD_WINDOWLOG_MAX
 | 
			
		||||
#define ZSTD_HASHLOG_MIN       12
 | 
			
		||||
#define ZSTD_HASHLOG3_MAX      17
 | 
			
		||||
#define ZSTD_HASHLOG3_MIN      15
 | 
			
		||||
//#define ZSTD_HASHLOG3_MIN      15
 | 
			
		||||
#define ZSTD_SEARCHLOG_MAX    (ZSTD_WINDOWLOG_MAX-1)
 | 
			
		||||
#define ZSTD_SEARCHLOG_MIN      1
 | 
			
		||||
#define ZSTD_SEARCHLENGTH_MAX   7
 | 
			
		||||
@@ -227,22 +230,22 @@ static const size_t ZSTD_skippableHeaderSize = 8;  /* magic number + skippable f
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--- Types ---*/
 | 
			
		||||
typedef enum { ZSTD_fast, ZSTD_greedy, ZSTD_lazy, ZSTD_lazy2, ZSTD_btlazy2, ZSTD_btopt } ZSTD_strategy;   /*< from faster to stronger */
 | 
			
		||||
typedef enum { ZSTD_fast, ZSTD_dfast, ZSTD_greedy, ZSTD_lazy, ZSTD_lazy2, ZSTD_btlazy2, ZSTD_btopt } ZSTD_strategy;   /*< from faster to stronger */
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    U32 windowLog;     /*< largest match distance : larger == more compression, more memory needed during decompression */
 | 
			
		||||
    U32 chainLog;      /*< fully searched segment : larger == more compression, slower, more memory (useless for fast) */
 | 
			
		||||
    U32 hashLog;       /*< dispatch table : larger == faster, more memory */
 | 
			
		||||
    U32 searchLog;     /*< nb of searches : larger == more compression, slower */
 | 
			
		||||
    U32 searchLength;  /*< match length searched : larger == faster decompression, sometimes less compression */
 | 
			
		||||
    U32 targetLength;  /*< acceptable match size for optimal parser (only) : larger == more compression, slower */
 | 
			
		||||
    unsigned windowLog;      /*< largest match distance : larger == more compression, more memory needed during decompression */
 | 
			
		||||
    unsigned chainLog;       /*< fully searched segment : larger == more compression, slower, more memory (useless for fast) */
 | 
			
		||||
    unsigned hashLog;        /*< dispatch table : larger == faster, more memory */
 | 
			
		||||
    unsigned searchLog;      /*< nb of searches : larger == more compression, slower */
 | 
			
		||||
    unsigned searchLength;   /*< match length searched : larger == faster decompression, sometimes less compression */
 | 
			
		||||
    unsigned targetLength;   /*< acceptable match size for optimal parser (only) : larger == more compression, slower */
 | 
			
		||||
    ZSTD_strategy strategy;
 | 
			
		||||
} ZSTD_compressionParameters;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    U32 contentSizeFlag;  /*< 1: content size will be in frame header (if known). */
 | 
			
		||||
    U32 checksumFlag;     /*< 1: will generate a 22-bits checksum at end of frame, to be used for error detection by decompressor */
 | 
			
		||||
    U32 noDictIDFlag;     /*< 1: no dict ID will be saved into frame header (if dictionary compression) */
 | 
			
		||||
    unsigned contentSizeFlag; /*< 1: content size will be in frame header (if known). */
 | 
			
		||||
    unsigned checksumFlag;    /*< 1: will generate a 22-bits checksum at end of frame, to be used for error detection by decompressor */
 | 
			
		||||
    unsigned noDictIDFlag;    /*< 1: no dict ID will be saved into frame header (if dictionary compression) */
 | 
			
		||||
} ZSTD_frameParameters;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
@@ -259,6 +262,11 @@ typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; v
 | 
			
		||||
/*-*************************************
 | 
			
		||||
*  Advanced compression functions
 | 
			
		||||
***************************************/
 | 
			
		||||
/*! ZSTD_estimateCCtxSize() :
 | 
			
		||||
 *  Gives the amount of memory allocated for a ZSTD_CCtx given a set of compression parameters.
 | 
			
		||||
 *  `frameContentSize` is an optional parameter, provide `0` if unknown */
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_estimateCCtxSize(ZSTD_compressionParameters cParams);
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_createCCtx_advanced() :
 | 
			
		||||
 *  Create a ZSTD compression context using external alloc and free functions */
 | 
			
		||||
ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem);
 | 
			
		||||
@@ -268,21 +276,30 @@ ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem);
 | 
			
		||||
ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize,
 | 
			
		||||
                                                  ZSTD_parameters params, ZSTD_customMem customMem);
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_sizeofCCtx() :
 | 
			
		||||
 *  Gives the amount of memory used by a given ZSTD_CCtx */
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_sizeofCCtx(const ZSTD_CCtx* cctx);
 | 
			
		||||
 | 
			
		||||
ZSTDLIB_API unsigned ZSTD_maxCLevel (void);
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_getParams() :
 | 
			
		||||
*   same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of a `ZSTD_compressionParameters`.
 | 
			
		||||
*   All fields of `ZSTD_frameParameters` are set to default (0) */
 | 
			
		||||
ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long srcSize, size_t dictSize);
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_getCParams() :
 | 
			
		||||
*   @return ZSTD_compressionParameters structure for a selected compression level and srcSize.
 | 
			
		||||
*   `srcSize` value is optional, select 0 if not known */
 | 
			
		||||
ZSTDLIB_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, U64 srcSize, size_t dictSize);
 | 
			
		||||
ZSTDLIB_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long srcSize, size_t dictSize);
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_checkParams() :
 | 
			
		||||
/*! ZSTD_checkCParams() :
 | 
			
		||||
*   Ensure param values remain within authorized range */
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params);
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_adjustParams() :
 | 
			
		||||
/*! ZSTD_adjustCParams() :
 | 
			
		||||
*   optimize params for a given `srcSize` and `dictSize`.
 | 
			
		||||
*   both values are optional, select `0` if unknown. */
 | 
			
		||||
ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, U64 srcSize, size_t dictSize);
 | 
			
		||||
ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize);
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_compress_advanced() :
 | 
			
		||||
*   Same as ZSTD_compress_usingDict(), with fine-tune control of each compression parameter */
 | 
			
		||||
@@ -295,17 +312,25 @@ ZSTDLIB_API size_t ZSTD_compress_advanced (ZSTD_CCtx* ctx,
 | 
			
		||||
 | 
			
		||||
/*--- Advanced Decompression functions ---*/
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_estimateDCtxSize() :
 | 
			
		||||
 *  Gives the potential amount of memory allocated to create a ZSTD_DCtx */
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_estimateDCtxSize(void);
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_createDCtx_advanced() :
 | 
			
		||||
 *  Create a ZSTD decompression context using external alloc and free functions */
 | 
			
		||||
ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem);
 | 
			
		||||
 | 
			
		||||
/*! ZSTD_sizeofDCtx() :
 | 
			
		||||
 *  Gives the amount of memory used by a given ZSTD_DCtx */
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_sizeofDCtx(const ZSTD_DCtx* dctx);
 | 
			
		||||
 | 
			
		||||
/* ****************************************************************
 | 
			
		||||
 | 
			
		||||
/* ******************************************************************
 | 
			
		||||
*  Streaming functions (direct mode - synchronous and buffer-less)
 | 
			
		||||
******************************************************************/
 | 
			
		||||
********************************************************************/
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel);
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel);
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, U64 pledgedSrcSize);
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize);
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx);
 | 
			
		||||
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
 | 
			
		||||
@@ -324,7 +349,7 @@ ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapaci
 | 
			
		||||
  Then, consume your input using ZSTD_compressContinue().
 | 
			
		||||
  There are some important considerations to keep in mind when using this advanced function :
 | 
			
		||||
  - ZSTD_compressContinue() has no internal buffer. It uses externally provided buffer only.
 | 
			
		||||
  - Interface is synchronous : input will be entirely consumed and produce 1+ compressed blocks.
 | 
			
		||||
  - Interface is synchronous : input is consumed entirely and produce 1 (or more) compressed blocks.
 | 
			
		||||
  - Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario.
 | 
			
		||||
    Worst case evaluation is provided by ZSTD_compressBound().
 | 
			
		||||
    ZSTD_compressContinue() doesn't guarantee recover after a failed compression.
 | 
			
		||||
@@ -341,10 +366,10 @@ ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapaci
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    U64 frameContentSize;
 | 
			
		||||
    U32 windowSize;
 | 
			
		||||
    U32 dictID;
 | 
			
		||||
    U32 checksumFlag;
 | 
			
		||||
    unsigned long long frameContentSize;
 | 
			
		||||
    unsigned windowSize;
 | 
			
		||||
    unsigned dictID;
 | 
			
		||||
    unsigned checksumFlag;
 | 
			
		||||
} ZSTD_frameParams;
 | 
			
		||||
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_getFrameParams(ZSTD_frameParams* fparamsPtr, const void* src, size_t srcSize);   /**< doesn't consume input */
 | 
			
		||||
@@ -380,15 +405,23 @@ ZSTDLIB_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t ds
 | 
			
		||||
  Then use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively.
 | 
			
		||||
  ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue().
 | 
			
		||||
  ZSTD_decompressContinue() requires this exact amount of bytes, or it will fail.
 | 
			
		||||
  ZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize`.
 | 
			
		||||
  They should preferably be located contiguously, prior to current block. Alternatively, a round buffer is also possible.
 | 
			
		||||
 | 
			
		||||
  @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity).
 | 
			
		||||
  It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header.
 | 
			
		||||
 | 
			
		||||
  ZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize`.
 | 
			
		||||
  They should preferably be located contiguously, prior to current block.
 | 
			
		||||
  Alternatively, a round buffer of sufficient size is also possible. Sufficient size is determined by frame parameters.
 | 
			
		||||
  ZSTD_decompressContinue() is very sensitive to contiguity,
 | 
			
		||||
  if 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place,
 | 
			
		||||
    or that previous contiguous segment is large enough to properly handle maximum back-reference.
 | 
			
		||||
 | 
			
		||||
  A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero.
 | 
			
		||||
  Context can then be reset to start a new decompression.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  == Special case : skippable frames ==
 | 
			
		||||
 | 
			
		||||
  Skippable frames allow the integration of user-defined data into a flow of concatenated frames.
 | 
			
		||||
  Skippable frames will be ignored (skipped) by a decompressor. The format of skippable frame is following:
 | 
			
		||||
  a) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F
 | 
			
		||||
@@ -404,11 +437,14 @@ ZSTDLIB_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t ds
 | 
			
		||||
*  Block functions
 | 
			
		||||
****************************************/
 | 
			
		||||
/*! Block functions produce and decode raw zstd blocks, without frame metadata.
 | 
			
		||||
    Frame metadata cost is typically ~18 bytes, which is non-negligible on very small blocks.
 | 
			
		||||
    User will have to take in charge required information to regenerate data, such as compressed and content sizes.
 | 
			
		||||
 | 
			
		||||
    A few rules to respect :
 | 
			
		||||
    - Uncompressed block size must be <= ZSTD_BLOCKSIZE_MAX (128 KB)
 | 
			
		||||
    - Compressing or decompressing requires a context structure
 | 
			
		||||
    - Uncompressed block size must be <= MIN (128 KB, 1 << windowLog)
 | 
			
		||||
      + If you need to compress more, cut data into multiple blocks
 | 
			
		||||
      + Consider using the regular ZSTD_compress() instead, as frame metadata costs become negligible when source size is large.
 | 
			
		||||
    - Compressing and decompressing require a context structure
 | 
			
		||||
      + Use ZSTD_createCCtx() and ZSTD_createDCtx()
 | 
			
		||||
    - It is necessary to init context before starting
 | 
			
		||||
      + compression : ZSTD_compressBegin()
 | 
			
		||||
@@ -418,23 +454,16 @@ ZSTDLIB_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t ds
 | 
			
		||||
    - When a block is considered not compressible enough, ZSTD_compressBlock() result will be zero.
 | 
			
		||||
      In which case, nothing is produced into `dst`.
 | 
			
		||||
      + User must test for such outcome and deal directly with uncompressed data
 | 
			
		||||
      + ZSTD_decompressBlock() doesn't accept uncompressed data as input !!
 | 
			
		||||
      + ZSTD_decompressBlock() doesn't accept uncompressed data as input !!!
 | 
			
		||||
      + In case of multiple successive blocks, decoder must be informed of uncompressed block existence to follow proper history.
 | 
			
		||||
        Use ZSTD_insertBlock() in such a case.
 | 
			
		||||
        Insert block once it's copied into its final position.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define ZSTD_BLOCKSIZE_MAX (128 * 1024)   /* define, for static allocation */
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_compressBlock  (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-*************************************
 | 
			
		||||
*  Error management
 | 
			
		||||
***************************************/
 | 
			
		||||
#include "error_public.h"
 | 
			
		||||
/*! ZSTD_getErrorCode() :
 | 
			
		||||
    convert a `size_t` function result into a `ZSTD_ErrorCode` enum type,
 | 
			
		||||
    which can be used to compare directly with enum list published into "error_public.h" */
 | 
			
		||||
ZSTDLIB_API ZSTD_ErrorCode ZSTD_getErrorCode(size_t functionResult);
 | 
			
		||||
ZSTDLIB_API const char* ZSTD_getErrorString(ZSTD_ErrorCode code);
 | 
			
		||||
ZSTDLIB_API size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize);  /**< insert block into `dctx` history. Useful to track uncompressed blocks */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif   /* ZSTD_STATIC_LINKING_ONLY */
 | 
			
		||||
							
								
								
									
										1
									
								
								programs/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								programs/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -43,6 +43,7 @@ _*
 | 
			
		||||
tmp*
 | 
			
		||||
*.zst
 | 
			
		||||
result
 | 
			
		||||
out
 | 
			
		||||
 | 
			
		||||
# fuzzer
 | 
			
		||||
afl
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ MANDIR  = $(PREFIX)/share/man/man1
 | 
			
		||||
 | 
			
		||||
ZSTDDIR = ../lib
 | 
			
		||||
 | 
			
		||||
CPPFLAGS= -I$(ZSTDDIR)/common -I$(ZSTDDIR)/dictBuilder -DXXH_NAMESPACE=ZSTD_
 | 
			
		||||
CPPFLAGS= -I$(ZSTDDIR) -I$(ZSTDDIR)/common -I$(ZSTDDIR)/dictBuilder -DXXH_NAMESPACE=ZSTD_
 | 
			
		||||
CFLAGS ?= -O3  # -falign-loops=32   # not always beneficial
 | 
			
		||||
CFLAGS += -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement -Wstrict-prototypes -Wundef
 | 
			
		||||
FLAGS   = $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(MOREFLAGS)
 | 
			
		||||
@@ -154,10 +154,10 @@ clean:
 | 
			
		||||
	@echo Cleaning completed
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#------------------------------------------------------------------------
 | 
			
		||||
#make install is validated only for Linux, OSX, kFreeBSD and Hurd targets
 | 
			
		||||
#------------------------------------------------------------------------
 | 
			
		||||
ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU))
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
#make install is validated only for Linux, OSX, kFreeBSD, Hurd and OpenBSD targets
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU OpenBSD))
 | 
			
		||||
HOST_OS = POSIX
 | 
			
		||||
install: zstd
 | 
			
		||||
	@echo Installing binaries
 | 
			
		||||
 
 | 
			
		||||
@@ -142,22 +142,20 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize,
 | 
			
		||||
                        const size_t* fileSizes, U32 nbFiles,
 | 
			
		||||
                        const void* dictBuffer, size_t dictBufferSize, benchResult_t *result)
 | 
			
		||||
{
 | 
			
		||||
    size_t const blockSize = (g_blockSize>=32 ? g_blockSize : srcSize) + (!srcSize);   /* avoid div by 0 */
 | 
			
		||||
    size_t const blockSize = (g_blockSize>=32 ? g_blockSize : srcSize) + (!srcSize) /* avoid div by 0 */ ;
 | 
			
		||||
    U32 const maxNbBlocks = (U32) ((srcSize + (blockSize-1)) / blockSize) + nbFiles;
 | 
			
		||||
    blockParam_t* const blockTable = (blockParam_t*) malloc(maxNbBlocks * sizeof(blockParam_t));
 | 
			
		||||
    size_t const maxCompressedSize = ZSTD_compressBound(srcSize) + (maxNbBlocks * 1024);   /* add some room for safety */
 | 
			
		||||
    void* const compressedBuffer = malloc(maxCompressedSize);
 | 
			
		||||
    void* const resultBuffer = malloc(srcSize);
 | 
			
		||||
    ZSTD_CCtx* refCtx = ZSTD_createCCtx();
 | 
			
		||||
    ZSTD_CCtx* ctx = ZSTD_createCCtx();
 | 
			
		||||
    ZSTD_DCtx* refDCtx = ZSTD_createDCtx();
 | 
			
		||||
    ZSTD_DCtx* dctx = ZSTD_createDCtx();
 | 
			
		||||
    ZSTD_CCtx* const ctx = ZSTD_createCCtx();
 | 
			
		||||
    ZSTD_DCtx* const dctx = ZSTD_createDCtx();
 | 
			
		||||
    U32 nbBlocks;
 | 
			
		||||
    UTIL_time_t ticksPerSecond;
 | 
			
		||||
 | 
			
		||||
    /* checks */
 | 
			
		||||
    if (!compressedBuffer || !resultBuffer || !blockTable || !refCtx || !ctx || !refDCtx || !dctx)
 | 
			
		||||
        EXM_THROW(31, "not enough memory");
 | 
			
		||||
    if (!compressedBuffer || !resultBuffer || !blockTable || !ctx || !dctx)
 | 
			
		||||
        EXM_THROW(31, "allocation error : not enough memory");
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    if (strlen(displayName)>17) displayName += strlen(displayName)-17;   /* can only display 17 characters */
 | 
			
		||||
@@ -213,13 +211,17 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize,
 | 
			
		||||
            DISPLAYLEVEL(2, "%2i-%-17.17s :%10u ->\r", testNb, displayName, (U32)srcSize);
 | 
			
		||||
            memset(compressedBuffer, 0xE5, maxCompressedSize);  /* warm up and erase result buffer */
 | 
			
		||||
 | 
			
		||||
            UTIL_sleepMilli(1); /* give processor time to other processes */
 | 
			
		||||
            UTIL_sleepMilli(1);  /* give processor time to other processes */
 | 
			
		||||
            UTIL_waitForNextTick(ticksPerSecond);
 | 
			
		||||
            UTIL_getTime(&clockStart);
 | 
			
		||||
 | 
			
		||||
            {   U32 nbLoops = 0;
 | 
			
		||||
                ZSTD_CDict* cdict = ZSTD_createCDict(dictBuffer, dictBufferSize, cLevel);
 | 
			
		||||
                if (cdict==NULL) EXM_THROW(1, "ZSTD_createCDict() allocation failure");
 | 
			
		||||
            {   //size_t const refSrcSize = (nbBlocks == 1) ? srcSize : 0;
 | 
			
		||||
                //ZSTD_parameters const zparams = ZSTD_getParams(cLevel, refSrcSize, dictBufferSize);
 | 
			
		||||
                ZSTD_parameters const zparams = ZSTD_getParams(cLevel, blockSize, dictBufferSize);
 | 
			
		||||
                ZSTD_customMem const cmem = { NULL, NULL, NULL };
 | 
			
		||||
                U32 nbLoops = 0;
 | 
			
		||||
                ZSTD_CDict* cdict = ZSTD_createCDict_advanced(dictBuffer, dictBufferSize, zparams, cmem);
 | 
			
		||||
                if (cdict==NULL) EXM_THROW(1, "ZSTD_createCDict_advanced() allocation failure");
 | 
			
		||||
                do {
 | 
			
		||||
                    U32 blockNb;
 | 
			
		||||
                    for (blockNb=0; blockNb<nbBlocks; blockNb++) {
 | 
			
		||||
@@ -227,7 +229,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize,
 | 
			
		||||
                                            blockTable[blockNb].cPtr,  blockTable[blockNb].cRoom,
 | 
			
		||||
                                            blockTable[blockNb].srcPtr,blockTable[blockNb].srcSize,
 | 
			
		||||
                                            cdict);
 | 
			
		||||
                        if (ZSTD_isError(rSize)) EXM_THROW(1, "ZSTD_compress_usingPreparedCCtx() failed : %s", ZSTD_getErrorName(rSize));
 | 
			
		||||
                        if (ZSTD_isError(rSize)) EXM_THROW(1, "ZSTD_compress_usingCDict() failed : %s", ZSTD_getErrorName(rSize));
 | 
			
		||||
                        blockTable[blockNb].cSize = rSize;
 | 
			
		||||
                    }
 | 
			
		||||
                    nbLoops++;
 | 
			
		||||
@@ -264,7 +266,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize,
 | 
			
		||||
                            blockTable[blockNb].cPtr, blockTable[blockNb].cSize,
 | 
			
		||||
                            ddict);
 | 
			
		||||
                        if (ZSTD_isError(regenSize)) {
 | 
			
		||||
                            DISPLAY("ZSTD_decompress_usingPreparedDCtx() failed on block %u : %s  \n",
 | 
			
		||||
                            DISPLAY("ZSTD_decompress_usingDDict() failed on block %u : %s  \n",
 | 
			
		||||
                                      blockNb, ZSTD_getErrorName(regenSize));
 | 
			
		||||
                            clockLoop = 0;   /* force immediate test end */
 | 
			
		||||
                            break;
 | 
			
		||||
@@ -321,9 +323,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize,
 | 
			
		||||
    free(blockTable);
 | 
			
		||||
    free(compressedBuffer);
 | 
			
		||||
    free(resultBuffer);
 | 
			
		||||
    ZSTD_freeCCtx(refCtx);
 | 
			
		||||
    ZSTD_freeCCtx(ctx);
 | 
			
		||||
    ZSTD_freeDCtx(refDCtx);
 | 
			
		||||
    ZSTD_freeDCtx(dctx);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -23,12 +23,19 @@
 | 
			
		||||
    - source repository : https://github.com/Cyan4973/zstd
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* *************************************
 | 
			
		||||
*  Compiler Options
 | 
			
		||||
***************************************/
 | 
			
		||||
#define _CRT_SECURE_NO_WARNINGS  /* removes Visual warning on strerror() */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-************************************
 | 
			
		||||
*  Includes
 | 
			
		||||
*  Dependencies
 | 
			
		||||
**************************************/
 | 
			
		||||
#include <stdlib.h>    /* malloc */
 | 
			
		||||
#include <stdio.h>     /* FILE, fwrite, fprintf */
 | 
			
		||||
#include <string.h>    /* memcpy */
 | 
			
		||||
#include <errno.h>     /* errno */
 | 
			
		||||
#include "mem.h"       /* U32 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -87,12 +94,10 @@ static void RDG_fillLiteralDistrib(BYTE* ldt, double ld)
 | 
			
		||||
    U32 u;
 | 
			
		||||
 | 
			
		||||
    if (ld<=0.0) ld = 0.0;
 | 
			
		||||
    //TRACE(" percent:%5.2f%% \n", ld*100.);
 | 
			
		||||
    //TRACE(" start:(%c)[%02X] ", character, character);
 | 
			
		||||
    for (u=0; u<LTSIZE; ) {
 | 
			
		||||
        U32 const weight = (U32)((double)(LTSIZE - u) * ld) + 1;
 | 
			
		||||
        U32 const end = MIN ( u + weight , LTSIZE);
 | 
			
		||||
        while (u < end) ldt[u++] = character;   // TRACE(" %u(%c)[%02X] ", u, character, character);
 | 
			
		||||
        while (u < end) ldt[u++] = character;
 | 
			
		||||
        character++;
 | 
			
		||||
        if (character > lastChar) character = firstChar;
 | 
			
		||||
    }
 | 
			
		||||
@@ -102,9 +107,7 @@ static void RDG_fillLiteralDistrib(BYTE* ldt, double ld)
 | 
			
		||||
static BYTE RDG_genChar(U32* seed, const BYTE* ldt)
 | 
			
		||||
{
 | 
			
		||||
    U32 const id = RDG_rand(seed) & LTMASK;
 | 
			
		||||
    //TRACE(" %u : \n", id);
 | 
			
		||||
    //TRACE(" %4u [%4u] ; val : %4u \n", id, id&255, ldt[id]);
 | 
			
		||||
    return (ldt[id]);  /* memory-sanitizer fails here, stating "uninitialized value" when table initialized with 0.0. Checked : table is fully initialized */
 | 
			
		||||
    return ldt[id];  /* memory-sanitizer fails here, stating "uninitialized value" when table initialized with P==0.0. Checked : table is fully initialized */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -115,8 +118,7 @@ static U32 RDG_rand15Bits (unsigned* seedPtr)
 | 
			
		||||
 | 
			
		||||
static U32 RDG_randLength(unsigned* seedPtr)
 | 
			
		||||
{
 | 
			
		||||
    if (RDG_rand(seedPtr) & 7)
 | 
			
		||||
        return (RDG_rand(seedPtr) & 0xF);
 | 
			
		||||
    if (RDG_rand(seedPtr) & 7) return (RDG_rand(seedPtr) & 0xF);   /* small length */
 | 
			
		||||
    return (RDG_rand(seedPtr) & 0x1FF) + 0xF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -156,7 +158,6 @@ void RDG_genBlock(void* buffer, size_t buffSize, size_t prefixSize, double match
 | 
			
		||||
            U32 const randOffset = RDG_rand15Bits(seedPtr) + 1;
 | 
			
		||||
            U32 const offset = repeatOffset ? prevOffset : (U32) MIN(randOffset , pos);
 | 
			
		||||
            size_t match = pos - offset;
 | 
			
		||||
            //TRACE("pos : %u; offset: %u ; length : %u \n", (U32)pos, offset, length);
 | 
			
		||||
            while (pos < d) buffPtr[pos++] = buffPtr[match++];   /* correctly manages overlaps */
 | 
			
		||||
            prevOffset = offset;
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -171,9 +172,8 @@ void RDG_genBlock(void* buffer, size_t buffSize, size_t prefixSize, double match
 | 
			
		||||
void RDG_genBuffer(void* buffer, size_t size, double matchProba, double litProba, unsigned seed)
 | 
			
		||||
{
 | 
			
		||||
    BYTE ldt[LTSIZE];
 | 
			
		||||
    memset(ldt, '0', sizeof(ldt));
 | 
			
		||||
    memset(ldt, '0', sizeof(ldt));  /* yes, character '0', this is intentional */
 | 
			
		||||
    if (litProba<=0.0) litProba = matchProba / 4.5;
 | 
			
		||||
    //TRACE(" percent:%5.2f%% \n", litProba*100.);
 | 
			
		||||
    RDG_fillLiteralDistrib(ldt, litProba);
 | 
			
		||||
    RDG_genBlock(buffer, size, 0, matchProba, ldt, &seed);
 | 
			
		||||
}
 | 
			
		||||
@@ -185,12 +185,12 @@ void RDG_genStdout(unsigned long long size, double matchProba, double litProba,
 | 
			
		||||
    size_t const stdDictSize = 32 KB;
 | 
			
		||||
    BYTE* const buff = (BYTE*)malloc(stdDictSize + stdBlockSize);
 | 
			
		||||
    U64 total = 0;
 | 
			
		||||
    BYTE ldt[LTSIZE];
 | 
			
		||||
    BYTE ldt[LTSIZE];   /* literals distribution table */
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    if (buff==NULL) { fprintf(stdout, "not enough memory\n"); exit(1); }
 | 
			
		||||
    if (buff==NULL) { fprintf(stderr, "datagen: error: %s \n", strerror(errno)); exit(1); }
 | 
			
		||||
    if (litProba<=0.0) litProba = matchProba / 4.5;
 | 
			
		||||
    memset(ldt, '0', sizeof(ldt));
 | 
			
		||||
    memset(ldt, '0', sizeof(ldt));   /* yes, character '0', this is intentional */
 | 
			
		||||
    RDG_fillLiteralDistrib(ldt, litProba);
 | 
			
		||||
    SET_BINARY_MODE(stdout);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,7 @@
 | 
			
		||||
#include <string.h>         /* memset */
 | 
			
		||||
#include <stdio.h>          /* fprintf, fopen, ftello64 */
 | 
			
		||||
#include <time.h>           /* clock_t, clock, CLOCKS_PER_SEC */
 | 
			
		||||
#include <errno.h>          /* errno */
 | 
			
		||||
 | 
			
		||||
#include "mem.h"            /* read */
 | 
			
		||||
#include "error_private.h"
 | 
			
		||||
@@ -43,13 +44,10 @@
 | 
			
		||||
#define MB *(1 <<20)
 | 
			
		||||
#define GB *(1U<<30)
 | 
			
		||||
 | 
			
		||||
#define DICTLISTSIZE 10000
 | 
			
		||||
#define MEMMULT 11
 | 
			
		||||
static const size_t maxMemory = (sizeof(size_t) == 4) ? (2 GB - 64 MB) : ((size_t)(512 MB) << sizeof(size_t));
 | 
			
		||||
 | 
			
		||||
#define NOISELENGTH 32
 | 
			
		||||
#define PRIME1   2654435761U
 | 
			
		||||
#define PRIME2   2246822519U
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-*************************************
 | 
			
		||||
@@ -60,17 +58,13 @@ static const size_t maxMemory = (sizeof(size_t) == 4) ? (2 GB - 64 MB) : ((size_
 | 
			
		||||
static unsigned g_displayLevel = 0;   /* 0 : no display;   1: errors;   2: default;  4: full information */
 | 
			
		||||
 | 
			
		||||
#define DISPLAYUPDATE(l, ...) if (g_displayLevel>=l) { \
 | 
			
		||||
            if ((DIB_GetMilliSpan(g_time) > refreshRate) || (g_displayLevel>=4)) \
 | 
			
		||||
            if ((DIB_clockSpan(g_time) > refreshRate) || (g_displayLevel>=4)) \
 | 
			
		||||
            { g_time = clock(); DISPLAY(__VA_ARGS__); \
 | 
			
		||||
            if (g_displayLevel>=4) fflush(stdout); } }
 | 
			
		||||
static const unsigned refreshRate = 150;
 | 
			
		||||
static const clock_t refreshRate = CLOCKS_PER_SEC * 2 / 10;
 | 
			
		||||
static clock_t g_time = 0;
 | 
			
		||||
 | 
			
		||||
static unsigned DIB_GetMilliSpan(clock_t nPrevious)
 | 
			
		||||
{
 | 
			
		||||
    clock_t const nCurrent = clock();
 | 
			
		||||
    return (unsigned)(((nCurrent - nPrevious) * 1000) / CLOCKS_PER_SEC);
 | 
			
		||||
}
 | 
			
		||||
static clock_t DIB_clockSpan(clock_t nPrevious) { return clock() - nPrevious; }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-*************************************
 | 
			
		||||
@@ -97,13 +91,15 @@ unsigned DiB_isError(size_t errorCode) { return ERR_isError(errorCode); }
 | 
			
		||||
 | 
			
		||||
const char* DiB_getErrorName(size_t errorCode) { return ERR_getErrorName(errorCode); }
 | 
			
		||||
 | 
			
		||||
#define MIN(a,b)   ( (a) < (b) ? (a) : (b) )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ********************************************************
 | 
			
		||||
*  File related operations
 | 
			
		||||
**********************************************************/
 | 
			
		||||
/** DiB_loadFiles() :
 | 
			
		||||
*   @return : nb of files effectively loaded into `buffer` */
 | 
			
		||||
static unsigned DiB_loadFiles(void* buffer, size_t bufferSize,
 | 
			
		||||
static unsigned DiB_loadFiles(void* buffer, size_t* bufferSizePtr,
 | 
			
		||||
                              size_t* fileSizes,
 | 
			
		||||
                              const char** fileNamesTable, unsigned nbFiles)
 | 
			
		||||
{
 | 
			
		||||
@@ -112,18 +108,20 @@ static unsigned DiB_loadFiles(void* buffer, size_t bufferSize,
 | 
			
		||||
    unsigned n;
 | 
			
		||||
 | 
			
		||||
    for (n=0; n<nbFiles; n++) {
 | 
			
		||||
        unsigned long long const fs64 = UTIL_getFileSize(fileNamesTable[n]);
 | 
			
		||||
        size_t const fileSize = (size_t)(fs64 > bufferSize-pos ? 0 : fs64);
 | 
			
		||||
        FILE* const f = fopen(fileNamesTable[n], "rb");
 | 
			
		||||
        if (f==NULL) EXM_THROW(10, "impossible to open file %s", fileNamesTable[n]);
 | 
			
		||||
        DISPLAYUPDATE(2, "Loading %s...       \r", fileNamesTable[n]);
 | 
			
		||||
        { size_t const readSize = fread(buff+pos, 1, fileSize, f);
 | 
			
		||||
          if (readSize != fileSize) EXM_THROW(11, "could not read %s", fileNamesTable[n]);
 | 
			
		||||
          pos += readSize; }
 | 
			
		||||
        fileSizes[n] = fileSize;
 | 
			
		||||
        fclose(f);
 | 
			
		||||
        if (fileSize == 0) break;  /* stop there, not enough memory to load all files */
 | 
			
		||||
    }
 | 
			
		||||
        const char* const fileName = fileNamesTable[n];
 | 
			
		||||
        unsigned long long const fs64 = UTIL_getFileSize(fileName);
 | 
			
		||||
        size_t const fileSize = (size_t) MIN(fs64, 128 KB);
 | 
			
		||||
        if (fileSize > *bufferSizePtr-pos) break;
 | 
			
		||||
        {   FILE* const f = fopen(fileName, "rb");
 | 
			
		||||
            if (f==NULL) EXM_THROW(10, "zstd: dictBuilder: %s %s ", fileName, strerror(errno));
 | 
			
		||||
            DISPLAYUPDATE(2, "Loading %s...       \r", fileName);
 | 
			
		||||
            { size_t const readSize = fread(buff+pos, 1, fileSize, f);
 | 
			
		||||
              if (readSize != fileSize) EXM_THROW(11, "Pb reading %s", fileName);
 | 
			
		||||
              pos += readSize; }
 | 
			
		||||
            fileSizes[n] = fileSize;
 | 
			
		||||
            fclose(f);
 | 
			
		||||
    }   }
 | 
			
		||||
    *bufferSizePtr = pos;
 | 
			
		||||
    return n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -137,26 +135,28 @@ static size_t DiB_findMaxMem(unsigned long long requiredMem)
 | 
			
		||||
    void* testmem = NULL;
 | 
			
		||||
 | 
			
		||||
    requiredMem = (((requiredMem >> 23) + 1) << 23);
 | 
			
		||||
    requiredMem += 2 * step;
 | 
			
		||||
    requiredMem += step;
 | 
			
		||||
    if (requiredMem > maxMemory) requiredMem = maxMemory;
 | 
			
		||||
 | 
			
		||||
    while (!testmem) {
 | 
			
		||||
        requiredMem -= step;
 | 
			
		||||
        testmem = malloc((size_t)requiredMem);
 | 
			
		||||
        requiredMem -= step;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    free(testmem);
 | 
			
		||||
    return (size_t)(requiredMem - step);
 | 
			
		||||
    return (size_t)requiredMem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void DiB_fillNoise(void* buffer, size_t length)
 | 
			
		||||
{
 | 
			
		||||
    unsigned acc = PRIME1;
 | 
			
		||||
    unsigned const prime1 = 2654435761U;
 | 
			
		||||
    unsigned const prime2 = 2246822519U;
 | 
			
		||||
    unsigned acc = prime1;
 | 
			
		||||
    size_t p=0;;
 | 
			
		||||
 | 
			
		||||
    for (p=0; p<length; p++) {
 | 
			
		||||
        acc *= PRIME2;
 | 
			
		||||
        acc *= prime2;
 | 
			
		||||
        ((unsigned char*)buffer)[p] = (unsigned char)(acc >> 21);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -188,7 +188,6 @@ size_t ZDICT_trainFromBuffer_unsafe(void* dictBuffer, size_t dictBufferCapacity,
 | 
			
		||||
                              ZDICT_params_t parameters);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define MIN(a,b)  ((a)<(b)?(a):(b))
 | 
			
		||||
int DiB_trainFromFiles(const char* dictFileName, unsigned maxDictSize,
 | 
			
		||||
                       const char** fileNamesTable, unsigned nbFiles,
 | 
			
		||||
                       ZDICT_params_t params)
 | 
			
		||||
@@ -197,7 +196,7 @@ int DiB_trainFromFiles(const char* dictFileName, unsigned maxDictSize,
 | 
			
		||||
    size_t* const fileSizes = (size_t*)malloc(nbFiles * sizeof(size_t));
 | 
			
		||||
    unsigned long long const totalSizeToLoad = UTIL_getTotalFileSize(fileNamesTable, nbFiles);
 | 
			
		||||
    size_t const maxMem =  DiB_findMaxMem(totalSizeToLoad * MEMMULT) / MEMMULT;
 | 
			
		||||
    size_t const benchedSize = MIN (maxMem, (size_t)totalSizeToLoad);
 | 
			
		||||
    size_t benchedSize = MIN (maxMem, (size_t)totalSizeToLoad);
 | 
			
		||||
    void* const srcBuffer = malloc(benchedSize+NOISELENGTH);
 | 
			
		||||
    int result = 0;
 | 
			
		||||
 | 
			
		||||
@@ -210,7 +209,7 @@ int DiB_trainFromFiles(const char* dictFileName, unsigned maxDictSize,
 | 
			
		||||
        DISPLAYLEVEL(1, "Not enough memory; training on %u MB only...\n", (unsigned)(benchedSize >> 20));
 | 
			
		||||
 | 
			
		||||
    /* Load input buffer */
 | 
			
		||||
    nbFiles = DiB_loadFiles(srcBuffer, benchedSize, fileSizes, fileNamesTable, nbFiles);
 | 
			
		||||
    nbFiles = DiB_loadFiles(srcBuffer, &benchedSize, fileSizes, fileNamesTable, nbFiles);
 | 
			
		||||
    DiB_fillNoise((char*)srcBuffer + benchedSize, NOISELENGTH);   /* guard band, for end of buffer condition */
 | 
			
		||||
 | 
			
		||||
    {   size_t const dictSize = ZDICT_trainFromBuffer_unsafe(dictBuffer, maxDictSize,
 | 
			
		||||
 
 | 
			
		||||
@@ -41,13 +41,14 @@
 | 
			
		||||
/* *************************************
 | 
			
		||||
*  Compiler Options
 | 
			
		||||
***************************************/
 | 
			
		||||
#define _POSIX_SOURCE 1        /* enable %llu on Windows */
 | 
			
		||||
#define _POSIX_SOURCE 1          /* enable %llu on Windows */
 | 
			
		||||
#define _CRT_SECURE_NO_WARNINGS  /* removes Visual warning on strerror() */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-*************************************
 | 
			
		||||
*  Includes
 | 
			
		||||
***************************************/
 | 
			
		||||
#include "util.h"       /* Compiler options, UTIL_GetFileSize */
 | 
			
		||||
#include "util.h"       /* Compiler options, UTIL_GetFileSize, _LARGEFILE64_SOURCE */
 | 
			
		||||
#include <stdio.h>      /* fprintf, fopen, fread, _fileno, stdin, stdout */
 | 
			
		||||
#include <stdlib.h>     /* malloc, free */
 | 
			
		||||
#include <string.h>     /* strcmp, strlen */
 | 
			
		||||
@@ -58,7 +59,6 @@
 | 
			
		||||
#include "fileio.h"
 | 
			
		||||
#define ZSTD_STATIC_LINKING_ONLY   /* ZSTD_magicNumber, ZSTD_frameHeaderSize_max */
 | 
			
		||||
#include "zstd.h"
 | 
			
		||||
#include "zstd_internal.h" /* MIN, KB, MB */
 | 
			
		||||
#define ZBUFF_STATIC_LINKING_ONLY
 | 
			
		||||
#include "zbuff.h"
 | 
			
		||||
 | 
			
		||||
@@ -84,6 +84,10 @@
 | 
			
		||||
/*-*************************************
 | 
			
		||||
*  Constants
 | 
			
		||||
***************************************/
 | 
			
		||||
#define KB *(1<<10)
 | 
			
		||||
#define MB *(1<<20)
 | 
			
		||||
#define GB *(1U<<30)
 | 
			
		||||
 | 
			
		||||
#define _1BIT  0x01
 | 
			
		||||
#define _2BITS 0x03
 | 
			
		||||
#define _3BITS 0x07
 | 
			
		||||
@@ -113,21 +117,17 @@ static U32 g_displayLevel = 2;   /* 0 : no display;   1: errors;   2 : + result
 | 
			
		||||
void FIO_setNotificationLevel(unsigned level) { g_displayLevel=level; }
 | 
			
		||||
 | 
			
		||||
#define DISPLAYUPDATE(l, ...) if (g_displayLevel>=l) { \
 | 
			
		||||
            if ((FIO_GetMilliSpan(g_time) > refreshRate) || (g_displayLevel>=4)) \
 | 
			
		||||
            if ((clock() - g_time > refreshRate) || (g_displayLevel>=4)) \
 | 
			
		||||
            { g_time = clock(); DISPLAY(__VA_ARGS__); \
 | 
			
		||||
            if (g_displayLevel>=4) fflush(stdout); } }
 | 
			
		||||
static const unsigned refreshRate = 150;
 | 
			
		||||
static const clock_t refreshRate = CLOCKS_PER_SEC * 15 / 100;
 | 
			
		||||
static clock_t g_time = 0;
 | 
			
		||||
 | 
			
		||||
static unsigned FIO_GetMilliSpan(clock_t nPrevious)
 | 
			
		||||
{
 | 
			
		||||
    clock_t const nCurrent = clock();
 | 
			
		||||
    return (unsigned)(((nCurrent - nPrevious) * 1000) / CLOCKS_PER_SEC);
 | 
			
		||||
}
 | 
			
		||||
#define MIN(a,b)    ((a) < (b) ? (a) : (b))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-*************************************
 | 
			
		||||
*  Local Parameters
 | 
			
		||||
*  Local Parameters - Not thread safe
 | 
			
		||||
***************************************/
 | 
			
		||||
static U32 g_overwrite = 0;
 | 
			
		||||
void FIO_overwriteMode(void) { g_overwrite=1; }
 | 
			
		||||
@@ -175,7 +175,7 @@ static FILE* FIO_openSrcFile(const char* srcFileName)
 | 
			
		||||
        f = fopen(srcFileName, "rb");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( f==NULL ) DISPLAYLEVEL(1, "zstd: %s: No such file\n", srcFileName);
 | 
			
		||||
    if ( f==NULL ) DISPLAYLEVEL(1, "zstd: %s: %s \n", srcFileName, strerror(errno));
 | 
			
		||||
 | 
			
		||||
    return f;
 | 
			
		||||
}
 | 
			
		||||
@@ -201,18 +201,20 @@ static FILE* FIO_openDstFile(const char* dstFileName)
 | 
			
		||||
                if (g_displayLevel <= 1) {
 | 
			
		||||
                    /* No interaction possible */
 | 
			
		||||
                    DISPLAY("zstd: %s already exists; not overwritten  \n", dstFileName);
 | 
			
		||||
                    return 0;
 | 
			
		||||
                    return NULL;
 | 
			
		||||
                }
 | 
			
		||||
                DISPLAY("zstd: %s already exists; do you wish to overwrite (y/N) ? ", dstFileName);
 | 
			
		||||
                {   int ch = getchar();
 | 
			
		||||
                    if ((ch!='Y') && (ch!='y')) {
 | 
			
		||||
                        DISPLAY("    not overwritten  \n");
 | 
			
		||||
                        return 0;
 | 
			
		||||
                        return NULL;
 | 
			
		||||
                    }
 | 
			
		||||
                    while ((ch!=EOF) && (ch!='\n')) ch = getchar();  /* flush rest of input line */
 | 
			
		||||
        }   }   }
 | 
			
		||||
        f = fopen( dstFileName, "wb" );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (f==NULL) DISPLAYLEVEL(1, "zstd: %s: %s\n", dstFileName, strerror(errno));
 | 
			
		||||
    return f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -233,18 +235,18 @@ static size_t FIO_loadFile(void** bufferPtr, const char* fileName)
 | 
			
		||||
 | 
			
		||||
    DISPLAYLEVEL(4,"Loading %s as dictionary \n", fileName);
 | 
			
		||||
    fileHandle = fopen(fileName, "rb");
 | 
			
		||||
    if (fileHandle==0) EXM_THROW(31, "Error opening file %s", fileName);
 | 
			
		||||
    if (fileHandle==0) EXM_THROW(31, "zstd: %s: %s", fileName, strerror(errno));
 | 
			
		||||
    fileSize = UTIL_getFileSize(fileName);
 | 
			
		||||
    if (fileSize > MAX_DICT_SIZE) {
 | 
			
		||||
        int seekResult;
 | 
			
		||||
        if (fileSize > 1 GB) EXM_THROW(32, "Dictionary file %s is too large", fileName);   /* avoid extreme cases */
 | 
			
		||||
        DISPLAYLEVEL(2,"Dictionary %s is too large : using last %u bytes only \n", fileName, MAX_DICT_SIZE);
 | 
			
		||||
        seekResult = fseek(fileHandle, (long int)(fileSize-MAX_DICT_SIZE), SEEK_SET);   /* use end of file */
 | 
			
		||||
        if (seekResult != 0) EXM_THROW(33, "Error seeking into file %s", fileName);
 | 
			
		||||
        if (seekResult != 0) EXM_THROW(33, "zstd: %s: %s", fileName, strerror(errno));
 | 
			
		||||
        fileSize = MAX_DICT_SIZE;
 | 
			
		||||
    }
 | 
			
		||||
    *bufferPtr = (BYTE*)malloc((size_t)fileSize);
 | 
			
		||||
    if (*bufferPtr==NULL) EXM_THROW(34, "Allocation error : not enough memory for dictBuffer");
 | 
			
		||||
    *bufferPtr = malloc((size_t)fileSize);
 | 
			
		||||
    if (*bufferPtr==NULL) EXM_THROW(34, "zstd: %s", strerror(errno));
 | 
			
		||||
    { size_t const readSize = fread(*bufferPtr, 1, (size_t)fileSize, fileHandle);
 | 
			
		||||
      if (readSize!=fileSize) EXM_THROW(35, "Error reading dictionary file %s", fileName); }
 | 
			
		||||
    fclose(fileHandle);
 | 
			
		||||
@@ -271,16 +273,15 @@ typedef struct {
 | 
			
		||||
static cRess_t FIO_createCResources(const char* dictFileName)
 | 
			
		||||
{
 | 
			
		||||
    cRess_t ress;
 | 
			
		||||
    memset(&ress, 0, sizeof(ress));
 | 
			
		||||
 | 
			
		||||
    ress.ctx = ZBUFF_createCCtx();
 | 
			
		||||
    if (ress.ctx == NULL) EXM_THROW(30, "Allocation error : can't create ZBUFF context");
 | 
			
		||||
 | 
			
		||||
    /* Allocate Memory */
 | 
			
		||||
    if (ress.ctx == NULL) EXM_THROW(30, "zstd: allocation error : can't create ZBUFF context");
 | 
			
		||||
    ress.srcBufferSize = ZBUFF_recommendedCInSize();
 | 
			
		||||
    ress.srcBuffer = malloc(ress.srcBufferSize);
 | 
			
		||||
    ress.dstBufferSize = ZBUFF_recommendedCOutSize();
 | 
			
		||||
    ress.dstBuffer = malloc(ress.dstBufferSize);
 | 
			
		||||
    if (!ress.srcBuffer || !ress.dstBuffer) EXM_THROW(31, "Allocation error : not enough memory");
 | 
			
		||||
    if (!ress.srcBuffer || !ress.dstBuffer) EXM_THROW(31, "zstd: allocation error : not enough memory");
 | 
			
		||||
 | 
			
		||||
    /* dictionary */
 | 
			
		||||
    ress.dictBufferSize = FIO_loadFile(&(ress.dictBuffer), dictFileName);
 | 
			
		||||
@@ -295,7 +296,7 @@ static void FIO_freeCResources(cRess_t ress)
 | 
			
		||||
    free(ress.dstBuffer);
 | 
			
		||||
    free(ress.dictBuffer);
 | 
			
		||||
    errorCode = ZBUFF_freeCCtx(ress.ctx);
 | 
			
		||||
    if (ZBUFF_isError(errorCode)) EXM_THROW(38, "Error : can't release ZBUFF context resource : %s", ZBUFF_getErrorName(errorCode));
 | 
			
		||||
    if (ZBUFF_isError(errorCode)) EXM_THROW(38, "zstd: error : can't release ZBUFF context resource : %s", ZBUFF_getErrorName(errorCode));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -315,9 +316,7 @@ static int FIO_compressFilename_internal(cRess_t ress,
 | 
			
		||||
    U64 const fileSize = UTIL_getFileSize(srcFileName);
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    {   ZSTD_parameters params;
 | 
			
		||||
        memset(¶ms, 0, sizeof(params));
 | 
			
		||||
        params.cParams = ZSTD_getCParams(cLevel, fileSize, ress.dictBufferSize);
 | 
			
		||||
    {   ZSTD_parameters params = ZSTD_getParams(cLevel, fileSize, ress.dictBufferSize);
 | 
			
		||||
        params.fParams.contentSizeFlag = 1;
 | 
			
		||||
        params.fParams.checksumFlag = g_checksumFlag;
 | 
			
		||||
        params.fParams.noDictIDFlag = !g_dictIDFlag;
 | 
			
		||||
@@ -330,7 +329,6 @@ static int FIO_compressFilename_internal(cRess_t ress,
 | 
			
		||||
    }   }
 | 
			
		||||
 | 
			
		||||
    /* Main compression loop */
 | 
			
		||||
    readsize = 0;
 | 
			
		||||
    while (1) {
 | 
			
		||||
        /* Fill input Buffer */
 | 
			
		||||
        size_t const inSize = fread(ress.srcBuffer, (size_t)1, ress.srcBufferSize, srcFile);
 | 
			
		||||
@@ -338,8 +336,8 @@ static int FIO_compressFilename_internal(cRess_t ress,
 | 
			
		||||
        readsize += inSize;
 | 
			
		||||
        DISPLAYUPDATE(2, "\rRead : %u MB  ", (U32)(readsize>>20));
 | 
			
		||||
 | 
			
		||||
        {   /* Compress using buffered streaming */
 | 
			
		||||
            size_t usedInSize = inSize;
 | 
			
		||||
        /* Compress using buffered streaming */
 | 
			
		||||
        {   size_t usedInSize = inSize;
 | 
			
		||||
            size_t cSize = ress.dstBufferSize;
 | 
			
		||||
            { size_t const result = ZBUFF_compressContinue(ress.ctx, ress.dstBuffer, &cSize, ress.srcBuffer, &usedInSize);
 | 
			
		||||
              if (ZBUFF_isError(result)) EXM_THROW(23, "Compression error : %s ", ZBUFF_getErrorName(result)); }
 | 
			
		||||
@@ -366,17 +364,19 @@ static int FIO_compressFilename_internal(cRess_t ress,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Status */
 | 
			
		||||
    if (strlen(srcFileName) > 20) srcFileName += strlen(srcFileName)-20; /* display last 20 characters */
 | 
			
		||||
    DISPLAYLEVEL(2, "\r%79s\r", "");
 | 
			
		||||
    DISPLAYLEVEL(2,"%-20.20s :%6.2f%%   (%6llu =>%6llu bytes, %s) \n", srcFileName,
 | 
			
		||||
        (double)compressedfilesize/readsize*100, (unsigned long long)readsize, (unsigned long long) compressedfilesize,
 | 
			
		||||
                 dstFileName);
 | 
			
		||||
    DISPLAYLEVEL(2,"%-20.20s :%6.2f%%   (%6llu => %6llu bytes, %s) \n", srcFileName,
 | 
			
		||||
        (double)compressedfilesize/(readsize+(!readsize) /* avoid div by zero */ )*100,
 | 
			
		||||
        (unsigned long long)readsize, (unsigned long long) compressedfilesize,
 | 
			
		||||
         dstFileName);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*! FIO_compressFilename_internal() :
 | 
			
		||||
 *  same as FIO_compressFilename_extRess(), with ress.destFile already opened (typically stdout)
 | 
			
		||||
/*! FIO_compressFilename_srcFile() :
 | 
			
		||||
 *  note : ress.destFile already opened
 | 
			
		||||
 *  @return : 0 : compression completed correctly,
 | 
			
		||||
 *            1 : missing or pb opening srcFileName
 | 
			
		||||
 */
 | 
			
		||||
@@ -397,7 +397,7 @@ static int FIO_compressFilename_srcFile(cRess_t ress,
 | 
			
		||||
    result = FIO_compressFilename_internal(ress, dstFileName, srcFileName, cLevel);
 | 
			
		||||
 | 
			
		||||
    fclose(ress.srcFile);
 | 
			
		||||
    if ((g_removeSrcFile) && (!result)) remove(srcFileName);
 | 
			
		||||
    if ((g_removeSrcFile) && (!result)) { if (remove(srcFileName)) EXM_THROW(1, "zstd: %s: %s", srcFileName, strerror(errno)); }
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -417,8 +417,8 @@ static int FIO_compressFilename_dstFile(cRess_t ress,
 | 
			
		||||
 | 
			
		||||
    result = FIO_compressFilename_srcFile(ress, dstFileName, srcFileName, cLevel);
 | 
			
		||||
 | 
			
		||||
    if (fclose(ress.dstFile)) EXM_THROW(28, "Write error : cannot properly close %s", dstFileName);
 | 
			
		||||
    if (result!=0) remove(dstFileName);   /* remove operation artefact */
 | 
			
		||||
    if (fclose(ress.dstFile)) { DISPLAYLEVEL(1, "zstd: %s: %s \n", dstFileName, strerror(errno)); result=1; }
 | 
			
		||||
    if (result!=0) { if (remove(dstFileName)) EXM_THROW(1, "zstd: %s: %s", dstFileName, strerror(errno)); }  /* remove operation artefact */
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -429,13 +429,13 @@ int FIO_compressFilename(const char* dstFileName, const char* srcFileName,
 | 
			
		||||
    clock_t const start = clock();
 | 
			
		||||
 | 
			
		||||
    cRess_t const ress = FIO_createCResources(dictFileName);
 | 
			
		||||
    int const issueWithSrcFile = FIO_compressFilename_dstFile(ress, dstFileName, srcFileName, compressionLevel);
 | 
			
		||||
    FIO_freeCResources(ress);
 | 
			
		||||
    int const result = FIO_compressFilename_dstFile(ress, dstFileName, srcFileName, compressionLevel);
 | 
			
		||||
 | 
			
		||||
    {   double const seconds = (double)(clock() - start) / CLOCKS_PER_SEC;
 | 
			
		||||
        DISPLAYLEVEL(4, "Completed in %.2f sec \n", seconds);
 | 
			
		||||
    }
 | 
			
		||||
    return issueWithSrcFile;
 | 
			
		||||
    double const seconds = (double)(clock() - start) / CLOCKS_PER_SEC;
 | 
			
		||||
    DISPLAYLEVEL(4, "Completed in %.2f sec \n", seconds);
 | 
			
		||||
 | 
			
		||||
    FIO_freeCResources(ress);
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -444,13 +444,14 @@ int FIO_compressMultipleFilenames(const char** inFileNamesTable, unsigned nbFile
 | 
			
		||||
                                  const char* dictFileName, int compressionLevel)
 | 
			
		||||
{
 | 
			
		||||
    int missed_files = 0;
 | 
			
		||||
    char*  dstFileName = (char*)malloc(FNSPACE);
 | 
			
		||||
    size_t dfnSize = FNSPACE;
 | 
			
		||||
    char*  dstFileName = (char*)malloc(FNSPACE);
 | 
			
		||||
    size_t const suffixSize = suffix ? strlen(suffix) : 0;
 | 
			
		||||
    cRess_t ress;
 | 
			
		||||
    cRess_t ress = FIO_createCResources(dictFileName);
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    ress = FIO_createCResources(dictFileName);
 | 
			
		||||
    if (dstFileName==NULL) EXM_THROW(27, "FIO_compressMultipleFilenames : allocation error for dstFileName");
 | 
			
		||||
    if (suffix == NULL) EXM_THROW(28, "FIO_compressMultipleFilenames : dst unknown");  /* should never happen */
 | 
			
		||||
 | 
			
		||||
    /* loop on each file */
 | 
			
		||||
    if (!strcmp(suffix, stdoutmark)) {
 | 
			
		||||
@@ -502,12 +503,11 @@ typedef struct {
 | 
			
		||||
static dRess_t FIO_createDResources(const char* dictFileName)
 | 
			
		||||
{
 | 
			
		||||
    dRess_t ress;
 | 
			
		||||
    memset(&ress, 0, sizeof(ress));
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    /* Allocation */
 | 
			
		||||
    ress.dctx = ZBUFF_createDCtx();
 | 
			
		||||
    if (ress.dctx==NULL) EXM_THROW(60, "Can't create ZBUFF decompression context");
 | 
			
		||||
 | 
			
		||||
    /* Allocate Memory */
 | 
			
		||||
    ress.srcBufferSize = ZBUFF_recommendedDInSize();
 | 
			
		||||
    ress.srcBuffer = malloc(ress.srcBufferSize);
 | 
			
		||||
    ress.dstBufferSize = ZBUFF_recommendedDOutSize();
 | 
			
		||||
@@ -700,16 +700,19 @@ static int FIO_decompressSrcFile(dRess_t ress, const char* srcFileName)
 | 
			
		||||
        if (sizeCheck != toRead) EXM_THROW(31, "zstd: %s read error : cannot read header", srcFileName);
 | 
			
		||||
        {   U32 const magic = MEM_readLE32(ress.srcBuffer);
 | 
			
		||||
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
 | 
			
		||||
            if (ZSTD_isLegacy(magic)) {
 | 
			
		||||
            if (ZSTD_isLegacy(ress.srcBuffer, 4)) {
 | 
			
		||||
                filesize += FIO_decompressLegacyFrame(dstFile, srcFile, ress.dictBuffer, ress.dictBufferSize, magic);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
            if (((magic & 0xFFFFFFF0U) != ZSTD_MAGIC_SKIPPABLE_START) && (magic != ZSTD_MAGICNUMBER)) {
 | 
			
		||||
                if (g_overwrite)   /* -df : pass-through mode */
 | 
			
		||||
                    return FIO_passThrough(dstFile, srcFile, ress.srcBuffer, ress.srcBufferSize);
 | 
			
		||||
                else {
 | 
			
		||||
                if (g_overwrite) {  /* -df : pass-through mode */
 | 
			
		||||
                    unsigned const result = FIO_passThrough(dstFile, srcFile, ress.srcBuffer, ress.srcBufferSize);
 | 
			
		||||
                    if (fclose(srcFile)) EXM_THROW(32, "zstd: %s close error", srcFileName);  /* error should never happen */
 | 
			
		||||
                    return result;
 | 
			
		||||
                } else {
 | 
			
		||||
                    DISPLAYLEVEL(1, "zstd: %s: not in zstd format \n", srcFileName);
 | 
			
		||||
                    fclose(srcFile);
 | 
			
		||||
                    return 1;
 | 
			
		||||
        }   }   }
 | 
			
		||||
        filesize += FIO_decompressFrame(ress, dstFile, srcFile, toRead);
 | 
			
		||||
@@ -720,8 +723,8 @@ static int FIO_decompressSrcFile(dRess_t ress, const char* srcFileName)
 | 
			
		||||
    DISPLAYLEVEL(2, "%-20.20s: %llu bytes \n", srcFileName, filesize);
 | 
			
		||||
 | 
			
		||||
    /* Close */
 | 
			
		||||
    fclose(srcFile);
 | 
			
		||||
    if (g_removeSrcFile) remove(srcFileName);
 | 
			
		||||
    if (fclose(srcFile)) EXM_THROW(33, "zstd: %s close error", srcFileName);  /* error should never happen */
 | 
			
		||||
    if (g_removeSrcFile) { if (remove(srcFileName)) EXM_THROW(34, "zstd: %s: %s", srcFileName, strerror(errno)); };
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -741,7 +744,7 @@ static int FIO_decompressDstFile(dRess_t ress,
 | 
			
		||||
    result = FIO_decompressSrcFile(ress, srcFileName);
 | 
			
		||||
 | 
			
		||||
    if (fclose(ress.dstFile)) EXM_THROW(38, "Write error : cannot properly close %s", dstFileName);
 | 
			
		||||
    if (result != 0) remove(dstFileName);
 | 
			
		||||
    if (result != 0) if (remove(dstFileName)) EXM_THROW(39, "remove %s error : %s", dstFileName, strerror(errno));
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -768,19 +771,21 @@ int FIO_decompressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles
 | 
			
		||||
    int missingFiles = 0;
 | 
			
		||||
    dRess_t ress = FIO_createDResources(dictFileName);
 | 
			
		||||
 | 
			
		||||
    if (suffix==NULL) EXM_THROW(70, "zstd: decompression: unknown dst");   /* should never happen */
 | 
			
		||||
 | 
			
		||||
    if (!strcmp(suffix, stdoutmark) || !strcmp(suffix, nulmark)) {
 | 
			
		||||
        unsigned u;
 | 
			
		||||
        ress.dstFile = FIO_openDstFile(suffix);
 | 
			
		||||
        if (ress.dstFile == 0) EXM_THROW(71, "cannot open %s", suffix);
 | 
			
		||||
        for (u=0; u<nbFiles; u++)
 | 
			
		||||
            missingFiles += FIO_decompressSrcFile(ress, srcNamesTable[u]);
 | 
			
		||||
        if (fclose(ress.dstFile)) EXM_THROW(39, "Write error : cannot properly close %s", stdoutmark);
 | 
			
		||||
        if (fclose(ress.dstFile)) EXM_THROW(72, "Write error : cannot properly close %s", stdoutmark);
 | 
			
		||||
    } else {
 | 
			
		||||
        size_t const suffixSize = suffix ? strlen(suffix) : 0;
 | 
			
		||||
        size_t const suffixSize = strlen(suffix);
 | 
			
		||||
        size_t dfnSize = FNSPACE;
 | 
			
		||||
        unsigned u;
 | 
			
		||||
        char* dstFileName = (char*)malloc(FNSPACE);
 | 
			
		||||
        if (dstFileName==NULL) EXM_THROW(70, "not enough memory for dstFileName");
 | 
			
		||||
        if (dstFileName==NULL) EXM_THROW(73, "not enough memory for dstFileName");
 | 
			
		||||
        for (u=0; u<nbFiles; u++) {   /* create dstFileName */
 | 
			
		||||
            const char* const srcFileName = srcNamesTable[u];
 | 
			
		||||
            size_t const sfnSize = strlen(srcFileName);
 | 
			
		||||
@@ -789,7 +794,7 @@ int FIO_decompressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles
 | 
			
		||||
                free(dstFileName);
 | 
			
		||||
                dfnSize = sfnSize + 20;
 | 
			
		||||
                dstFileName = (char*)malloc(dfnSize);
 | 
			
		||||
                if (dstFileName==NULL) EXM_THROW(71, "not enough memory for dstFileName");
 | 
			
		||||
                if (dstFileName==NULL) EXM_THROW(74, "not enough memory for dstFileName");
 | 
			
		||||
            }
 | 
			
		||||
            if (sfnSize <= suffixSize || strcmp(suffixPtr, suffix) != 0) {
 | 
			
		||||
                DISPLAYLEVEL(1, "zstd: %s: unknown suffix (%4s expected) -- ignored \n", srcFileName, suffix);
 | 
			
		||||
 
 | 
			
		||||
@@ -40,8 +40,9 @@
 | 
			
		||||
#include <sys/timeb.h>   /* timeb */
 | 
			
		||||
#include <string.h>      /* strcmp */
 | 
			
		||||
#include <time.h>        /* clock_t */
 | 
			
		||||
#define ZSTD_STATIC_LINKING_ONLY   /* ZSTD_compressContinue */
 | 
			
		||||
#include "zstd.h"        /* ZSTD_VERSION_STRING, ZSTD_getErrorCode */
 | 
			
		||||
#define ZSTD_STATIC_LINKING_ONLY   /* ZSTD_compressContinue, ZSTD_compressBlock */
 | 
			
		||||
#include "zstd.h"        /* ZSTD_VERSION_STRING */
 | 
			
		||||
#include "error_public.h" /* ZSTD_getErrorCode */
 | 
			
		||||
#include "zdict.h"       /* ZDICT_trainFromBuffer */
 | 
			
		||||
#include "datagen.h"     /* RDG_genBuffer */
 | 
			
		||||
#include "mem.h"
 | 
			
		||||
@@ -109,9 +110,9 @@ static unsigned FUZ_highbit32(U32 v32)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define CHECKTEST(var, fn)  size_t const var = fn; if (ZSTD_isError(var)) goto _output_error
 | 
			
		||||
#define CHECK(fn)  { CHECKTEST(err, fn); }
 | 
			
		||||
#define CHECKPLUS(var, fn, more)  { CHECKTEST(var, fn); more; }
 | 
			
		||||
#define CHECK_V(var, fn)  size_t const var = fn; if (ZSTD_isError(var)) goto _output_error
 | 
			
		||||
#define CHECK(fn)  { CHECK_V(err, fn); }
 | 
			
		||||
#define CHECKPLUS(var, fn, more)  { CHECK_V(var, fn); more; }
 | 
			
		||||
static int basicUnitTests(U32 seed, double compressibility)
 | 
			
		||||
{
 | 
			
		||||
    size_t const CNBuffSize = 5 MB;
 | 
			
		||||
@@ -137,6 +138,12 @@ static int basicUnitTests(U32 seed, double compressibility)
 | 
			
		||||
              cSize=r );
 | 
			
		||||
    DISPLAYLEVEL(4, "OK (%u bytes : %.2f%%)\n", (U32)cSize, (double)cSize/CNBuffSize*100);
 | 
			
		||||
 | 
			
		||||
    DISPLAYLEVEL(4, "test%3i : decompressed size test : ", testNb++);
 | 
			
		||||
    {   unsigned long long const rSize = ZSTD_getDecompressedSize(compressedBuffer, cSize);
 | 
			
		||||
        if (rSize != CNBuffSize) goto _output_error;
 | 
			
		||||
    }
 | 
			
		||||
    DISPLAYLEVEL(4, "OK \n");
 | 
			
		||||
 | 
			
		||||
    DISPLAYLEVEL(4, "test%3i : decompress %u bytes : ", testNb++, (U32)CNBuffSize);
 | 
			
		||||
    CHECKPLUS( r , ZSTD_decompress(decodedBuffer, CNBuffSize, compressedBuffer, cSize),
 | 
			
		||||
               if (r != CNBuffSize) goto _output_error);
 | 
			
		||||
@@ -202,7 +209,7 @@ static int basicUnitTests(U32 seed, double compressibility)
 | 
			
		||||
                      cSize += r);
 | 
			
		||||
            CHECKPLUS(r, ZSTD_compressEnd(ctxDuplicated, (char*)compressedBuffer+cSize, ZSTD_compressBound(CNBuffSize)-cSize),
 | 
			
		||||
                      cSize += r);
 | 
			
		||||
            if (cSize != cSizeOrig) goto _output_error;   /* should be identical ==> have same size */
 | 
			
		||||
            if (cSize != cSizeOrig) goto _output_error;   /* should be identical ==> same size */
 | 
			
		||||
        }
 | 
			
		||||
        DISPLAYLEVEL(4, "OK (%u bytes : %.2f%%)\n", (U32)cSize, (double)cSize/CNBuffSize*100);
 | 
			
		||||
 | 
			
		||||
@@ -216,10 +223,8 @@ static int basicUnitTests(U32 seed, double compressibility)
 | 
			
		||||
 | 
			
		||||
        DISPLAYLEVEL(4, "test%3i : check content size on duplicated context : ", testNb++);
 | 
			
		||||
        {   size_t const testSize = CNBuffSize / 3;
 | 
			
		||||
            {   ZSTD_compressionParameters const cPar = ZSTD_getCParams(2, testSize, dictSize);
 | 
			
		||||
                ZSTD_frameParameters const fPar = { 1 , 0 , 0 };
 | 
			
		||||
                ZSTD_parameters p;
 | 
			
		||||
                p.cParams = cPar; p.fParams = fPar;
 | 
			
		||||
            {   ZSTD_parameters p = ZSTD_getParams(2, testSize, dictSize);
 | 
			
		||||
                p.fParams.contentSizeFlag = 1;
 | 
			
		||||
                CHECK( ZSTD_compressBegin_advanced(ctxOrig, CNBuffer, dictSize, p, testSize-1) );
 | 
			
		||||
            }
 | 
			
		||||
            CHECK( ZSTD_copyCCtx(ctxDuplicated, ctxOrig) );
 | 
			
		||||
@@ -277,10 +282,8 @@ static int basicUnitTests(U32 seed, double compressibility)
 | 
			
		||||
        DISPLAYLEVEL(4, "OK \n");
 | 
			
		||||
 | 
			
		||||
        DISPLAYLEVEL(4, "test%3i : compress without dictID : ", testNb++);
 | 
			
		||||
        {   ZSTD_frameParameters const fParams = { 0 /*contentSize*/, 0 /*checksum*/, 1 /*NoDictID*/ };
 | 
			
		||||
            ZSTD_compressionParameters const cParams = ZSTD_getCParams(3, CNBuffSize, dictSize);
 | 
			
		||||
            ZSTD_parameters p;
 | 
			
		||||
            p.cParams = cParams; p.fParams = fParams;
 | 
			
		||||
        {   ZSTD_parameters p = ZSTD_getParams(3, CNBuffSize, dictSize);
 | 
			
		||||
            p.fParams.noDictIDFlag = 1;
 | 
			
		||||
            cSize = ZSTD_compress_advanced(cctx, compressedBuffer, ZSTD_compressBound(CNBuffSize),
 | 
			
		||||
                                           CNBuffer, CNBuffSize,
 | 
			
		||||
                                           dictBuffer, dictSize, p);
 | 
			
		||||
@@ -318,8 +321,9 @@ static int basicUnitTests(U32 seed, double compressibility)
 | 
			
		||||
    /* block API tests */
 | 
			
		||||
    {   ZSTD_CCtx* const cctx = ZSTD_createCCtx();
 | 
			
		||||
        ZSTD_DCtx* const dctx = ZSTD_createDCtx();
 | 
			
		||||
        static const size_t blockSize = 100 KB;
 | 
			
		||||
        static const size_t dictSize = 16 KB;
 | 
			
		||||
        static const size_t dictSize = 65 KB;
 | 
			
		||||
        static const size_t blockSize = 100 KB;   /* won't cause pb with small dict size */
 | 
			
		||||
        size_t cSize2;
 | 
			
		||||
 | 
			
		||||
        /* basic block compression */
 | 
			
		||||
        DISPLAYLEVEL(4, "test%3i : Block compression test : ", testNb++);
 | 
			
		||||
@@ -330,7 +334,7 @@ static int basicUnitTests(U32 seed, double compressibility)
 | 
			
		||||
 | 
			
		||||
        DISPLAYLEVEL(4, "test%3i : Block decompression test : ", testNb++);
 | 
			
		||||
        CHECK( ZSTD_decompressBegin(dctx) );
 | 
			
		||||
        { CHECKTEST(r, ZSTD_decompressBlock(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize) );
 | 
			
		||||
        { CHECK_V(r, ZSTD_decompressBlock(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize) );
 | 
			
		||||
          if (r != blockSize) goto _output_error; }
 | 
			
		||||
        DISPLAYLEVEL(4, "OK \n");
 | 
			
		||||
 | 
			
		||||
@@ -339,11 +343,20 @@ static int basicUnitTests(U32 seed, double compressibility)
 | 
			
		||||
        CHECK( ZSTD_compressBegin_usingDict(cctx, CNBuffer, dictSize, 5) );
 | 
			
		||||
        cSize = ZSTD_compressBlock(cctx, compressedBuffer, ZSTD_compressBound(blockSize), (char*)CNBuffer+dictSize, blockSize);
 | 
			
		||||
        if (ZSTD_isError(cSize)) goto _output_error;
 | 
			
		||||
        cSize2 = ZSTD_compressBlock(cctx, (char*)compressedBuffer+cSize, ZSTD_compressBound(blockSize), (char*)CNBuffer+dictSize+blockSize, blockSize);
 | 
			
		||||
        if (ZSTD_isError(cSize2)) goto _output_error;
 | 
			
		||||
        memcpy((char*)compressedBuffer+cSize, (char*)CNBuffer+dictSize+blockSize, blockSize);   /* fake non-compressed block */
 | 
			
		||||
        cSize2 = ZSTD_compressBlock(cctx, (char*)compressedBuffer+cSize+blockSize, ZSTD_compressBound(blockSize),
 | 
			
		||||
                                          (char*)CNBuffer+dictSize+2*blockSize, blockSize);
 | 
			
		||||
        if (ZSTD_isError(cSize2)) goto _output_error;
 | 
			
		||||
        DISPLAYLEVEL(4, "OK \n");
 | 
			
		||||
 | 
			
		||||
        DISPLAYLEVEL(4, "test%3i : Dictionary Block decompression test : ", testNb++);
 | 
			
		||||
        CHECK( ZSTD_decompressBegin_usingDict(dctx, CNBuffer, dictSize) );
 | 
			
		||||
        { CHECKTEST( r, ZSTD_decompressBlock(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize) );
 | 
			
		||||
        { CHECK_V( r, ZSTD_decompressBlock(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize) );
 | 
			
		||||
          if (r != blockSize) goto _output_error; }
 | 
			
		||||
        ZSTD_insertBlock(dctx, (char*)decodedBuffer+blockSize, blockSize);   /* insert non-compressed block into dctx history */
 | 
			
		||||
        { CHECK_V( r, ZSTD_decompressBlock(dctx, (char*)decodedBuffer+2*blockSize, CNBuffSize, (char*)compressedBuffer+cSize+blockSize, cSize2) );
 | 
			
		||||
          if (r != blockSize) goto _output_error; }
 | 
			
		||||
        DISPLAYLEVEL(4, "OK \n");
 | 
			
		||||
 | 
			
		||||
@@ -361,7 +374,7 @@ static int basicUnitTests(U32 seed, double compressibility)
 | 
			
		||||
        sampleSize += 96 KB;
 | 
			
		||||
        cSize = ZSTD_compress(compressedBuffer, ZSTD_compressBound(sampleSize), CNBuffer, sampleSize, 1);
 | 
			
		||||
        if (ZSTD_isError(cSize)) goto _output_error;
 | 
			
		||||
        { CHECKTEST(regenSize, ZSTD_decompress(decodedBuffer, sampleSize, compressedBuffer, cSize));
 | 
			
		||||
        { CHECK_V(regenSize, ZSTD_decompress(decodedBuffer, sampleSize, compressedBuffer, cSize));
 | 
			
		||||
          if (regenSize!=sampleSize) goto _output_error; }
 | 
			
		||||
        DISPLAYLEVEL(4, "OK \n");
 | 
			
		||||
    }
 | 
			
		||||
@@ -370,12 +383,12 @@ static int basicUnitTests(U32 seed, double compressibility)
 | 
			
		||||
    #define ZEROESLENGTH 100
 | 
			
		||||
    DISPLAYLEVEL(4, "test%3i : compress %u zeroes : ", testNb++, ZEROESLENGTH);
 | 
			
		||||
    memset(CNBuffer, 0, ZEROESLENGTH);
 | 
			
		||||
    { CHECKTEST(r, ZSTD_compress(compressedBuffer, ZSTD_compressBound(ZEROESLENGTH), CNBuffer, ZEROESLENGTH, 1) );
 | 
			
		||||
    { CHECK_V(r, ZSTD_compress(compressedBuffer, ZSTD_compressBound(ZEROESLENGTH), CNBuffer, ZEROESLENGTH, 1) );
 | 
			
		||||
      cSize = r; }
 | 
			
		||||
    DISPLAYLEVEL(4, "OK (%u bytes : %.2f%%)\n", (U32)cSize, (double)cSize/ZEROESLENGTH*100);
 | 
			
		||||
 | 
			
		||||
    DISPLAYLEVEL(4, "test%3i : decompress %u zeroes : ", testNb++, ZEROESLENGTH);
 | 
			
		||||
    { CHECKTEST(r, ZSTD_decompress(decodedBuffer, ZEROESLENGTH, compressedBuffer, cSize) );
 | 
			
		||||
    { CHECK_V(r, ZSTD_decompress(decodedBuffer, ZEROESLENGTH, compressedBuffer, cSize) );
 | 
			
		||||
      if (r != ZEROESLENGTH) goto _output_error; }
 | 
			
		||||
    DISPLAYLEVEL(4, "OK \n");
 | 
			
		||||
 | 
			
		||||
@@ -389,27 +402,29 @@ static int basicUnitTests(U32 seed, double compressibility)
 | 
			
		||||
        U32 rSeed = 1;
 | 
			
		||||
 | 
			
		||||
        /* create batch of 3-bytes sequences */
 | 
			
		||||
        { int i; for (i=0; i < NB3BYTESSEQ; i++) {
 | 
			
		||||
            _3BytesSeqs[i][0] = (BYTE)(FUZ_rand(&rSeed) & 255);
 | 
			
		||||
            _3BytesSeqs[i][1] = (BYTE)(FUZ_rand(&rSeed) & 255);
 | 
			
		||||
            _3BytesSeqs[i][2] = (BYTE)(FUZ_rand(&rSeed) & 255);
 | 
			
		||||
        }}
 | 
			
		||||
        {   int i;
 | 
			
		||||
            for (i=0; i < NB3BYTESSEQ; i++) {
 | 
			
		||||
                _3BytesSeqs[i][0] = (BYTE)(FUZ_rand(&rSeed) & 255);
 | 
			
		||||
                _3BytesSeqs[i][1] = (BYTE)(FUZ_rand(&rSeed) & 255);
 | 
			
		||||
                _3BytesSeqs[i][2] = (BYTE)(FUZ_rand(&rSeed) & 255);
 | 
			
		||||
        }   }
 | 
			
		||||
 | 
			
		||||
        /* randomly fills CNBuffer with prepared 3-bytes sequences */
 | 
			
		||||
        { int i; for (i=0; i < _3BYTESTESTLENGTH; i += 3) {   /* note : CNBuffer size > _3BYTESTESTLENGTH+3 */
 | 
			
		||||
            U32 const id = FUZ_rand(&rSeed) & NB3BYTESSEQMASK;
 | 
			
		||||
            ((BYTE*)CNBuffer)[i+0] = _3BytesSeqs[id][0];
 | 
			
		||||
            ((BYTE*)CNBuffer)[i+1] = _3BytesSeqs[id][1];
 | 
			
		||||
            ((BYTE*)CNBuffer)[i+2] = _3BytesSeqs[id][2];
 | 
			
		||||
    }   }}
 | 
			
		||||
        {   int i;
 | 
			
		||||
            for (i=0; i < _3BYTESTESTLENGTH; i += 3) {   /* note : CNBuffer size > _3BYTESTESTLENGTH+3 */
 | 
			
		||||
                U32 const id = FUZ_rand(&rSeed) & NB3BYTESSEQMASK;
 | 
			
		||||
                ((BYTE*)CNBuffer)[i+0] = _3BytesSeqs[id][0];
 | 
			
		||||
                ((BYTE*)CNBuffer)[i+1] = _3BytesSeqs[id][1];
 | 
			
		||||
                ((BYTE*)CNBuffer)[i+2] = _3BytesSeqs[id][2];
 | 
			
		||||
    }   }   }
 | 
			
		||||
    DISPLAYLEVEL(4, "test%3i : compress lots 3-bytes sequences : ", testNb++);
 | 
			
		||||
    { CHECKTEST(r, ZSTD_compress(compressedBuffer, ZSTD_compressBound(_3BYTESTESTLENGTH),
 | 
			
		||||
    { CHECK_V(r, ZSTD_compress(compressedBuffer, ZSTD_compressBound(_3BYTESTESTLENGTH),
 | 
			
		||||
                                 CNBuffer, _3BYTESTESTLENGTH, 19) );
 | 
			
		||||
      cSize = r; }
 | 
			
		||||
    DISPLAYLEVEL(4, "OK (%u bytes : %.2f%%)\n", (U32)cSize, (double)cSize/_3BYTESTESTLENGTH*100);
 | 
			
		||||
 | 
			
		||||
    DISPLAYLEVEL(4, "test%3i : decompress lots 3-bytes sequence : ", testNb++);
 | 
			
		||||
    { CHECKTEST(r, ZSTD_decompress(decodedBuffer, _3BYTESTESTLENGTH, compressedBuffer, cSize) );
 | 
			
		||||
    { CHECK_V(r, ZSTD_decompress(decodedBuffer, _3BYTESTESTLENGTH, compressedBuffer, cSize) );
 | 
			
		||||
      if (r != _3BYTESTESTLENGTH) goto _output_error; }
 | 
			
		||||
    DISPLAYLEVEL(4, "OK \n");
 | 
			
		||||
 | 
			
		||||
@@ -555,6 +570,11 @@ static int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, U32 const maxD
 | 
			
		||||
                  CHECK(endCheck != endMark, "ZSTD_compressCCtx : dst buffer overflow"); }
 | 
			
		||||
        }   }
 | 
			
		||||
 | 
			
		||||
        /* Decompressed size test */
 | 
			
		||||
        {   unsigned long long const rSize = ZSTD_getDecompressedSize(cBuffer, cSize);
 | 
			
		||||
            CHECK(rSize != sampleSize, "decompressed size incorrect");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* frame header decompression test */
 | 
			
		||||
        {   ZSTD_frameParams dParams;
 | 
			
		||||
            size_t const check = ZSTD_getFrameParams(&dParams, cBuffer, cSize);
 | 
			
		||||
@@ -691,7 +711,7 @@ static int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, U32 const maxD
 | 
			
		||||
        while (totalCSize < cSize) {
 | 
			
		||||
            size_t const inSize = ZSTD_nextSrcSizeToDecompress(dctx);
 | 
			
		||||
            size_t const genSize = ZSTD_decompressContinue(dctx, dstBuffer+totalGenSize, dstBufferSize-totalGenSize, cBuffer+totalCSize, inSize);
 | 
			
		||||
            CHECK (ZSTD_isError(genSize), "streaming decompression error : %s", ZSTD_getErrorName(genSize));
 | 
			
		||||
            CHECK (ZSTD_isError(genSize), "ZSTD_decompressContinue error : %s", ZSTD_getErrorName(genSize));
 | 
			
		||||
            totalGenSize += genSize;
 | 
			
		||||
            totalCSize += inSize;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -22,33 +22,19 @@
 | 
			
		||||
    - zstd homepage : http://www.zstd.net/
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*-************************************
 | 
			
		||||
*  Compiler Options
 | 
			
		||||
**************************************/
 | 
			
		||||
/* gettimeofday() are not supported by MSVC */
 | 
			
		||||
#if defined(_MSC_VER) || defined(_WIN32)
 | 
			
		||||
#  define BMK_LEGACY_TIMER 1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-************************************
 | 
			
		||||
*  Dependencies
 | 
			
		||||
**************************************/
 | 
			
		||||
#include "util.h"         /* Compiler options, UTIL_GetFileSize */
 | 
			
		||||
#include <stdlib.h>       /* malloc */
 | 
			
		||||
#include <stdio.h>        /* fprintf, fopen, ftello64 */
 | 
			
		||||
#include <string.h>       /* strcmp */
 | 
			
		||||
#include <math.h>         /* log */
 | 
			
		||||
 | 
			
		||||
/* Use ftime() if gettimeofday() is not available on your target */
 | 
			
		||||
#if defined(BMK_LEGACY_TIMER)
 | 
			
		||||
#  include <sys/timeb.h>  /* timeb, ftime */
 | 
			
		||||
#else
 | 
			
		||||
#  include <sys/time.h>   /* gettimeofday */
 | 
			
		||||
#endif
 | 
			
		||||
#include "util.h"      /* Compiler options, UTIL_GetFileSize */
 | 
			
		||||
#include <stdlib.h>    /* malloc */
 | 
			
		||||
#include <stdio.h>     /* fprintf, fopen, ftello64 */
 | 
			
		||||
#include <string.h>    /* strcmp */
 | 
			
		||||
#include <math.h>      /* log */
 | 
			
		||||
#include <time.h>      /* clock_t */
 | 
			
		||||
 | 
			
		||||
#include "mem.h"
 | 
			
		||||
#define ZSTD_STATIC_LINKING_ONLY   /* ZSTD_parameters */
 | 
			
		||||
#define ZSTD_STATIC_LINKING_ONLY   /* ZSTD_parameters, ZSTD_estimateCCtxSize */
 | 
			
		||||
#include "zstd.h"
 | 
			
		||||
#include "datagen.h"
 | 
			
		||||
#include "xxhash.h"
 | 
			
		||||
@@ -67,7 +53,7 @@
 | 
			
		||||
#define GB *(1ULL<<30)
 | 
			
		||||
 | 
			
		||||
#define NBLOOPS    2
 | 
			
		||||
#define TIMELOOP   2000
 | 
			
		||||
#define TIMELOOP   (2 * CLOCKS_PER_SEC)
 | 
			
		||||
 | 
			
		||||
#define NB_LEVELS_TRACKED 30
 | 
			
		||||
 | 
			
		||||
@@ -76,9 +62,9 @@ static const size_t maxMemory = (sizeof(size_t)==4)  ?  (2 GB - 64 MB) : (size_t
 | 
			
		||||
#define COMPRESSIBILITY_DEFAULT 0.50
 | 
			
		||||
static const size_t sampleSize = 10000000;
 | 
			
		||||
 | 
			
		||||
static const int g_grillDuration = 50000000;   /* about 13 hours */
 | 
			
		||||
static const int g_maxParamTime = 15000;   /* 15 sec */
 | 
			
		||||
static const int g_maxVariationTime = 60000;   /* 60 sec */
 | 
			
		||||
static const U32 g_grillDuration_s = 60000;   /* about 16 hours */
 | 
			
		||||
static const clock_t g_maxParamTime = 15 * CLOCKS_PER_SEC;
 | 
			
		||||
static const clock_t g_maxVariationTime = 60 * CLOCKS_PER_SEC;
 | 
			
		||||
static const int g_maxNbVariations = 64;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -111,49 +97,15 @@ void BMK_SetNbIterations(int nbLoops)
 | 
			
		||||
*  Private functions
 | 
			
		||||
*********************************************************/
 | 
			
		||||
 | 
			
		||||
#if defined(BMK_LEGACY_TIMER)
 | 
			
		||||
static clock_t BMK_clockSpan(clock_t cStart) { return clock() - cStart; }  /* works even if overflow ; max span ~ 30 mn */
 | 
			
		||||
 | 
			
		||||
static int BMK_GetMilliStart(void)
 | 
			
		||||
{
 | 
			
		||||
  /* Based on Legacy ftime()
 | 
			
		||||
  *  Rolls over every ~ 12.1 days (0x100000/24/60/60)
 | 
			
		||||
  *  Use GetMilliSpan to correct for rollover */
 | 
			
		||||
  struct timeb tb;
 | 
			
		||||
  int nCount;
 | 
			
		||||
  ftime( &tb );
 | 
			
		||||
  nCount = (int) (tb.millitm + (tb.time & 0xfffff) * 1000);
 | 
			
		||||
  return nCount;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
static int BMK_GetMilliStart(void)
 | 
			
		||||
{
 | 
			
		||||
  /* Based on newer gettimeofday()
 | 
			
		||||
  *  Use GetMilliSpan to correct for rollover */
 | 
			
		||||
  struct timeval tv;
 | 
			
		||||
  int nCount;
 | 
			
		||||
  gettimeofday(&tv, NULL);
 | 
			
		||||
  nCount = (int) (tv.tv_usec/1000 + (tv.tv_sec & 0xfffff) * 1000);
 | 
			
		||||
  return nCount;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int BMK_GetMilliSpan( int nTimeStart )
 | 
			
		||||
{
 | 
			
		||||
  int nSpan = BMK_GetMilliStart() - nTimeStart;
 | 
			
		||||
  if ( nSpan < 0 )
 | 
			
		||||
    nSpan += 0x100000 * 1000;
 | 
			
		||||
  return nSpan;
 | 
			
		||||
}
 | 
			
		||||
static U32 BMK_timeSpan(time_t tStart) { return (U32)difftime(time(NULL), tStart); }  /* accuracy in seconds only, span can be multiple years */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static size_t BMK_findMaxMem(U64 requiredMem)
 | 
			
		||||
{
 | 
			
		||||
    size_t step = 64 MB;
 | 
			
		||||
    BYTE* testmem=NULL;
 | 
			
		||||
    size_t const step = 64 MB;
 | 
			
		||||
    void* testmem = NULL;
 | 
			
		||||
 | 
			
		||||
    requiredMem = (((requiredMem >> 26) + 1) << 26);
 | 
			
		||||
    if (requiredMem > maxMemory) requiredMem = maxMemory;
 | 
			
		||||
@@ -161,7 +113,7 @@ static size_t BMK_findMaxMem(U64 requiredMem)
 | 
			
		||||
    requiredMem += 2*step;
 | 
			
		||||
    while (!testmem) {
 | 
			
		||||
        requiredMem -= step;
 | 
			
		||||
        testmem = (BYTE*) malloc ((size_t)requiredMem);
 | 
			
		||||
        testmem = malloc ((size_t)requiredMem);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    free (testmem);
 | 
			
		||||
@@ -188,8 +140,8 @@ U32 FUZ_rand(U32* src)
 | 
			
		||||
*********************************************************/
 | 
			
		||||
typedef struct {
 | 
			
		||||
    size_t cSize;
 | 
			
		||||
    U32 cSpeed;
 | 
			
		||||
    U32 dSpeed;
 | 
			
		||||
    double cSpeed;
 | 
			
		||||
    double dSpeed;
 | 
			
		||||
} BMK_result_t;
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
@@ -265,35 +217,33 @@ static size_t BMK_benchParam(BMK_result_t* resultPtr,
 | 
			
		||||
    RDG_genBuffer(compressedBuffer, maxCompressedSize, 0.10, 0.10, 1);
 | 
			
		||||
 | 
			
		||||
    /* Bench */
 | 
			
		||||
    {
 | 
			
		||||
        U32 loopNb;
 | 
			
		||||
    {   U32 loopNb;
 | 
			
		||||
        size_t cSize = 0;
 | 
			
		||||
        double fastestC = 100000000., fastestD = 100000000.;
 | 
			
		||||
        double ratio = 0.;
 | 
			
		||||
        U64 crcCheck = 0;
 | 
			
		||||
        const int startTime =BMK_GetMilliStart();
 | 
			
		||||
        clock_t const benchStart = clock();
 | 
			
		||||
 | 
			
		||||
        DISPLAY("\r%79s\r", "");
 | 
			
		||||
        memset(¶ms, 0, sizeof(params));
 | 
			
		||||
        params.cParams = cParams;
 | 
			
		||||
        params.fParams.contentSizeFlag = 0;
 | 
			
		||||
        for (loopNb = 1; loopNb <= g_nbIterations; loopNb++) {
 | 
			
		||||
            int nbLoops;
 | 
			
		||||
            int milliTime;
 | 
			
		||||
            U32 blockNb;
 | 
			
		||||
            const int totalTime = BMK_GetMilliSpan(startTime);
 | 
			
		||||
            clock_t roundStart, roundClock;
 | 
			
		||||
 | 
			
		||||
            /* early break (slow params) */
 | 
			
		||||
            if (totalTime > g_maxParamTime) break;
 | 
			
		||||
            { clock_t const benchTime = BMK_clockSpan(benchStart);
 | 
			
		||||
              if (benchTime > g_maxParamTime) break; }
 | 
			
		||||
 | 
			
		||||
            /* Compression */
 | 
			
		||||
            DISPLAY("\r%1u-%s : %9u ->", loopNb, name, (U32)srcSize);
 | 
			
		||||
            memset(compressedBuffer, 0xE5, maxCompressedSize);
 | 
			
		||||
 | 
			
		||||
            nbLoops = 0;
 | 
			
		||||
            milliTime = BMK_GetMilliStart();
 | 
			
		||||
            while (BMK_GetMilliStart() == milliTime);
 | 
			
		||||
            milliTime = BMK_GetMilliStart();
 | 
			
		||||
            while (BMK_GetMilliSpan(milliTime) < TIMELOOP) {
 | 
			
		||||
            roundStart = clock();
 | 
			
		||||
            while (clock() == roundStart);
 | 
			
		||||
            roundStart = clock();
 | 
			
		||||
            while (BMK_clockSpan(roundStart) < TIMELOOP) {
 | 
			
		||||
                for (blockNb=0; blockNb<nbBlocks; blockNb++)
 | 
			
		||||
                    blockTable[blockNb].cSize = ZSTD_compress_advanced(ctx,
 | 
			
		||||
                                                    blockTable[blockNb].cPtr,  blockTable[blockNb].cRoom,
 | 
			
		||||
@@ -302,40 +252,40 @@ static size_t BMK_benchParam(BMK_result_t* resultPtr,
 | 
			
		||||
                                                    params);
 | 
			
		||||
                nbLoops++;
 | 
			
		||||
            }
 | 
			
		||||
            milliTime = BMK_GetMilliSpan(milliTime);
 | 
			
		||||
            roundClock = BMK_clockSpan(roundStart);
 | 
			
		||||
 | 
			
		||||
            cSize = 0;
 | 
			
		||||
            for (blockNb=0; blockNb<nbBlocks; blockNb++)
 | 
			
		||||
                cSize += blockTable[blockNb].cSize;
 | 
			
		||||
            if ((double)milliTime < fastestC*nbLoops) fastestC = (double)milliTime / nbLoops;
 | 
			
		||||
            if ((double)roundClock < fastestC * CLOCKS_PER_SEC * nbLoops) fastestC = ((double)roundClock / CLOCKS_PER_SEC) / nbLoops;
 | 
			
		||||
            ratio = (double)srcSize / (double)cSize;
 | 
			
		||||
            DISPLAY("\r");
 | 
			
		||||
            DISPLAY("%1u-%s : %9u ->", loopNb, name, (U32)srcSize);
 | 
			
		||||
            DISPLAY(" %9u (%4.3f),%7.1f MB/s", (U32)cSize, ratio, (double)srcSize / fastestC / 1000.);
 | 
			
		||||
            DISPLAY(" %9u (%4.3f),%7.1f MB/s", (U32)cSize, ratio, (double)srcSize / fastestC / 1000000.);
 | 
			
		||||
            resultPtr->cSize = cSize;
 | 
			
		||||
            resultPtr->cSpeed = (U32)((double)srcSize / fastestC);
 | 
			
		||||
            resultPtr->cSpeed = (double)srcSize / fastestC;
 | 
			
		||||
 | 
			
		||||
#if 1
 | 
			
		||||
            /* Decompression */
 | 
			
		||||
            memset(resultBuffer, 0xD6, srcSize);
 | 
			
		||||
 | 
			
		||||
            nbLoops = 0;
 | 
			
		||||
            milliTime = BMK_GetMilliStart();
 | 
			
		||||
            while (BMK_GetMilliStart() == milliTime);
 | 
			
		||||
            milliTime = BMK_GetMilliStart();
 | 
			
		||||
            for ( ; BMK_GetMilliSpan(milliTime) < TIMELOOP; nbLoops++) {
 | 
			
		||||
            roundStart = clock();
 | 
			
		||||
            while (clock() == roundStart);
 | 
			
		||||
            roundStart = clock();
 | 
			
		||||
            for ( ; BMK_clockSpan(roundStart) < TIMELOOP; nbLoops++) {
 | 
			
		||||
                for (blockNb=0; blockNb<nbBlocks; blockNb++)
 | 
			
		||||
                    blockTable[blockNb].resSize = ZSTD_decompress(blockTable[blockNb].resPtr, blockTable[blockNb].srcSize,
 | 
			
		||||
                                                                  blockTable[blockNb].cPtr, blockTable[blockNb].cSize);
 | 
			
		||||
            }
 | 
			
		||||
            milliTime = BMK_GetMilliSpan(milliTime);
 | 
			
		||||
            roundClock = BMK_clockSpan(roundStart);
 | 
			
		||||
 | 
			
		||||
            if ((double)milliTime < fastestD*nbLoops) fastestD = (double)milliTime / nbLoops;
 | 
			
		||||
            if ((double)roundClock < fastestD * CLOCKS_PER_SEC * nbLoops) fastestD = ((double)roundClock / CLOCKS_PER_SEC) / nbLoops;
 | 
			
		||||
            DISPLAY("\r");
 | 
			
		||||
            DISPLAY("%1u-%s : %9u -> ", loopNb, name, (U32)srcSize);
 | 
			
		||||
            DISPLAY("%9u (%4.3f),%7.1f MB/s, ", (U32)cSize, ratio, (double)srcSize / fastestC / 1000.);
 | 
			
		||||
            DISPLAY("%7.1f MB/s", (double)srcSize / fastestD / 1000.);
 | 
			
		||||
            resultPtr->dSpeed = (U32)((double)srcSize / fastestD);
 | 
			
		||||
            DISPLAY("%9u (%4.3f),%7.1f MB/s, ", (U32)cSize, ratio, (double)srcSize / fastestC / 1000000.);
 | 
			
		||||
            DISPLAY("%7.1f MB/s", (double)srcSize / fastestD / 1000000.);
 | 
			
		||||
            resultPtr->dSpeed = (double)srcSize / fastestD;
 | 
			
		||||
 | 
			
		||||
            /* CRC Checking */
 | 
			
		||||
            crcCheck = XXH64(resultBuffer, srcSize, 0);
 | 
			
		||||
@@ -362,6 +312,7 @@ static size_t BMK_benchParam(BMK_result_t* resultPtr,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const char* g_stratName[] = { "ZSTD_fast   ",
 | 
			
		||||
                              "ZSTD_dfast  ",
 | 
			
		||||
                              "ZSTD_greedy ",
 | 
			
		||||
                              "ZSTD_lazy   ",
 | 
			
		||||
                              "ZSTD_lazy2  ",
 | 
			
		||||
@@ -376,11 +327,11 @@ static void BMK_printWinner(FILE* f, U32 cLevel, BMK_result_t result, ZSTD_compr
 | 
			
		||||
            params.targetLength, g_stratName[(U32)(params.strategy)]);
 | 
			
		||||
    fprintf(f,
 | 
			
		||||
            "/* level %2u */   /* R:%5.3f at %5.1f MB/s - %5.1f MB/s */\n",
 | 
			
		||||
            cLevel, (double)srcSize / result.cSize, (double)result.cSpeed / 1000., (double)result.dSpeed / 1000.);
 | 
			
		||||
            cLevel, (double)srcSize / result.cSize, result.cSpeed / 1000000., result.dSpeed / 1000000.);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static U32 g_cSpeedTarget[NB_LEVELS_TRACKED] = { 0 };   /* NB_LEVELS_TRACKED : checked at main() */
 | 
			
		||||
static double g_cSpeedTarget[NB_LEVELS_TRACKED] = { 0. };   /* NB_LEVELS_TRACKED : checked at main() */
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    BMK_result_t result;
 | 
			
		||||
@@ -407,8 +358,6 @@ static void BMK_printWinners(FILE* f, const winnerInfo_t* winners, size_t srcSiz
 | 
			
		||||
    BMK_printWinners2(stdout, winners, srcSize);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t ZSTD_sizeofCCtx(ZSTD_compressionParameters params);   /* hidden interface, declared here */
 | 
			
		||||
 | 
			
		||||
static int BMK_seed(winnerInfo_t* winners, const ZSTD_compressionParameters params,
 | 
			
		||||
              const void* srcBuffer, size_t srcSize,
 | 
			
		||||
                    ZSTD_CCtx* ctx)
 | 
			
		||||
@@ -442,17 +391,16 @@ static int BMK_seed(winnerInfo_t* winners, const ZSTD_compressionParameters para
 | 
			
		||||
            double W_DMemUsed_note = W_ratioNote * ( 40 + 9*cLevel) - log((double)W_DMemUsed);
 | 
			
		||||
            double O_DMemUsed_note = O_ratioNote * ( 40 + 9*cLevel) - log((double)O_DMemUsed);
 | 
			
		||||
 | 
			
		||||
            size_t W_CMemUsed = (1 << params.windowLog) + ZSTD_sizeofCCtx(params);
 | 
			
		||||
            size_t O_CMemUsed = (1 << winners[cLevel].params.windowLog) + ZSTD_sizeofCCtx(winners[cLevel].params);
 | 
			
		||||
            size_t W_CMemUsed = (1 << params.windowLog) + ZSTD_estimateCCtxSize(params);
 | 
			
		||||
            size_t O_CMemUsed = (1 << winners[cLevel].params.windowLog) + ZSTD_estimateCCtxSize(winners[cLevel].params);
 | 
			
		||||
            double W_CMemUsed_note = W_ratioNote * ( 50 + 13*cLevel) - log((double)W_CMemUsed);
 | 
			
		||||
            double O_CMemUsed_note = O_ratioNote * ( 50 + 13*cLevel) - log((double)O_CMemUsed);
 | 
			
		||||
 | 
			
		||||
            double W_CSpeed_note = W_ratioNote * ( 30 + 10*cLevel) + log((double)testResult.cSpeed);
 | 
			
		||||
            double O_CSpeed_note = O_ratioNote * ( 30 + 10*cLevel) + log((double)winners[cLevel].result.cSpeed);
 | 
			
		||||
 | 
			
		||||
            double W_DSpeed_note = W_ratioNote * ( 20 + 2*cLevel) + log((double)testResult.dSpeed);
 | 
			
		||||
            double O_DSpeed_note = O_ratioNote * ( 20 + 2*cLevel) + log((double)winners[cLevel].result.dSpeed);
 | 
			
		||||
            double W_CSpeed_note = W_ratioNote * ( 30 + 10*cLevel) + log(testResult.cSpeed);
 | 
			
		||||
            double O_CSpeed_note = O_ratioNote * ( 30 + 10*cLevel) + log(winners[cLevel].result.cSpeed);
 | 
			
		||||
 | 
			
		||||
            double W_DSpeed_note = W_ratioNote * ( 20 + 2*cLevel) + log(testResult.dSpeed);
 | 
			
		||||
            double O_DSpeed_note = O_ratioNote * ( 20 + 2*cLevel) + log(winners[cLevel].result.dSpeed);
 | 
			
		||||
 | 
			
		||||
            if (W_DMemUsed_note < O_DMemUsed_note) {
 | 
			
		||||
                /* uses too much Decompression memory for too little benefit */
 | 
			
		||||
@@ -474,16 +422,16 @@ static int BMK_seed(winnerInfo_t* winners, const ZSTD_compressionParameters para
 | 
			
		||||
                /* too large compression speed difference for the compression benefit */
 | 
			
		||||
                if (W_ratio > O_ratio)
 | 
			
		||||
                DISPLAY ("Compression Speed : %5.3f @ %4.1f MB/s  vs  %5.3f @ %4.1f MB/s   : not enough for level %i\n",
 | 
			
		||||
                         W_ratio, (double)(testResult.cSpeed) / 1000.,
 | 
			
		||||
                         O_ratio, (double)(winners[cLevel].result.cSpeed) / 1000.,   cLevel);
 | 
			
		||||
                         W_ratio, testResult.cSpeed / 1000000,
 | 
			
		||||
                         O_ratio, winners[cLevel].result.cSpeed / 1000000.,   cLevel);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            if (W_DSpeed_note   < O_DSpeed_note  ) {
 | 
			
		||||
                /* too large decompression speed difference for the compression benefit */
 | 
			
		||||
                if (W_ratio > O_ratio)
 | 
			
		||||
                DISPLAY ("Decompression Speed : %5.3f @ %4.1f MB/s  vs  %5.3f @ %4.1f MB/s   : not enough for level %i\n",
 | 
			
		||||
                         W_ratio, (double)(testResult.dSpeed) / 1000.,
 | 
			
		||||
                         O_ratio, (double)(winners[cLevel].result.dSpeed) / 1000.,   cLevel);
 | 
			
		||||
                         W_ratio, testResult.dSpeed / 1000000.,
 | 
			
		||||
                         O_ratio, winners[cLevel].result.dSpeed / 1000000.,   cLevel);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@@ -507,6 +455,8 @@ static ZSTD_compressionParameters* sanitizeParams(ZSTD_compressionParameters par
 | 
			
		||||
    g_params = params;
 | 
			
		||||
    if (params.strategy == ZSTD_fast)
 | 
			
		||||
        g_params.chainLog = 0, g_params.searchLog = 0;
 | 
			
		||||
    if (params.strategy == ZSTD_dfast)
 | 
			
		||||
        g_params.searchLog = 0;
 | 
			
		||||
    if (params.strategy != ZSTD_btopt )
 | 
			
		||||
        g_params.targetLength = 0;
 | 
			
		||||
    return &g_params;
 | 
			
		||||
@@ -577,9 +527,9 @@ static void playAround(FILE* f, winnerInfo_t* winners,
 | 
			
		||||
                       ZSTD_CCtx* ctx)
 | 
			
		||||
{
 | 
			
		||||
    int nbVariations = 0;
 | 
			
		||||
    const int startTime = BMK_GetMilliStart();
 | 
			
		||||
    clock_t const clockStart = clock();
 | 
			
		||||
 | 
			
		||||
    while (BMK_GetMilliSpan(startTime) < g_maxVariationTime) {
 | 
			
		||||
    while (BMK_clockSpan(clockStart) < g_maxVariationTime) {
 | 
			
		||||
        ZSTD_compressionParameters p = params;
 | 
			
		||||
 | 
			
		||||
        if (nbVariations++ > g_maxNbVariations) break;
 | 
			
		||||
@@ -637,15 +587,18 @@ static void BMK_selectRandomStart(
 | 
			
		||||
 | 
			
		||||
static void BMK_benchMem(void* srcBuffer, size_t srcSize)
 | 
			
		||||
{
 | 
			
		||||
    ZSTD_CCtx* ctx = ZSTD_createCCtx();
 | 
			
		||||
    ZSTD_CCtx* const ctx = ZSTD_createCCtx();
 | 
			
		||||
    ZSTD_compressionParameters params;
 | 
			
		||||
    winnerInfo_t winners[NB_LEVELS_TRACKED];
 | 
			
		||||
    int i;
 | 
			
		||||
    unsigned u;
 | 
			
		||||
    const char* rfName = "grillResults.txt";
 | 
			
		||||
    FILE* f;
 | 
			
		||||
    const char* const rfName = "grillResults.txt";
 | 
			
		||||
    FILE* const f = fopen(rfName, "w");
 | 
			
		||||
    const size_t blockSize = g_blockSize ? g_blockSize : srcSize;
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    if (ctx==NULL) { DISPLAY("ZSTD_createCCtx() failed \n"); exit(1); }
 | 
			
		||||
    memset(winners, 0, sizeof(winners));
 | 
			
		||||
    if (f==NULL) { DISPLAY("error opening %s \n", rfName); exit(1); }
 | 
			
		||||
 | 
			
		||||
    if (g_singleRun) {
 | 
			
		||||
        BMK_result_t testResult;
 | 
			
		||||
        g_params = ZSTD_adjustCParams(g_params, srcSize, 0);
 | 
			
		||||
@@ -654,41 +607,36 @@ static void BMK_benchMem(void* srcBuffer, size_t srcSize)
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* init */
 | 
			
		||||
    memset(winners, 0, sizeof(winners));
 | 
			
		||||
    f = fopen(rfName, "w");
 | 
			
		||||
    if (f==NULL) { DISPLAY("error opening %s \n", rfName); exit(1); }
 | 
			
		||||
 | 
			
		||||
    if (g_target)
 | 
			
		||||
        g_cSpeedTarget[1] = g_target * 1000;
 | 
			
		||||
        g_cSpeedTarget[1] = g_target * 1000000;
 | 
			
		||||
    else {
 | 
			
		||||
        /* baseline config for level 1 */
 | 
			
		||||
        BMK_result_t testResult;
 | 
			
		||||
        params = ZSTD_getCParams(1, blockSize, 0);
 | 
			
		||||
        BMK_benchParam(&testResult, srcBuffer, srcSize, ctx, params);
 | 
			
		||||
        g_cSpeedTarget[1] = (testResult.cSpeed * 31) >> 5;
 | 
			
		||||
        g_cSpeedTarget[1] = (testResult.cSpeed * 31) / 32;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* establish speed objectives (relative to level 1) */
 | 
			
		||||
    for (u=2; u<=ZSTD_maxCLevel(); u++)
 | 
			
		||||
        g_cSpeedTarget[u] = (g_cSpeedTarget[u-1] * 25) >> 5;
 | 
			
		||||
    {   unsigned u;
 | 
			
		||||
        for (u=2; u<=ZSTD_maxCLevel(); u++)
 | 
			
		||||
            g_cSpeedTarget[u] = (g_cSpeedTarget[u-1] * 25) / 32;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* populate initial solution */
 | 
			
		||||
    {
 | 
			
		||||
        const int maxSeeds = g_noSeed ? 1 : ZSTD_maxCLevel();
 | 
			
		||||
        for (i=1; i<=maxSeeds; i++) {
 | 
			
		||||
    {   const int maxSeeds = g_noSeed ? 1 : ZSTD_maxCLevel();
 | 
			
		||||
        int i;
 | 
			
		||||
        for (i=0; i<=maxSeeds; i++) {
 | 
			
		||||
            params = ZSTD_getCParams(i, blockSize, 0);
 | 
			
		||||
            BMK_seed(winners, params, srcBuffer, srcSize, ctx);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    }   }
 | 
			
		||||
    BMK_printWinners(f, winners, srcSize);
 | 
			
		||||
 | 
			
		||||
    /* start tests */
 | 
			
		||||
    {
 | 
			
		||||
        const int milliStart = BMK_GetMilliStart();
 | 
			
		||||
    {   const time_t grillStart = time(NULL);
 | 
			
		||||
        do {
 | 
			
		||||
            BMK_selectRandomStart(f, winners, srcBuffer, srcSize, ctx);
 | 
			
		||||
        } while (BMK_GetMilliSpan(milliStart) < g_grillDuration);
 | 
			
		||||
        } while (BMK_timeSpan(grillStart) < g_grillDuration_s);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* end summary */
 | 
			
		||||
@@ -704,8 +652,8 @@ static void BMK_benchMem(void* srcBuffer, size_t srcSize)
 | 
			
		||||
static int benchSample(void)
 | 
			
		||||
{
 | 
			
		||||
    void* origBuff;
 | 
			
		||||
    size_t benchedSize = sampleSize;
 | 
			
		||||
    const char* name = "Sample 10MiB";
 | 
			
		||||
    size_t const benchedSize = sampleSize;
 | 
			
		||||
    const char* const name = "Sample 10MiB";
 | 
			
		||||
 | 
			
		||||
    /* Allocation */
 | 
			
		||||
    origBuff = malloc(benchedSize);
 | 
			
		||||
@@ -724,37 +672,31 @@ static int benchSample(void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int benchFiles(char** fileNamesTable, int nbFiles)
 | 
			
		||||
int benchFiles(const char** fileNamesTable, int nbFiles)
 | 
			
		||||
{
 | 
			
		||||
    int fileIdx=0;
 | 
			
		||||
 | 
			
		||||
    /* Loop for each file */
 | 
			
		||||
    while (fileIdx<nbFiles) {
 | 
			
		||||
        FILE* inFile;
 | 
			
		||||
        char* inFileName;
 | 
			
		||||
        U64   inFileSize;
 | 
			
		||||
        const char* const inFileName = fileNamesTable[fileIdx++];
 | 
			
		||||
        FILE* const inFile = fopen( inFileName, "rb" );
 | 
			
		||||
        U64 const inFileSize = UTIL_getFileSize(inFileName);
 | 
			
		||||
        size_t benchedSize;
 | 
			
		||||
        size_t readSize;
 | 
			
		||||
        char* origBuff;
 | 
			
		||||
        void* origBuff;
 | 
			
		||||
 | 
			
		||||
        /* Check file existence */
 | 
			
		||||
        inFileName = fileNamesTable[fileIdx++];
 | 
			
		||||
        inFile = fopen( inFileName, "rb" );
 | 
			
		||||
        if (inFile==NULL) {
 | 
			
		||||
            DISPLAY( "Pb opening %s\n", inFileName);
 | 
			
		||||
            return 11;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* Memory allocation & restrictions */
 | 
			
		||||
        inFileSize = UTIL_getFileSize(inFileName);
 | 
			
		||||
        /* Memory allocation */
 | 
			
		||||
        benchedSize = BMK_findMaxMem(inFileSize*3) / 3;
 | 
			
		||||
        if ((U64)benchedSize > inFileSize) benchedSize = (size_t)inFileSize;
 | 
			
		||||
        if (benchedSize < inFileSize)
 | 
			
		||||
            DISPLAY("Not enough memory for '%s' full size; testing %i MB only...\n", inFileName, (int)(benchedSize>>20));
 | 
			
		||||
 | 
			
		||||
        /* Alloc */
 | 
			
		||||
        origBuff = (char*) malloc((size_t)benchedSize);
 | 
			
		||||
        if(!origBuff) {
 | 
			
		||||
        origBuff = malloc(benchedSize);
 | 
			
		||||
        if (origBuff==NULL) {
 | 
			
		||||
            DISPLAY("\nError: not enough memory!\n");
 | 
			
		||||
            fclose(inFile);
 | 
			
		||||
            return 12;
 | 
			
		||||
@@ -762,49 +704,44 @@ int benchFiles(char** fileNamesTable, int nbFiles)
 | 
			
		||||
 | 
			
		||||
        /* Fill input buffer */
 | 
			
		||||
        DISPLAY("Loading %s...       \r", inFileName);
 | 
			
		||||
        readSize = fread(origBuff, 1, benchedSize, inFile);
 | 
			
		||||
        fclose(inFile);
 | 
			
		||||
 | 
			
		||||
        if(readSize != benchedSize) {
 | 
			
		||||
            DISPLAY("\nError: problem reading file '%s' !!    \n", inFileName);
 | 
			
		||||
            free(origBuff);
 | 
			
		||||
            return 13;
 | 
			
		||||
        }
 | 
			
		||||
        {   size_t const readSize = fread(origBuff, 1, benchedSize, inFile);
 | 
			
		||||
            fclose(inFile);
 | 
			
		||||
            if(readSize != benchedSize) {
 | 
			
		||||
                DISPLAY("\nError: problem reading file '%s' !!    \n", inFileName);
 | 
			
		||||
                free(origBuff);
 | 
			
		||||
                return 13;
 | 
			
		||||
        }   }
 | 
			
		||||
 | 
			
		||||
        /* bench */
 | 
			
		||||
        DISPLAY("\r%79s\r", "");
 | 
			
		||||
        DISPLAY("using %s : \n", inFileName);
 | 
			
		||||
        BMK_benchMem(origBuff, benchedSize);
 | 
			
		||||
 | 
			
		||||
        /* clean */
 | 
			
		||||
        free(origBuff);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int optimizeForSize(char* inFileName)
 | 
			
		||||
int optimizeForSize(const char* inFileName, U32 targetSpeed)
 | 
			
		||||
{
 | 
			
		||||
    FILE* inFile;
 | 
			
		||||
    U64   inFileSize;
 | 
			
		||||
    size_t benchedSize;
 | 
			
		||||
    size_t readSize;
 | 
			
		||||
    char* origBuff;
 | 
			
		||||
    FILE* const inFile = fopen( inFileName, "rb" );
 | 
			
		||||
    U64 const inFileSize = UTIL_getFileSize(inFileName);
 | 
			
		||||
    size_t benchedSize = BMK_findMaxMem(inFileSize*3) / 3;
 | 
			
		||||
    void* origBuff;
 | 
			
		||||
 | 
			
		||||
    /* Check file existence */
 | 
			
		||||
    inFile = fopen( inFileName, "rb" );
 | 
			
		||||
    if (inFile==NULL) {
 | 
			
		||||
        DISPLAY( "Pb opening %s\n", inFileName);
 | 
			
		||||
        return 11;
 | 
			
		||||
    }
 | 
			
		||||
    /* Init */
 | 
			
		||||
    if (inFile==NULL) { DISPLAY( "Pb opening %s\n", inFileName); return 11; }
 | 
			
		||||
 | 
			
		||||
    /* Memory allocation & restrictions */
 | 
			
		||||
    inFileSize = UTIL_getFileSize(inFileName);
 | 
			
		||||
    benchedSize = (size_t) BMK_findMaxMem(inFileSize*3) / 3;
 | 
			
		||||
    if ((U64)benchedSize > inFileSize) benchedSize = (size_t)inFileSize;
 | 
			
		||||
    if (benchedSize < inFileSize)
 | 
			
		||||
        DISPLAY("Not enough memory for '%s' full size; testing %i MB only...\n", inFileName, (int)(benchedSize>>20));
 | 
			
		||||
 | 
			
		||||
    /* Alloc */
 | 
			
		||||
    origBuff = (char*) malloc((size_t)benchedSize);
 | 
			
		||||
    origBuff = malloc(benchedSize);
 | 
			
		||||
    if(!origBuff) {
 | 
			
		||||
        DISPLAY("\nError: not enough memory!\n");
 | 
			
		||||
        fclose(inFile);
 | 
			
		||||
@@ -813,39 +750,40 @@ int optimizeForSize(char* inFileName)
 | 
			
		||||
 | 
			
		||||
    /* Fill input buffer */
 | 
			
		||||
    DISPLAY("Loading %s...       \r", inFileName);
 | 
			
		||||
    readSize = fread(origBuff, 1, benchedSize, inFile);
 | 
			
		||||
    fclose(inFile);
 | 
			
		||||
 | 
			
		||||
    if(readSize != benchedSize) {
 | 
			
		||||
        DISPLAY("\nError: problem reading file '%s' !!    \n", inFileName);
 | 
			
		||||
        free(origBuff);
 | 
			
		||||
        return 13;
 | 
			
		||||
    }
 | 
			
		||||
    {   size_t const readSize = fread(origBuff, 1, benchedSize, inFile);
 | 
			
		||||
        fclose(inFile);
 | 
			
		||||
        if(readSize != benchedSize) {
 | 
			
		||||
            DISPLAY("\nError: problem reading file '%s' !!    \n", inFileName);
 | 
			
		||||
            free(origBuff);
 | 
			
		||||
            return 13;
 | 
			
		||||
    }   }
 | 
			
		||||
 | 
			
		||||
    /* bench */
 | 
			
		||||
    DISPLAY("\r%79s\r", "");
 | 
			
		||||
    DISPLAY("optimizing for %s : \n", inFileName);
 | 
			
		||||
    DISPLAY("optimizing for %s - limit speed %u MB/s \n", inFileName, targetSpeed);
 | 
			
		||||
    targetSpeed *= 1000;
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        ZSTD_CCtx* ctx = ZSTD_createCCtx();
 | 
			
		||||
    {   ZSTD_CCtx* const ctx = ZSTD_createCCtx();
 | 
			
		||||
        ZSTD_compressionParameters params;
 | 
			
		||||
        winnerInfo_t winner;
 | 
			
		||||
        BMK_result_t candidate;
 | 
			
		||||
        const size_t blockSize = g_blockSize ? g_blockSize : benchedSize;
 | 
			
		||||
        int i;
 | 
			
		||||
 | 
			
		||||
        /* init */
 | 
			
		||||
        if (ctx==NULL) { DISPLAY("\n ZSTD_createCCtx error \n"); free(origBuff); return 14;}
 | 
			
		||||
        memset(&winner, 0, sizeof(winner));
 | 
			
		||||
        winner.result.cSize = (size_t)(-1);
 | 
			
		||||
 | 
			
		||||
        /* find best solution from default params */
 | 
			
		||||
        {
 | 
			
		||||
            const int maxSeeds = g_noSeed ? 1 : ZSTD_maxCLevel();
 | 
			
		||||
        {   const int maxSeeds = g_noSeed ? 1 : ZSTD_maxCLevel();
 | 
			
		||||
            int i;
 | 
			
		||||
            for (i=1; i<=maxSeeds; i++) {
 | 
			
		||||
                params = ZSTD_getCParams(i, blockSize, 0);
 | 
			
		||||
                BMK_benchParam(&candidate, origBuff, benchedSize, ctx, params);
 | 
			
		||||
                if (candidate.cSpeed < targetSpeed)
 | 
			
		||||
                    break;
 | 
			
		||||
                if ( (candidate.cSize < winner.result.cSize)
 | 
			
		||||
                   ||((candidate.cSize == winner.result.cSize) && (candidate.cSpeed > winner.result.cSpeed)) )
 | 
			
		||||
                   | ((candidate.cSize == winner.result.cSize) & (candidate.cSpeed > winner.result.cSpeed)) )
 | 
			
		||||
                {
 | 
			
		||||
                    winner.params = params;
 | 
			
		||||
                    winner.result = candidate;
 | 
			
		||||
@@ -855,12 +793,11 @@ int optimizeForSize(char* inFileName)
 | 
			
		||||
        BMK_printWinner(stdout, 99, winner.result, winner.params, benchedSize);
 | 
			
		||||
 | 
			
		||||
        /* start tests */
 | 
			
		||||
        {
 | 
			
		||||
            const int milliStart = BMK_GetMilliStart();
 | 
			
		||||
        {   time_t const grillStart = time(NULL);
 | 
			
		||||
            do {
 | 
			
		||||
                params = winner.params;
 | 
			
		||||
                paramVariation(¶ms);
 | 
			
		||||
                if ((FUZ_rand(&g_rand) & 15) == 1) params = randomParams();
 | 
			
		||||
                if ((FUZ_rand(&g_rand) & 15) == 3) params = randomParams();
 | 
			
		||||
 | 
			
		||||
                /* exclude faster if already played set of params */
 | 
			
		||||
                if (FUZ_rand(&g_rand) & ((1 << NB_TESTS_PLAYED(params))-1)) continue;
 | 
			
		||||
@@ -870,13 +807,15 @@ int optimizeForSize(char* inFileName)
 | 
			
		||||
                BMK_benchParam(&candidate, origBuff, benchedSize, ctx, params);
 | 
			
		||||
 | 
			
		||||
                /* improvement found => new winner */
 | 
			
		||||
                if ( (candidate.cSize < winner.result.cSize)
 | 
			
		||||
                   ||((candidate.cSize == winner.result.cSize) && (candidate.cSpeed > winner.result.cSpeed)) ) {
 | 
			
		||||
                if ( (candidate.cSpeed > targetSpeed)
 | 
			
		||||
                   & ( (candidate.cSize < winner.result.cSize)
 | 
			
		||||
                     | ((candidate.cSize == winner.result.cSize) & (candidate.cSpeed > winner.result.cSpeed)) )  )
 | 
			
		||||
                {
 | 
			
		||||
                    winner.params = params;
 | 
			
		||||
                    winner.result = candidate;
 | 
			
		||||
                    BMK_printWinner(stdout, 99, winner.result, winner.params, benchedSize);
 | 
			
		||||
                }
 | 
			
		||||
            } while (BMK_GetMilliSpan(milliStart) < g_grillDuration);
 | 
			
		||||
            } while (BMK_timeSpan(grillStart) < g_grillDuration_s);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* end summary */
 | 
			
		||||
@@ -887,11 +826,12 @@ int optimizeForSize(char* inFileName)
 | 
			
		||||
        ZSTD_freeCCtx(ctx);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    free(origBuff);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int usage(char* exename)
 | 
			
		||||
static int usage(const char* exename)
 | 
			
		||||
{
 | 
			
		||||
    DISPLAY( "Usage :\n");
 | 
			
		||||
    DISPLAY( "      %s [arg] file\n", exename);
 | 
			
		||||
@@ -904,29 +844,32 @@ static int usage(char* exename)
 | 
			
		||||
static int usage_advanced(void)
 | 
			
		||||
{
 | 
			
		||||
    DISPLAY( "\nAdvanced options :\n");
 | 
			
		||||
    DISPLAY( " -i#    : iteration loops [1-9](default : %i)\n", NBLOOPS);
 | 
			
		||||
    DISPLAY( " -B#    : cut input into blocks of size # (default : single block)\n");
 | 
			
		||||
    DISPLAY( " -P#    : generated sample compressibility (default : %.1f%%)\n", COMPRESSIBILITY_DEFAULT * 100);
 | 
			
		||||
    DISPLAY( " -S     : Single run\n");
 | 
			
		||||
    DISPLAY( " -T#    : set level 1 speed objective \n");
 | 
			
		||||
    DISPLAY( " -B#    : cut input into blocks of size # (default : single block) \n");
 | 
			
		||||
    DISPLAY( " -i#    : iteration loops [1-9](default : %i) \n", NBLOOPS);
 | 
			
		||||
    DISPLAY( " -O#    : find Optimized parameters for # target speed (default : 0) \n");
 | 
			
		||||
    DISPLAY( " -S     : Single run \n");
 | 
			
		||||
    DISPLAY( " -P#    : generated sample compressibility (default : %.1f%%) \n", COMPRESSIBILITY_DEFAULT * 100);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int badusage(char* exename)
 | 
			
		||||
static int badusage(const char* exename)
 | 
			
		||||
{
 | 
			
		||||
    DISPLAY("Wrong parameters\n");
 | 
			
		||||
    usage(exename);
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char** argv)
 | 
			
		||||
int main(int argc, const char** argv)
 | 
			
		||||
{
 | 
			
		||||
    int i,
 | 
			
		||||
        filenamesStart=0,
 | 
			
		||||
        result;
 | 
			
		||||
    char* exename=argv[0];
 | 
			
		||||
    char* input_filename=0;
 | 
			
		||||
    const char* exename=argv[0];
 | 
			
		||||
    const char* input_filename=0;
 | 
			
		||||
    U32 optimizer = 0;
 | 
			
		||||
    U32 main_pause = 0;
 | 
			
		||||
    U32 targetSpeed = 0;
 | 
			
		||||
 | 
			
		||||
    /* checks */
 | 
			
		||||
    if (NB_LEVELS_TRACKED <= ZSTD_maxCLevel()) {
 | 
			
		||||
@@ -940,7 +883,7 @@ int main(int argc, char** argv)
 | 
			
		||||
    if (argc<1) { badusage(exename); return 1; }
 | 
			
		||||
 | 
			
		||||
    for(i=1; i<argc; i++) {
 | 
			
		||||
        char* argument = argv[i];
 | 
			
		||||
        const char* argument = argv[i];
 | 
			
		||||
 | 
			
		||||
        if(!argument) continue;   /* Protection if argument empty */
 | 
			
		||||
 | 
			
		||||
@@ -964,7 +907,7 @@ int main(int argc, char** argv)
 | 
			
		||||
                    /* Modify Nb Iterations */
 | 
			
		||||
                case 'i':
 | 
			
		||||
                    argument++;
 | 
			
		||||
                    if ((argument[0] >='0') && (argument[0] <='9'))
 | 
			
		||||
                    if ((argument[0] >='0') & (argument[0] <='9'))
 | 
			
		||||
                        g_nbIterations = *argument++ - '0';
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
@@ -972,7 +915,7 @@ int main(int argc, char** argv)
 | 
			
		||||
                case 'P':
 | 
			
		||||
                    argument++;
 | 
			
		||||
                    {   U32 proba32 = 0;
 | 
			
		||||
                        while ((argument[0]>= '0') && (argument[0]<= '9'))
 | 
			
		||||
                        while ((argument[0]>= '0') & (argument[0]<= '9'))
 | 
			
		||||
                            proba32 = (proba32*10) + (*argument++ - '0');
 | 
			
		||||
                        g_compressibility = (double)proba32 / 100.;
 | 
			
		||||
                    }
 | 
			
		||||
@@ -981,6 +924,9 @@ int main(int argc, char** argv)
 | 
			
		||||
                case 'O':
 | 
			
		||||
                    argument++;
 | 
			
		||||
                    optimizer=1;
 | 
			
		||||
                    targetSpeed = 0;
 | 
			
		||||
                    while ((*argument >= '0') & (*argument <= '9'))
 | 
			
		||||
                        targetSpeed = (targetSpeed*10) + (*argument++ - '0');
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                    /* Run Single conf */
 | 
			
		||||
@@ -1058,7 +1004,7 @@ int main(int argc, char** argv)
 | 
			
		||||
                case 'B':
 | 
			
		||||
                    g_blockSize = 0;
 | 
			
		||||
                    argument++;
 | 
			
		||||
                    while ((*argument >='0') && (*argument <='9'))
 | 
			
		||||
                    while ((*argument >='0') & (*argument <='9'))
 | 
			
		||||
                        g_blockSize = (g_blockSize*10) + (*argument++ - '0');
 | 
			
		||||
                    if (*argument=='K') g_blockSize<<=10, argument++;  /* allows using KB notation */
 | 
			
		||||
                    if (*argument=='M') g_blockSize<<=20, argument++;
 | 
			
		||||
@@ -1081,7 +1027,7 @@ int main(int argc, char** argv)
 | 
			
		||||
        result = benchSample();
 | 
			
		||||
    else {
 | 
			
		||||
        if (optimizer)
 | 
			
		||||
            result = optimizeForSize(input_filename);
 | 
			
		||||
            result = optimizeForSize(input_filename, targetSpeed);
 | 
			
		||||
        else
 | 
			
		||||
            result = benchFiles(argv+filenamesStart, argc-filenamesStart);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -381,13 +381,9 @@ static int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, double compres
 | 
			
		||||
            {   size_t const dictStart = FUZ_rand(&lseed) % (srcBufferSize - dictSize);
 | 
			
		||||
                dict = srcBuffer + dictStart;
 | 
			
		||||
            }
 | 
			
		||||
            {   ZSTD_compressionParameters const cPar = ZSTD_getCParams(cLevel, 0, dictSize);
 | 
			
		||||
                U32 const checksum = FUZ_rand(&lseed) & 1;
 | 
			
		||||
                U32 const noDictIDFlag = FUZ_rand(&lseed) & 1;
 | 
			
		||||
                ZSTD_frameParameters const fPar = { 0, checksum, noDictIDFlag };
 | 
			
		||||
                ZSTD_parameters params;
 | 
			
		||||
                params.cParams = cPar;
 | 
			
		||||
                params.fParams = fPar;
 | 
			
		||||
            {   ZSTD_parameters params = ZSTD_getParams(cLevel, 0, dictSize);
 | 
			
		||||
                params.fParams.checksumFlag = FUZ_rand(&lseed) & 1;
 | 
			
		||||
                params.fParams.noDictIDFlag = FUZ_rand(&lseed) & 1;
 | 
			
		||||
                {   size_t const initError = ZBUFF_compressInit_advanced(zc, dict, dictSize, params, 0);
 | 
			
		||||
                    CHECK (ZBUFF_isError(initError),"init error : %s", ZBUFF_getErrorName(initError));
 | 
			
		||||
        }   }   }
 | 
			
		||||
 
 | 
			
		||||
@@ -33,12 +33,12 @@ It is based on the \fBLZ77\fR family, with further FSE & huff0 entropy stages.
 | 
			
		||||
It also features a very fast decoder, with speed > 500 MB/s per core.
 | 
			
		||||
 | 
			
		||||
\fBzstd\fR command line is generally similar to gzip, but features the following differences :
 | 
			
		||||
 - Original files are preserved
 | 
			
		||||
 - Source files are preserved by default
 | 
			
		||||
   It's possible to remove them automatically by using \fB--rm\fR command
 | 
			
		||||
 - By default, when compressing a single file, \fBzstd\fR displays progress notifications and result summary.
 | 
			
		||||
     Use \fB-q\fR to turn them off
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
\fBzstd\fR supports the following options :
 | 
			
		||||
 | 
			
		||||
.SH OPTIONS
 | 
			
		||||
.TP
 | 
			
		||||
@@ -57,6 +57,19 @@ It also features a very fast decoder, with speed > 500 MB/s per core.
 | 
			
		||||
.BR \-f ", " --force
 | 
			
		||||
 overwrite output without prompting
 | 
			
		||||
.TP
 | 
			
		||||
.BR \-c ", " --stdout
 | 
			
		||||
 force write to standard output, even if it is the console
 | 
			
		||||
.TP
 | 
			
		||||
.BR \--rm
 | 
			
		||||
 remove source file(s) after successful compression or decompression
 | 
			
		||||
.TP
 | 
			
		||||
.BR \-k ", " --keep
 | 
			
		||||
 keep source file(s) after successful compression or decompression.
 | 
			
		||||
 This is the default behavior.
 | 
			
		||||
.TP
 | 
			
		||||
.BR \-r
 | 
			
		||||
 operate recursively on directories
 | 
			
		||||
.TP
 | 
			
		||||
.BR \-h/\-H ", " --help
 | 
			
		||||
 display help/long help and exit
 | 
			
		||||
.TP
 | 
			
		||||
@@ -69,14 +82,11 @@ It also features a very fast decoder, with speed > 500 MB/s per core.
 | 
			
		||||
.BR \-q ", " --quiet
 | 
			
		||||
 suppress warnings and notifications; specify twice to suppress errors too
 | 
			
		||||
.TP
 | 
			
		||||
.BR \-c ", " --stdout
 | 
			
		||||
 force write to standard output, even if it is the console
 | 
			
		||||
.TP
 | 
			
		||||
.BR \-C ", " --check
 | 
			
		||||
 add integrity check computed from uncompressed data
 | 
			
		||||
.TP
 | 
			
		||||
.BR \-t ", " --test
 | 
			
		||||
 Test the integrity of compressed files.  This option is equivalent to \fB--decompress --stdout > /dev/null\fR.
 | 
			
		||||
 Test the integrity of compressed files. This option is equivalent to \fB--decompress --stdout > /dev/null\fR.
 | 
			
		||||
 No files are created or removed.
 | 
			
		||||
 | 
			
		||||
.SH DICTIONARY
 | 
			
		||||
@@ -121,9 +131,6 @@ Typical gains range from ~10% (at 64KB) to x5 better (at <1KB).
 | 
			
		||||
.TP
 | 
			
		||||
.B \-B#
 | 
			
		||||
 cut file into independent blocks of size # (default: no block)
 | 
			
		||||
.TP
 | 
			
		||||
.B \-r#
 | 
			
		||||
 test all compression levels from 1 to # (default: disabled)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.SH BUGS
 | 
			
		||||
 
 | 
			
		||||
@@ -28,12 +28,21 @@
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-************************************
 | 
			
		||||
*  Tuning parameters
 | 
			
		||||
**************************************/
 | 
			
		||||
#ifndef ZSTDCLI_CLEVEL_DEFAULT
 | 
			
		||||
#  define ZSTDCLI_CLEVEL_DEFAULT 3
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-************************************
 | 
			
		||||
*  Includes
 | 
			
		||||
**************************************/
 | 
			
		||||
#include "util.h"     /* Compiler options, UTIL_HAS_CREATEFILELIST */
 | 
			
		||||
#include <string.h>   /* strcmp, strlen */
 | 
			
		||||
#include <ctype.h>    /* toupper */
 | 
			
		||||
#include <errno.h>    /* errno */
 | 
			
		||||
#include "fileio.h"
 | 
			
		||||
#ifndef ZSTD_NOBENCH
 | 
			
		||||
#  include "bench.h"  /* BMK_benchFiles, BMK_SetNbIterations */
 | 
			
		||||
@@ -45,7 +54,6 @@
 | 
			
		||||
#include "zstd.h"     /* ZSTD_VERSION_STRING */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-************************************
 | 
			
		||||
*  OS-specific Includes
 | 
			
		||||
**************************************/
 | 
			
		||||
@@ -53,12 +61,12 @@
 | 
			
		||||
#  include <io.h>       /* _isatty */
 | 
			
		||||
#  define IS_CONSOLE(stdStream) _isatty(_fileno(stdStream))
 | 
			
		||||
#else
 | 
			
		||||
#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE)
 | 
			
		||||
#  include <unistd.h>   /* isatty */
 | 
			
		||||
#  define IS_CONSOLE(stdStream) isatty(fileno(stdStream))
 | 
			
		||||
#else
 | 
			
		||||
#  define IS_CONSOLE(stdStream) 0
 | 
			
		||||
#endif
 | 
			
		||||
#  if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE)
 | 
			
		||||
#    include <unistd.h>   /* isatty */
 | 
			
		||||
#    define IS_CONSOLE(stdStream) isatty(fileno(stdStream))
 | 
			
		||||
#  else
 | 
			
		||||
#    define IS_CONSOLE(stdStream) 0
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -115,6 +123,8 @@ static int usage(const char* programName)
 | 
			
		||||
    DISPLAY( " -D file: use `file` as Dictionary \n");
 | 
			
		||||
    DISPLAY( " -o file: result stored into `file` (only if 1 input file) \n");
 | 
			
		||||
    DISPLAY( " -f     : overwrite output without prompting \n");
 | 
			
		||||
    DISPLAY( "--rm    : remove source file(s) after successful de/compression \n");
 | 
			
		||||
    DISPLAY( " -k     : preserve source file(s) (default) \n");
 | 
			
		||||
    DISPLAY( " -h/-H  : display help/long help and exit\n");
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -132,7 +142,6 @@ static int usage_advanced(const char* programName)
 | 
			
		||||
#ifdef UTIL_HAS_CREATEFILELIST
 | 
			
		||||
    DISPLAY( " -r     : operate recursively on directories\n");
 | 
			
		||||
#endif
 | 
			
		||||
    DISPLAY( "--rm    : remove source files after successful de/compression \n");
 | 
			
		||||
#ifndef ZSTD_NOCOMPRESS
 | 
			
		||||
    DISPLAY( "--ultra : enable ultra modes (requires more memory to decompress)\n");
 | 
			
		||||
    DISPLAY( "--no-dictID : don't write dictID into header (dictionary compression)\n");
 | 
			
		||||
@@ -169,7 +178,6 @@ static int badusage(const char* programName)
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void waitEnter(void)
 | 
			
		||||
{
 | 
			
		||||
    int unused;
 | 
			
		||||
@@ -181,7 +189,7 @@ static void waitEnter(void)
 | 
			
		||||
/*! readU32FromChar() :
 | 
			
		||||
    @return : unsigned integer value reach from input in `char` format
 | 
			
		||||
    Will also modify `*stringPtr`, advancing it to position where it stopped reading.
 | 
			
		||||
    Note : this function can overflow if result > MAX_UNIT */
 | 
			
		||||
    Note : this function can overflow if result > MAX_UINT */
 | 
			
		||||
static unsigned readU32FromChar(const char** stringPtr)
 | 
			
		||||
{
 | 
			
		||||
    unsigned result = 0;
 | 
			
		||||
@@ -205,8 +213,9 @@ int main(int argCount, const char** argv)
 | 
			
		||||
        dictBuild=0,
 | 
			
		||||
        nextArgumentIsOutFileName=0,
 | 
			
		||||
        nextArgumentIsMaxDict=0,
 | 
			
		||||
        nextArgumentIsDictID=0;
 | 
			
		||||
    unsigned cLevel = 1;
 | 
			
		||||
        nextArgumentIsDictID=0,
 | 
			
		||||
        nextArgumentIsFile=0;
 | 
			
		||||
    unsigned cLevel = ZSTDCLI_CLEVEL_DEFAULT;
 | 
			
		||||
    unsigned cLevelLast = 1;
 | 
			
		||||
    unsigned recursive = 0;
 | 
			
		||||
    const char** filenameTable = (const char**)malloc(argCount * sizeof(const char*));   /* argCount >= 1 */
 | 
			
		||||
@@ -229,7 +238,7 @@ int main(int argCount, const char** argv)
 | 
			
		||||
    (void)recursive; (void)cLevelLast;    /* not used when ZSTD_NOBENCH set */
 | 
			
		||||
    (void)dictCLevel; (void)dictSelect; (void)dictID;  /* not used when ZSTD_NODICT set */
 | 
			
		||||
    (void)decode; (void)cLevel; /* not used when ZSTD_NOCOMPRESS set */
 | 
			
		||||
    if (filenameTable==NULL) { DISPLAY("not enough memory\n"); exit(1); }
 | 
			
		||||
    if (filenameTable==NULL) { DISPLAY("zstd: %s \n", strerror(errno)); exit(1); }
 | 
			
		||||
    filenameTable[0] = stdinmark;
 | 
			
		||||
    displayOut = stderr;
 | 
			
		||||
    /* Pick out program name from path. Don't rely on stdlib because of conflicting behavior */
 | 
			
		||||
@@ -247,142 +256,165 @@ int main(int argCount, const char** argv)
 | 
			
		||||
        const char* argument = argv[argNb];
 | 
			
		||||
        if(!argument) continue;   /* Protection if argument empty */
 | 
			
		||||
 | 
			
		||||
        /* long commands (--long-word) */
 | 
			
		||||
        if (!strcmp(argument, "--decompress")) { decode=1; continue; }
 | 
			
		||||
        if (!strcmp(argument, "--force")) {  FIO_overwriteMode(); continue; }
 | 
			
		||||
        if (!strcmp(argument, "--version")) { displayOut=stdout; DISPLAY(WELCOME_MESSAGE); CLEAN_RETURN(0); }
 | 
			
		||||
        if (!strcmp(argument, "--help")) { displayOut=stdout; CLEAN_RETURN(usage_advanced(programName)); }
 | 
			
		||||
        if (!strcmp(argument, "--verbose")) { displayLevel=4; continue; }
 | 
			
		||||
        if (!strcmp(argument, "--quiet")) { displayLevel--; continue; }
 | 
			
		||||
        if (!strcmp(argument, "--stdout")) { forceStdout=1; outFileName=stdoutmark; displayLevel=1; continue; }
 | 
			
		||||
        if (!strcmp(argument, "--ultra")) { FIO_setMaxWLog(0); continue; }
 | 
			
		||||
        if (!strcmp(argument, "--check")) { FIO_setChecksumFlag(2); continue; }
 | 
			
		||||
        if (!strcmp(argument, "--no-check")) { FIO_setChecksumFlag(0); continue; }
 | 
			
		||||
        if (!strcmp(argument, "--no-dictID")) { FIO_setDictIDFlag(0); continue; }
 | 
			
		||||
        if (!strcmp(argument, "--sparse")) { FIO_setSparseWrite(2); continue; }
 | 
			
		||||
        if (!strcmp(argument, "--no-sparse")) { FIO_setSparseWrite(0); continue; }
 | 
			
		||||
        if (!strcmp(argument, "--test")) { decode=1; outFileName=nulmark; FIO_overwriteMode(); continue; }
 | 
			
		||||
        if (!strcmp(argument, "--train")) { dictBuild=1; outFileName=g_defaultDictName; continue; }
 | 
			
		||||
        if (!strcmp(argument, "--maxdict")) { nextArgumentIsMaxDict=1; continue; }
 | 
			
		||||
        if (!strcmp(argument, "--dictID")) { nextArgumentIsDictID=1; continue; }
 | 
			
		||||
        if (!strcmp(argument, "--keep")) { continue; }   /* does nothing, since preserving input is default; for gzip/xz compatibility */
 | 
			
		||||
        if (!strcmp(argument, "--rm")) { FIO_setRemoveSrcFile(1); continue; }
 | 
			
		||||
        if (nextArgumentIsFile==0) {
 | 
			
		||||
 | 
			
		||||
        /* '-' means stdin/stdout */
 | 
			
		||||
        if (!strcmp(argument, "-")){
 | 
			
		||||
            if (!filenameIdx) { filenameIdx=1, filenameTable[0]=stdinmark; outFileName=stdoutmark; continue; }
 | 
			
		||||
        }
 | 
			
		||||
            /* long commands (--long-word) */
 | 
			
		||||
            if (!strcmp(argument, "--")) { nextArgumentIsFile=1; continue; }
 | 
			
		||||
            if (!strcmp(argument, "--decompress")) { decode=1; continue; }
 | 
			
		||||
            if (!strcmp(argument, "--force")) {  FIO_overwriteMode(); continue; }
 | 
			
		||||
            if (!strcmp(argument, "--version")) { displayOut=stdout; DISPLAY(WELCOME_MESSAGE); CLEAN_RETURN(0); }
 | 
			
		||||
            if (!strcmp(argument, "--help")) { displayOut=stdout; CLEAN_RETURN(usage_advanced(programName)); }
 | 
			
		||||
            if (!strcmp(argument, "--verbose")) { displayLevel++; continue; }
 | 
			
		||||
            if (!strcmp(argument, "--quiet")) { displayLevel--; continue; }
 | 
			
		||||
            if (!strcmp(argument, "--stdout")) { forceStdout=1; outFileName=stdoutmark; displayLevel-=(displayLevel==2); continue; }
 | 
			
		||||
            if (!strcmp(argument, "--ultra")) { FIO_setMaxWLog(0); continue; }
 | 
			
		||||
            if (!strcmp(argument, "--check")) { FIO_setChecksumFlag(2); continue; }
 | 
			
		||||
            if (!strcmp(argument, "--no-check")) { FIO_setChecksumFlag(0); continue; }
 | 
			
		||||
            if (!strcmp(argument, "--no-dictID")) { FIO_setDictIDFlag(0); continue; }
 | 
			
		||||
            if (!strcmp(argument, "--sparse")) { FIO_setSparseWrite(2); continue; }
 | 
			
		||||
            if (!strcmp(argument, "--no-sparse")) { FIO_setSparseWrite(0); continue; }
 | 
			
		||||
            if (!strcmp(argument, "--test")) { decode=1; outFileName=nulmark; FIO_overwriteMode(); continue; }
 | 
			
		||||
            if (!strcmp(argument, "--train")) { dictBuild=1; outFileName=g_defaultDictName; continue; }
 | 
			
		||||
            if (!strcmp(argument, "--maxdict")) { nextArgumentIsMaxDict=1; continue; }
 | 
			
		||||
            if (!strcmp(argument, "--dictID")) { nextArgumentIsDictID=1; continue; }
 | 
			
		||||
            if (!strcmp(argument, "--keep")) { FIO_setRemoveSrcFile(0); continue; }
 | 
			
		||||
            if (!strcmp(argument, "--rm")) { FIO_setRemoveSrcFile(1); continue; }
 | 
			
		||||
 | 
			
		||||
        /* Decode commands (note : aggregated commands are allowed) */
 | 
			
		||||
        if (argument[0]=='-') {
 | 
			
		||||
            argument++;
 | 
			
		||||
 | 
			
		||||
            while (argument[0]!=0) {
 | 
			
		||||
#ifndef ZSTD_NOCOMPRESS
 | 
			
		||||
                /* compression Level */
 | 
			
		||||
                if ((*argument>='0') && (*argument<='9')) {
 | 
			
		||||
                    cLevel = readU32FromChar(&argument);
 | 
			
		||||
                    dictCLevel = cLevel;
 | 
			
		||||
                    if (dictCLevel > ZSTD_maxCLevel())
 | 
			
		||||
                        CLEAN_RETURN(badusage(programName));
 | 
			
		||||
            /* '-' means stdin/stdout */
 | 
			
		||||
            if (!strcmp(argument, "-")){
 | 
			
		||||
                if (!filenameIdx) {
 | 
			
		||||
                    filenameIdx=1, filenameTable[0]=stdinmark;
 | 
			
		||||
                    outFileName=stdoutmark;
 | 
			
		||||
                    displayLevel-=(displayLevel==2);
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
#endif
 | 
			
		||||
            }   }
 | 
			
		||||
 | 
			
		||||
                switch(argument[0])
 | 
			
		||||
                {
 | 
			
		||||
                    /* Display help */
 | 
			
		||||
                case 'V': displayOut=stdout; DISPLAY(WELCOME_MESSAGE); CLEAN_RETURN(0);   /* Version Only */
 | 
			
		||||
                case 'H':
 | 
			
		||||
                case 'h': displayOut=stdout; CLEAN_RETURN(usage_advanced(programName));
 | 
			
		||||
            /* Decode commands (note : aggregated commands are allowed) */
 | 
			
		||||
            if (argument[0]=='-') {
 | 
			
		||||
                argument++;
 | 
			
		||||
 | 
			
		||||
                     /* Decoding */
 | 
			
		||||
                case 'd': decode=1; argument++; break;
 | 
			
		||||
                while (argument[0]!=0) {
 | 
			
		||||
    #ifndef ZSTD_NOCOMPRESS
 | 
			
		||||
                    /* compression Level */
 | 
			
		||||
                    if ((*argument>='0') && (*argument<='9')) {
 | 
			
		||||
                        cLevel = readU32FromChar(&argument);
 | 
			
		||||
                        dictCLevel = cLevel;
 | 
			
		||||
                        if (dictCLevel > ZSTD_maxCLevel())
 | 
			
		||||
                            CLEAN_RETURN(badusage(programName));
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
                    /* Force stdout, even if stdout==console */
 | 
			
		||||
                case 'c': forceStdout=1; outFileName=stdoutmark; displayLevel=1; argument++; break;
 | 
			
		||||
                    switch(argument[0])
 | 
			
		||||
                    {
 | 
			
		||||
                        /* Display help */
 | 
			
		||||
                    case 'V': displayOut=stdout; DISPLAY(WELCOME_MESSAGE); CLEAN_RETURN(0);   /* Version Only */
 | 
			
		||||
                    case 'H':
 | 
			
		||||
                    case 'h': displayOut=stdout; CLEAN_RETURN(usage_advanced(programName));
 | 
			
		||||
 | 
			
		||||
                    /* Use file content as dictionary */
 | 
			
		||||
                case 'D': nextEntryIsDictionary = 1; argument++; break;
 | 
			
		||||
                         /* Decoding */
 | 
			
		||||
                    case 'd': decode=1; argument++; break;
 | 
			
		||||
 | 
			
		||||
                    /* Overwrite */
 | 
			
		||||
                case 'f': FIO_overwriteMode(); forceStdout=1; argument++; break;
 | 
			
		||||
                        /* Force stdout, even if stdout==console */
 | 
			
		||||
                    case 'c': forceStdout=1; outFileName=stdoutmark; displayLevel-=(displayLevel==2); argument++; break;
 | 
			
		||||
 | 
			
		||||
                    /* Verbose mode */
 | 
			
		||||
                case 'v': displayLevel=4; argument++; break;
 | 
			
		||||
                        /* Use file content as dictionary */
 | 
			
		||||
                    case 'D': nextEntryIsDictionary = 1; argument++; break;
 | 
			
		||||
 | 
			
		||||
                    /* Quiet mode */
 | 
			
		||||
                case 'q': displayLevel--; argument++; break;
 | 
			
		||||
                        /* Overwrite */
 | 
			
		||||
                    case 'f': FIO_overwriteMode(); forceStdout=1; argument++; break;
 | 
			
		||||
 | 
			
		||||
                    /* keep source file (default anyway, so useless; for gzip/xz compatibility) */
 | 
			
		||||
                case 'k': argument++; break;
 | 
			
		||||
                        /* Verbose mode */
 | 
			
		||||
                    case 'v': displayLevel++; argument++; break;
 | 
			
		||||
 | 
			
		||||
                    /* Checksum */
 | 
			
		||||
                case 'C': argument++; FIO_setChecksumFlag(2); break;
 | 
			
		||||
                        /* Quiet mode */
 | 
			
		||||
                    case 'q': displayLevel--; argument++; break;
 | 
			
		||||
 | 
			
		||||
                    /* test compressed file */
 | 
			
		||||
                case 't': decode=1; outFileName=nulmark; argument++; break;
 | 
			
		||||
                        /* keep source file (default); for gzip/xz compatibility */
 | 
			
		||||
                    case 'k': FIO_setRemoveSrcFile(0); argument++; break;
 | 
			
		||||
 | 
			
		||||
                    /* dictionary name */
 | 
			
		||||
                case 'o': nextArgumentIsOutFileName=1; argument++; break;
 | 
			
		||||
                        /* Checksum */
 | 
			
		||||
                    case 'C': argument++; FIO_setChecksumFlag(2); break;
 | 
			
		||||
 | 
			
		||||
                    /* recursive */
 | 
			
		||||
                case 'r': recursive=1; argument++; break;
 | 
			
		||||
                        /* test compressed file */
 | 
			
		||||
                    case 't': decode=1; outFileName=nulmark; argument++; break;
 | 
			
		||||
 | 
			
		||||
#ifndef ZSTD_NOBENCH
 | 
			
		||||
                    /* Benchmark */
 | 
			
		||||
                case 'b': bench=1; argument++; break;
 | 
			
		||||
                        /* destination file name */
 | 
			
		||||
                    case 'o': nextArgumentIsOutFileName=1; argument++; break;
 | 
			
		||||
 | 
			
		||||
                    /* range bench (benchmark only) */
 | 
			
		||||
                case 'e':
 | 
			
		||||
                        /* compression Level */
 | 
			
		||||
                        /* recursive */
 | 
			
		||||
                    case 'r': recursive=1; argument++; break;
 | 
			
		||||
 | 
			
		||||
    #ifndef ZSTD_NOBENCH
 | 
			
		||||
                        /* Benchmark */
 | 
			
		||||
                    case 'b': bench=1; argument++; break;
 | 
			
		||||
 | 
			
		||||
                        /* range bench (benchmark only) */
 | 
			
		||||
                    case 'e':
 | 
			
		||||
                            /* compression Level */
 | 
			
		||||
                            argument++;
 | 
			
		||||
                            cLevelLast = readU32FromChar(&argument);
 | 
			
		||||
                            break;
 | 
			
		||||
 | 
			
		||||
                        /* Modify Nb Iterations (benchmark only) */
 | 
			
		||||
                    case 'i':
 | 
			
		||||
                        argument++;
 | 
			
		||||
                        cLevelLast = readU32FromChar(&argument);
 | 
			
		||||
                        {   U32 const iters = readU32FromChar(&argument);
 | 
			
		||||
                            BMK_setNotificationLevel(displayLevel);
 | 
			
		||||
                            BMK_SetNbIterations(iters);
 | 
			
		||||
                        }
 | 
			
		||||
                        break;
 | 
			
		||||
 | 
			
		||||
                    /* Modify Nb Iterations (benchmark only) */
 | 
			
		||||
                case 'i':
 | 
			
		||||
                    argument++;
 | 
			
		||||
                    {   U32 const iters = readU32FromChar(&argument);
 | 
			
		||||
                        BMK_setNotificationLevel(displayLevel);
 | 
			
		||||
                        BMK_SetNbIterations(iters);
 | 
			
		||||
                        /* cut input into blocks (benchmark only) */
 | 
			
		||||
                    case 'B':
 | 
			
		||||
                        argument++;
 | 
			
		||||
                        {   size_t bSize = readU32FromChar(&argument);
 | 
			
		||||
                            if (toupper(*argument)=='K') bSize<<=10, argument++;  /* allows using KB notation */
 | 
			
		||||
                            if (toupper(*argument)=='M') bSize<<=20, argument++;
 | 
			
		||||
                            if (toupper(*argument)=='B') argument++;
 | 
			
		||||
                            BMK_setNotificationLevel(displayLevel);
 | 
			
		||||
                            BMK_SetBlockSize(bSize);
 | 
			
		||||
                        }
 | 
			
		||||
                        break;
 | 
			
		||||
    #endif   /* ZSTD_NOBENCH */
 | 
			
		||||
 | 
			
		||||
                        /* Dictionary Selection level */
 | 
			
		||||
                    case 's':
 | 
			
		||||
                        argument++;
 | 
			
		||||
                        dictSelect = readU32FromChar(&argument);
 | 
			
		||||
                        break;
 | 
			
		||||
 | 
			
		||||
                        /* Pause at the end (-p) or set an additional param (-p#) (hidden option) */
 | 
			
		||||
                    case 'p': argument++;
 | 
			
		||||
    #ifndef ZSTD_NOBENCH
 | 
			
		||||
                        if ((*argument>='0') && (*argument<='9')) {
 | 
			
		||||
                            BMK_setAdditionalParam(readU32FromChar(&argument));
 | 
			
		||||
                        } else
 | 
			
		||||
    #endif
 | 
			
		||||
                            main_pause=1;
 | 
			
		||||
                        break;
 | 
			
		||||
                        /* unknown command */
 | 
			
		||||
                    default : CLEAN_RETURN(badusage(programName));
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                    /* cut input into blocks (benchmark only) */
 | 
			
		||||
                case 'B':
 | 
			
		||||
                    argument++;
 | 
			
		||||
                    {   size_t bSize = readU32FromChar(&argument);
 | 
			
		||||
                        if (toupper(*argument)=='K') bSize<<=10, argument++;  /* allows using KB notation */
 | 
			
		||||
                        if (toupper(*argument)=='M') bSize<<=20, argument++;
 | 
			
		||||
                        if (toupper(*argument)=='B') argument++;
 | 
			
		||||
                        BMK_setNotificationLevel(displayLevel);
 | 
			
		||||
                        BMK_SetBlockSize(bSize);
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
#endif   /* ZSTD_NOBENCH */
 | 
			
		||||
 | 
			
		||||
                    /* Dictionary Selection level */
 | 
			
		||||
                case 's':
 | 
			
		||||
                    argument++;
 | 
			
		||||
                    dictSelect = readU32FromChar(&argument);
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                    /* Pause at the end (-p) or set an additional param (-p#) (hidden option) */
 | 
			
		||||
                case 'p': argument++;
 | 
			
		||||
#ifndef ZSTD_NOBENCH
 | 
			
		||||
                    if ((*argument>='0') && (*argument<='9')) {
 | 
			
		||||
                        BMK_setAdditionalParam(readU32FromChar(&argument));
 | 
			
		||||
                    } else
 | 
			
		||||
#endif
 | 
			
		||||
                        main_pause=1;
 | 
			
		||||
                    break;
 | 
			
		||||
                    /* unknown command */
 | 
			
		||||
                default : CLEAN_RETURN(badusage(programName));
 | 
			
		||||
                }
 | 
			
		||||
                continue;
 | 
			
		||||
            }   /* if (argument[0]=='-') */
 | 
			
		||||
 | 
			
		||||
            if (nextArgumentIsMaxDict) {
 | 
			
		||||
                nextArgumentIsMaxDict = 0;
 | 
			
		||||
                maxDictSize = readU32FromChar(&argument);
 | 
			
		||||
                if (toupper(*argument)=='K') maxDictSize <<= 10;
 | 
			
		||||
                if (toupper(*argument)=='M') maxDictSize <<= 20;
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            continue;
 | 
			
		||||
        }   /* if (argument[0]=='-') */
 | 
			
		||||
 | 
			
		||||
            if (nextArgumentIsDictID) {
 | 
			
		||||
                nextArgumentIsDictID = 0;
 | 
			
		||||
                dictID = readU32FromChar(&argument);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }   /* if (nextArgumentIsAFile==0) */
 | 
			
		||||
 | 
			
		||||
        if (nextEntryIsDictionary) {
 | 
			
		||||
            nextEntryIsDictionary = 0;
 | 
			
		||||
@@ -397,20 +429,6 @@ int main(int argCount, const char** argv)
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (nextArgumentIsMaxDict) {
 | 
			
		||||
            nextArgumentIsMaxDict = 0;
 | 
			
		||||
            maxDictSize = readU32FromChar(&argument);
 | 
			
		||||
            if (toupper(*argument)=='K') maxDictSize <<= 10;
 | 
			
		||||
            if (toupper(*argument)=='M') maxDictSize <<= 20;
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (nextArgumentIsDictID) {
 | 
			
		||||
            nextArgumentIsDictID = 0;
 | 
			
		||||
            dictID = readU32FromChar(&argument);
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* add filename to list */
 | 
			
		||||
        filenameTable[filenameIdx++] = argument;
 | 
			
		||||
    }
 | 
			
		||||
@@ -444,6 +462,7 @@ int main(int argCount, const char** argv)
 | 
			
		||||
    if (dictBuild) {
 | 
			
		||||
#ifndef ZSTD_NODICT
 | 
			
		||||
        ZDICT_params_t dictParams;
 | 
			
		||||
        memset(&dictParams, 0, sizeof(dictParams));
 | 
			
		||||
        dictParams.compressionLevel = dictCLevel;
 | 
			
		||||
        dictParams.selectivityLevel = dictSelect;
 | 
			
		||||
        dictParams.notificationLevel = displayLevel;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,3 +7,4 @@ The following projects are included with the zstd distribution:
 | 
			
		||||
- cmake - CMake project contributed by Artyom Dymchenko
 | 
			
		||||
- VS2008 - Visual Studio 2008 project
 | 
			
		||||
- VS2010 - Visual Studio 2010 project (which also works well with Visual Studio 2012, 2013, 2015)
 | 
			
		||||
- build - command line scripts prepared for Visual Studio compilation without IDE
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
 | 
			
		||||
				MinimalRebuild="true"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
@@ -120,7 +120,7 @@
 | 
			
		||||
				Optimization="2"
 | 
			
		||||
				EnableIntrinsicFunctions="true"
 | 
			
		||||
				OmitFramePointers="true"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 | 
			
		||||
				RuntimeLibrary="0"
 | 
			
		||||
				EnableFunctionLevelLinking="true"
 | 
			
		||||
@@ -194,7 +194,7 @@
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
 | 
			
		||||
				MinimalRebuild="true"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
@@ -271,7 +271,7 @@
 | 
			
		||||
				Optimization="2"
 | 
			
		||||
				EnableIntrinsicFunctions="true"
 | 
			
		||||
				OmitFramePointers="true"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 | 
			
		||||
				RuntimeLibrary="0"
 | 
			
		||||
				EnableFunctionLevelLinking="true"
 | 
			
		||||
@@ -427,7 +427,7 @@
 | 
			
		||||
				>
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\..\..\lib\common\zstd.h"
 | 
			
		||||
				RelativePath="..\..\..\lib\zstd.h"
 | 
			
		||||
				>
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
 | 
			
		||||
				MinimalRebuild="true"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
@@ -120,7 +120,7 @@
 | 
			
		||||
				Optimization="2"
 | 
			
		||||
				EnableIntrinsicFunctions="true"
 | 
			
		||||
				OmitFramePointers="true"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 | 
			
		||||
				RuntimeLibrary="0"
 | 
			
		||||
				EnableFunctionLevelLinking="true"
 | 
			
		||||
@@ -194,7 +194,7 @@
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
 | 
			
		||||
				MinimalRebuild="true"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
@@ -271,7 +271,7 @@
 | 
			
		||||
				Optimization="2"
 | 
			
		||||
				EnableIntrinsicFunctions="true"
 | 
			
		||||
				OmitFramePointers="true"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 | 
			
		||||
				RuntimeLibrary="0"
 | 
			
		||||
				EnableFunctionLevelLinking="true"
 | 
			
		||||
@@ -439,7 +439,7 @@
 | 
			
		||||
				>
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\..\..\lib\common\zstd.h"
 | 
			
		||||
				RelativePath="..\..\..\lib\zstd.h"
 | 
			
		||||
				>
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
 | 
			
		||||
				MinimalRebuild="true"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
@@ -121,7 +121,7 @@
 | 
			
		||||
				Optimization="2"
 | 
			
		||||
				EnableIntrinsicFunctions="true"
 | 
			
		||||
				OmitFramePointers="true"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 | 
			
		||||
				RuntimeLibrary="0"
 | 
			
		||||
				EnableFunctionLevelLinking="true"
 | 
			
		||||
@@ -196,7 +196,7 @@
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
 | 
			
		||||
				MinimalRebuild="true"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
@@ -274,7 +274,7 @@
 | 
			
		||||
				Optimization="2"
 | 
			
		||||
				EnableIntrinsicFunctions="true"
 | 
			
		||||
				OmitFramePointers="true"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 | 
			
		||||
				RuntimeLibrary="0"
 | 
			
		||||
				EnableFunctionLevelLinking="true"
 | 
			
		||||
@@ -495,7 +495,7 @@
 | 
			
		||||
				>
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\..\..\lib\common\zstd.h"
 | 
			
		||||
				RelativePath="..\..\..\lib\zstd.h"
 | 
			
		||||
				>
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				PreprocessorDefinitions="ZSTD_DLL_EXPORT=1;ZSTD_HEAPMODE=0;ZSTD_LEGACY_SUPPORT=0;WIN32;_DEBUG;_CONSOLE"
 | 
			
		||||
				MinimalRebuild="true"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
@@ -120,7 +120,7 @@
 | 
			
		||||
				Optimization="2"
 | 
			
		||||
				EnableIntrinsicFunctions="true"
 | 
			
		||||
				OmitFramePointers="true"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				PreprocessorDefinitions="ZSTD_DLL_EXPORT=1;ZSTD_HEAPMODE=0;ZSTD_LEGACY_SUPPORT=0;WIN32;NDEBUG;_CONSOLE"
 | 
			
		||||
				RuntimeLibrary="0"
 | 
			
		||||
				EnableFunctionLevelLinking="true"
 | 
			
		||||
@@ -194,7 +194,7 @@
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				PreprocessorDefinitions="ZSTD_DLL_EXPORT=1;ZSTD_HEAPMODE=0;ZSTD_LEGACY_SUPPORT=0;WIN32;_DEBUG;_CONSOLE"
 | 
			
		||||
				MinimalRebuild="true"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
@@ -271,7 +271,7 @@
 | 
			
		||||
				Optimization="2"
 | 
			
		||||
				EnableIntrinsicFunctions="true"
 | 
			
		||||
				OmitFramePointers="true"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				AdditionalIncludeDirectories="$(SolutionDir)..\..\lib;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\dictBuilder"
 | 
			
		||||
				PreprocessorDefinitions="ZSTD_DLL_EXPORT=1;ZSTD_HEAPMODE=0;ZSTD_LEGACY_SUPPORT=0;WIN32;NDEBUG;_CONSOLE"
 | 
			
		||||
				RuntimeLibrary="0"
 | 
			
		||||
				EnableFunctionLevelLinking="true"
 | 
			
		||||
@@ -443,7 +443,7 @@
 | 
			
		||||
				>
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\..\..\lib\common\zstd.h"
 | 
			
		||||
				RelativePath="..\..\..\lib\zstd.h"
 | 
			
		||||
				>
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
 
 | 
			
		||||
@@ -1,26 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Filter Include="Header Files">
 | 
			
		||||
      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
    <Filter Include="Source Files">
 | 
			
		||||
      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClCompile Include="..\..\..\programs\datagen.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\programs\datagencli.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\datagen.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
@@ -65,24 +65,24 @@
 | 
			
		||||
  <PropertyGroup Label="UserMacros" />
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
			
		||||
    <LinkIncremental>true</LinkIncremental>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
    <IntDir>$(Platform)\$(Configuration)\</IntDir>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
			
		||||
    <LinkIncremental>true</LinkIncremental>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
			
		||||
    <LinkIncremental>false</LinkIncremental>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
    <IntDir>$(Platform)\$(Configuration)\</IntDir>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
			
		||||
    <LinkIncremental>false</LinkIncremental>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
			
		||||
@@ -175,7 +175,7 @@
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\huf.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\xxhash.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zbuff.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\zstd.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd_internal.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\compress\zstd_opt.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\legacy\zstd_legacy.h" />
 | 
			
		||||
 
 | 
			
		||||
@@ -1,86 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Filter Include="Header Files">
 | 
			
		||||
      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
    <Filter Include="Source Files">
 | 
			
		||||
      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\zstd_common.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\fse_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\programs\fullbench.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\programs\datagen.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\huf_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\decompress\huf_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\zstd_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\decompress\zstd_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\zbuff_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\decompress\zbuff_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\fse_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\entropy_common.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\xxhash.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\fse.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\datagen.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\huf.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\legacy\zstd_legacy.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zbuff.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\compress\zstd_opt.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd_internal.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\util.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\xxhash.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
@@ -66,24 +66,24 @@
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
			
		||||
    <LinkIncremental>true</LinkIncremental>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IntDir>$(Platform)\$(Configuration)\</IntDir>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
			
		||||
    <LinkIncremental>true</LinkIncremental>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
			
		||||
    <LinkIncremental>false</LinkIncremental>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IntDir>$(Platform)\$(Configuration)\</IntDir>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
			
		||||
    <LinkIncremental>false</LinkIncremental>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
			
		||||
    <ClCompile>
 | 
			
		||||
@@ -176,7 +176,7 @@
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\xxhash.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zbuff.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd_internal.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\zstd.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\compress\zstd_opt.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\dictBuilder\divsufsort.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\dictBuilder\zdict.h" />
 | 
			
		||||
 
 | 
			
		||||
@@ -1,92 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Filter Include="Header Files">
 | 
			
		||||
      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
    <Filter Include="Source Files">
 | 
			
		||||
      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClCompile Include="..\..\..\programs\fuzzer.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\programs\datagen.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\zstd_common.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\fse_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\huf_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\decompress\huf_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\zstd_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\decompress\zstd_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\fse_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\entropy_common.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\xxhash.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\dictBuilder\divsufsort.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\dictBuilder\zdict.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\datagen.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\legacy\zstd_legacy.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\fse.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\huf.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zbuff.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd_internal.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\compress\zstd_opt.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\util.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\xxhash.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\dictBuilder\divsufsort.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\dictBuilder\zdict.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
@@ -52,7 +52,7 @@
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\fse.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\huf.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zbuff.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\zstd.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd_internal.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\compress\zstd_opt.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\legacy\zstd_legacy.h" />
 | 
			
		||||
@@ -116,27 +116,27 @@
 | 
			
		||||
  <PropertyGroup Label="UserMacros" />
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
			
		||||
    <LinkIncremental>true</LinkIncremental>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
    <LibraryPath>$(LibraryPath)</LibraryPath>
 | 
			
		||||
    <IntDir>$(Platform)\$(Configuration)\</IntDir>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
			
		||||
    <LinkIncremental>true</LinkIncremental>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
    <LibraryPath>$(LibraryPath);</LibraryPath>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
			
		||||
    <LinkIncremental>false</LinkIncremental>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
    <LibraryPath>$(LibraryPath)</LibraryPath>
 | 
			
		||||
    <IntDir>$(Platform)\$(Configuration)\</IntDir>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
			
		||||
    <LinkIncremental>false</LinkIncremental>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
    <LibraryPath>$(LibraryPath);</LibraryPath>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,158 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Filter Include="Header Files">
 | 
			
		||||
      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
    <Filter Include="Source Files">
 | 
			
		||||
      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClCompile Include="..\..\..\programs\bench.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\programs\fileio.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\programs\zstdcli.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\programs\dibio.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\programs\datagen.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\programs\legacy\fileio_legacy.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\legacy\zstd_v01.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\legacy\zstd_v02.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\legacy\zstd_v03.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\legacy\zstd_v04.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\legacy\zstd_v05.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\legacy\zstd_v06.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\zstd_common.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\fse_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\huf_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\zbuff_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\zstd_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\decompress\huf_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\decompress\zbuff_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\decompress\zstd_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\dictBuilder\divsufsort.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\dictBuilder\zdict.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\fse_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\entropy_common.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\xxhash.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\bench.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\fileio.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\datagen.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\legacy\fileio_legacy.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\legacy\zstd_legacy.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\legacy\zstd_v01.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\legacy\zstd_v02.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\legacy\zstd_v03.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\legacy\zstd_v04.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\legacy\zstd_v05.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\legacy\zstd_v06.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\dibio.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\dictBuilder\zdict.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\dictBuilder\divsufsort.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\fse.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\huf.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zbuff.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd_internal.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\compress\zstd_opt.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\util.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\xxhash.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
@@ -40,7 +40,7 @@
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\huf.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\xxhash.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zbuff.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\zstd.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd_internal.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\compress\zstd_opt.h" />
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\util.h" />
 | 
			
		||||
@@ -97,28 +97,28 @@
 | 
			
		||||
    <LinkIncremental>true</LinkIncremental>
 | 
			
		||||
    <TargetName>zstdlib_x86</TargetName>
 | 
			
		||||
    <IntDir>$(Platform)\$(Configuration)\</IntDir>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
			
		||||
    <LinkIncremental>true</LinkIncremental>
 | 
			
		||||
    <TargetName>zstdlib_x64</TargetName>
 | 
			
		||||
    <IntDir>$(Platform)\$(Configuration)\</IntDir>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
			
		||||
    <LinkIncremental>false</LinkIncremental>
 | 
			
		||||
    <TargetName>zstdlib_x86</TargetName>
 | 
			
		||||
    <IntDir>$(Platform)\$(Configuration)\</IntDir>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
			
		||||
    <LinkIncremental>false</LinkIncremental>
 | 
			
		||||
    <TargetName>zstdlib_x64</TargetName>
 | 
			
		||||
    <IntDir>$(Platform)\$(Configuration)\</IntDir>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <IncludePath>$(IncludePath);$(SolutionDir)..\..\lib;$(SolutionDir)..\..\programs\legacy;$(SolutionDir)..\..\lib\legacy;$(SolutionDir)..\..\lib\common;$(SolutionDir)..\..\lib\dictBuilder;$(UniversalCRT_IncludePath);</IncludePath>
 | 
			
		||||
    <RunCodeAnalysis>false</RunCodeAnalysis>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
			
		||||
 
 | 
			
		||||
@@ -1,95 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Filter Include="Source Files">
 | 
			
		||||
      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
    <Filter Include="Header Files">
 | 
			
		||||
      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\zstd_common.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\fse_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\huf_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\zbuff_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\compress\zstd_compress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\decompress\huf_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\decompress\zbuff_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\decompress\zstd_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\dictBuilder\divsufsort.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\dictBuilder\zdict.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\fse_decompress.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\entropy_common.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="..\..\..\lib\common\xxhash.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\bitstream.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\error_private.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\error_public.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\mem.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\fse.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\huf.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zbuff.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\zstd_internal.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\compress\zstd_opt.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\programs\util.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="..\..\..\lib\common\xxhash.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ResourceCompile Include="zstdlib.rc" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
@@ -47,10 +47,10 @@ SET(ROOT_DIR ../../..)
 | 
			
		||||
 | 
			
		||||
# Define library directory, where sources and header files are located
 | 
			
		||||
SET(LIBRARY_DIR ${ROOT_DIR}/lib)
 | 
			
		||||
INCLUDE_DIRECTORIES(${LIBRARY_DIR}/common)
 | 
			
		||||
INCLUDE_DIRECTORIES(${LIBRARY_DIR} ${LIBRARY_DIR}/common)
 | 
			
		||||
 | 
			
		||||
# Read file content
 | 
			
		||||
FILE(READ ${LIBRARY_DIR}/common/zstd.h HEADER_CONTENT)
 | 
			
		||||
FILE(READ ${LIBRARY_DIR}/zstd.h HEADER_CONTENT)
 | 
			
		||||
 | 
			
		||||
# Parse version
 | 
			
		||||
GetLibraryVersion("${HEADER_CONTENT}" LIBVER_MAJOR LIBVER_MINOR LIBVER_RELEASE)
 | 
			
		||||
@@ -80,7 +80,7 @@ SET(Headers
 | 
			
		||||
        ${LIBRARY_DIR}/common/mem.h
 | 
			
		||||
        ${LIBRARY_DIR}/common/zbuff.h
 | 
			
		||||
        ${LIBRARY_DIR}/common/zstd_internal.h
 | 
			
		||||
        ${LIBRARY_DIR}/common/zstd.h
 | 
			
		||||
        ${LIBRARY_DIR}/zstd.h
 | 
			
		||||
        ${LIBRARY_DIR}/dictBuilder/zdict.h)
 | 
			
		||||
 | 
			
		||||
IF (ZSTD_LEGACY_SUPPORT)
 | 
			
		||||
@@ -162,7 +162,7 @@ IF (UNIX)
 | 
			
		||||
    SET(INSTALL_INCLUDE_DIR ${PREFIX}/include)
 | 
			
		||||
 | 
			
		||||
    # install target
 | 
			
		||||
    INSTALL(FILES ${LIBRARY_DIR}/common/zstd.h ${LIBRARY_DIR}/common/zbuff.h ${LIBRARY_DIR}/dictBuilder/zdict.h DESTINATION ${INSTALL_INCLUDE_DIR})
 | 
			
		||||
    INSTALL(FILES ${LIBRARY_DIR}/zstd.h ${LIBRARY_DIR}/common/zbuff.h ${LIBRARY_DIR}/dictBuilder/zdict.h DESTINATION ${INSTALL_INCLUDE_DIR})
 | 
			
		||||
    INSTALL(TARGETS libzstd_static DESTINATION ${INSTALL_LIBRARY_DIR})
 | 
			
		||||
    INSTALL(TARGETS libzstd_shared LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR})
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ SET(ROOT_DIR ../../..)
 | 
			
		||||
# Define programs directory, where sources and header files are located
 | 
			
		||||
SET(LIBRARY_DIR ${ROOT_DIR}/lib)
 | 
			
		||||
SET(PROGRAMS_DIR ${ROOT_DIR}/programs)
 | 
			
		||||
INCLUDE_DIRECTORIES(${PROGRAMS_DIR} ${LIBRARY_DIR}/common ${LIBRARY_DIR}/dictBuilder)
 | 
			
		||||
INCLUDE_DIRECTORIES(${PROGRAMS_DIR} ${LIBRARY_DIR} ${LIBRARY_DIR}/common ${LIBRARY_DIR}/dictBuilder)
 | 
			
		||||
 | 
			
		||||
IF (ZSTD_LEGACY_SUPPORT)
 | 
			
		||||
    SET(PROGRAMS_LEGACY_DIR ${PROGRAMS_DIR}/legacy)
 | 
			
		||||
 
 | 
			
		||||
@@ -17,8 +17,8 @@ endif
 | 
			
		||||
 | 
			
		||||
ZLIBWRAPPER_PATH = .
 | 
			
		||||
EXAMPLE_PATH = examples
 | 
			
		||||
CC = gcc
 | 
			
		||||
CFLAGS = $(LOC) -I../lib/common -I$(ZLIBDIR) -I$(ZLIBWRAPPER_PATH) -O3 -std=gnu90
 | 
			
		||||
CC ?= gcc
 | 
			
		||||
CFLAGS = $(LOC) -I../lib -I../lib/common -I$(ZLIBDIR) -I$(ZLIBWRAPPER_PATH) -O3 -std=gnu90
 | 
			
		||||
CFLAGS += -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow -Wswitch-enum -Wdeclaration-after-statement -Wstrict-prototypes -Wundef
 | 
			
		||||
LDFLAGS = $(LOC)
 | 
			
		||||
RM = rm -f
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								zstd.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								zstd.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
class Zstd < Formula
 | 
			
		||||
  desc "Zstandard - Fast real-time compression algorithm"
 | 
			
		||||
  homepage "http://www.zstd.net/"
 | 
			
		||||
  url "https://github.com/Cyan4973/zstd/archive/v0.7.4.tar.gz"
 | 
			
		||||
  sha256 "35ab3a5084d0194e9ff08e702edb6f507eab1bfb8c09c913639241cec852e2b7"
 | 
			
		||||
 | 
			
		||||
  def install
 | 
			
		||||
    system "make", "install", "PREFIX=#{prefix}"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  test do
 | 
			
		||||
    (testpath/"input.txt").write("Hello, world." * 10)
 | 
			
		||||
    system "#{bin}/zstd", "input.txt", "-o", "compressed.zst"
 | 
			
		||||
    system "#{bin}/zstd", "--test", "compressed.zst"
 | 
			
		||||
    system "#{bin}/zstd", "-d", "compressed.zst", "-o", "decompressed.txt"
 | 
			
		||||
    system "cmp", "input.txt", "decompressed.txt"
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										1170
									
								
								zstd_compression_format.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1170
									
								
								zstd_compression_format.md
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user