-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #248 from Cyan4973/dev
v0.7.4
- Loading branch information
Showing
28 changed files
with
1,291 additions
and
455 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
configurationVersion: 1 | ||
|
||
filters: | ||
# third-party embedded | ||
- filePath: lib/dictBuilder/divsufsort.c |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -37,3 +37,6 @@ _zstdbench/ | |
|
||
# CMake | ||
projects/cmake/ | ||
|
||
# Test artefacts | ||
tmp* |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#build | ||
simple_compression | ||
simple_decompression | ||
dictionary_compression | ||
dictionary_decompression | ||
|
||
#test artefact | ||
tmp* | ||
test* | ||
*.zst |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +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. | ||
Compatible with Legacy modes. | ||
Introduces usage of : `ZSTD_createDDict()` and `ZSTD_decompress_usingDDict()` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,163 @@ | ||
/* | ||
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 */ | ||
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); | ||
} |
Oops, something went wrong.