gzstd: decompresses .gz files

This commit is contained in:
Przemyslaw Skibinski 2016-11-30 15:05:54 +01:00
parent 0e14675df2
commit abfb51f5f2
2 changed files with 57 additions and 33 deletions

View File

@ -82,7 +82,7 @@ zstd : $(ZSTDDECOMP_O) $(ZSTD_FILES) $(ZSTDLEGACY_FILES) $(ZDICT_FILES) \
ifneq (,$(filter Windows%,$(OS)))
windres\generate_res.bat
endif
$(CC) $(FLAGS) $^ $(RES_FILE) -o $@$(EXT)
$(CC) $(FLAGS) $^ $(RES_FILE) -o $@$(EXT) $(LDFLAGS)
zstd32 : CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT)
@ -124,6 +124,9 @@ zstd-decompress: clean_decomp_o
zstd-compress: $(ZSTDCOMMON_FILES) $(ZSTDCOMP_FILES) zstdcli.c fileio.c
$(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NODECOMPRESS $^ -o $@$(EXT)
gzstd: clean_decomp_o
CFLAGS+=-DZSTD_GZDECOMPRESS LDFLAGS+=-lz $(MAKE) zstd
generate_res:
windres\generate_res.bat

View File

@ -34,6 +34,9 @@
#include "fileio.h"
#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_magicNumber, ZSTD_frameHeaderSize_max */
#include "zstd.h"
#ifdef ZSTD_GZDECOMPRESS
#include "zlib.h"
#endif
/*-*************************************
@ -657,23 +660,18 @@ static int FIO_decompressSrcFile(dRess_t ress, const char* srcFileName)
{
unsigned long long filesize = 0;
FILE* const dstFile = ress.dstFile;
FILE* srcFile;
unsigned readSomething = 0;
size_t const suffixSize = strlen(GZ_EXTENSION);
size_t const sfnSize = strlen(srcFileName);
const char* const suffixPtr = srcFileName + sfnSize - suffixSize;
if (sfnSize > suffixSize && strcmp(suffixPtr, GZ_EXTENSION) == 0) {
DISPLAYLEVEL(1, "zstd: %s: gz file cannot be uncompressed -- ignored \n", srcFileName);
return 1;
}
if (UTIL_isDirectory(srcFileName)) {
DISPLAYLEVEL(1, "zstd: %s is a directory -- ignored \n", srcFileName);
return 1;
}
srcFile = FIO_openSrcFile(srcFileName);
if (sfnSize <= suffixSize || strcmp(suffixPtr, GZ_EXTENSION) != 0) {
FILE* srcFile = FIO_openSrcFile(srcFileName);
if (srcFile==0) return 1;
/* for each frame */
@ -699,14 +697,37 @@ static int FIO_decompressSrcFile(dRess_t ress, const char* srcFileName)
} }
filesize += FIO_decompressFrame(ress, dstFile, srcFile, toRead, filesize);
}
/* Close file */
if (fclose(srcFile)) EXM_THROW(33, "zstd: %s close error", srcFileName); /* error should never happen */
} else {
#ifndef ZSTD_GZDECOMPRESS
DISPLAYLEVEL(1, "zstd: %s: gz file cannot be uncompressed (zstd compiled without ZSTD_GZDECOMPRESS) -- ignored \n", srcFileName);
return 1;
#else
int readBytes;
gzFile gzSrcFile = gzopen(srcFileName, "rb");
if (gzSrcFile == NULL) { DISPLAY("zstd: %s: gzopen error \n", srcFileName); return 1; }
do {
readBytes = gzread(gzSrcFile, ress.dstBuffer, ress.dstBufferSize);
if (readBytes < 0) { DISPLAY("zstd: %s: gzread error \n", srcFileName); return 1; }
if (readBytes > 0) {
size_t const sizeCheck = fwrite(ress.dstBuffer, 1, readBytes, dstFile);
if (sizeCheck != (size_t)readBytes) EXM_THROW(34, "Write error : cannot write to output file");
}
filesize += readBytes;
} while ((size_t)readBytes == ress.dstBufferSize);
if (gzclose(gzSrcFile) != Z_OK) { DISPLAY("zstd: %s: gzclose error \n", srcFileName); return 1; }
#endif
}
/* Final Status */
DISPLAYLEVEL(2, "\r%79s\r", "");
DISPLAYLEVEL(2, "%-20s: %llu bytes \n", srcFileName, filesize);
/* Close */
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)); };
/* Remove source file */
if (g_removeSrcFile) { if (remove(srcFileName)) EXM_THROW(35, "zstd: %s: %s", srcFileName, strerror(errno)); };
return 0;
}