From 1f1f239ed9178238feea4d40bcec885f7d982ffe Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 12 Feb 2016 18:33:26 +0100 Subject: [PATCH] zstd cli can decompress multiple files with no specific suffix condition into stdout --- programs/fileio.c | 88 ++++++++++++++++++++++++------------------- programs/playTests.sh | 6 ++- programs/zstdcli.c | 2 +- 3 files changed, 55 insertions(+), 41 deletions(-) diff --git a/programs/fileio.c b/programs/fileio.c index 3e467fe29..ea6e866cf 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -237,22 +237,6 @@ static FILE* FIO_openDstFile(const char* dstFileName) } -static int FIO_getFiles(FILE** fileOutPtr, FILE** fileInPtr, - const char* dstFileName, const char* srcFileName) -{ - *fileInPtr = FIO_openSrcFile(srcFileName); - if ( *fileInPtr==0 ) { - DISPLAYLEVEL(1, "Unable to access file for processing: %s\n", srcFileName); - return 1; - } - - *fileOutPtr = FIO_openDstFile(dstFileName); - if (*fileOutPtr==0) return 1; - - return 0; -} - - /*!FIO_loadFile * creates a buffer, pointed by *bufferPtr, * loads "filename" content into it @@ -508,6 +492,7 @@ typedef struct { void* dictBuffer; size_t dictBufferSize; ZBUFF_DCtx* dctx; + FILE* dstFile; } dRess_t; static dRess_t FIO_createDResources(const char* dictFileName) @@ -576,15 +561,17 @@ unsigned long long FIO_decompressFrame(dRess_t ress, } -static int FIO_decompressFile_extRess(dRess_t ress, - const char* dstFileName, const char* srcFileName) +/** FIO_decompressSrcFile() : + Decompression `srcFileName` into `ress.dstFile` + @return : 0 : OK + 1 : operation not started +*/ +static int FIO_decompressSrcFile(dRess_t ress, const char* srcFileName) { unsigned long long filesize = 0; - FILE* srcFile; - FILE* dstFile; - - /* Init */ - if (FIO_getFiles(&dstFile, &srcFile, dstFileName, srcFileName)) return 1; + FILE* dstFile = ress.dstFile; + FILE* srcFile = FIO_openSrcFile(srcFileName); + if (srcFile==0) return 1; /* for each frame */ for ( ; ; ) { @@ -593,7 +580,7 @@ static int FIO_decompressFile_extRess(dRess_t ress, size_t toRead = 4; sizeCheck = fread(ress.srcBuffer, (size_t)1, toRead, srcFile); if (sizeCheck==0) break; /* no more input */ - if (sizeCheck != toRead) EXM_THROW(31, "Read error : cannot read header"); + if (sizeCheck != toRead) EXM_THROW(31, "zstd: %s read error : cannot read header", srcFileName); #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT==1) if (ZSTD_isLegacy(MEM_readLE32(ress.srcBuffer))) { filesize += FIO_decompressLegacyFrame(dstFile, srcFile, MEM_readLE32(ress.srcBuffer)); @@ -610,8 +597,24 @@ static int FIO_decompressFile_extRess(dRess_t ress, /* Close */ fclose(srcFile); - if (fclose(dstFile)) EXM_THROW(38, "Write error : cannot properly close %s", dstFileName); + return 0; +} + +/** FIO_decompressFile_extRess() : + decompress `srcFileName` into `dstFileName` + @return : 0 : OK + 1 : operation aborted (src not available, dst already taken, etc.) +*/ +static int FIO_decompressFile_extRess(dRess_t ress, + const char* dstFileName, const char* srcFileName) +{ + ress.dstFile = FIO_openDstFile(dstFileName); + if (ress.dstFile==0) return 1; + + FIO_decompressSrcFile(ress, srcFileName); + + if (fclose(ress.dstFile)) EXM_THROW(38, "Write error : cannot properly close %s", dstFileName); return 0; } @@ -639,26 +642,33 @@ int FIO_decompressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles int missingFiles = 0; char* dstFileName = (char*)malloc(FNSPACE); size_t dfnSize = FNSPACE; - const size_t suffixSize = strlen(suffix); + const size_t suffixSize = suffix ? strlen(suffix) : 0; dRess_t ress; if (dstFileName==NULL) EXM_THROW(70, "not enough memory for dstFileName"); ress = FIO_createDResources(dictFileName); - for (u=0; u tmpall : " $ZSTD -c tmp1 tmp2 tmp3 > tmpall ls -ls tmp* +echo "decompress tmpall* into stdout > tmpdec : " +cp tmpall tmpall2 +$ZSTD -dc tmpall* > tmpdec +ls -ls tmp* $ZSTD -f tmp1 notHere tmp2 && die "missing file not detected!" rm tmp* diff --git a/programs/zstdcli.c b/programs/zstdcli.c index f481b7d8f..22c8c8182 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -395,7 +395,7 @@ int main(int argCount, const char** argv) if (filenameIdx==1) operationResult = FIO_decompressFilename(outFileName, filenameTable[0], dictFileName); else - operationResult = FIO_decompressMultipleFilenames(filenameTable, filenameIdx, ZSTD_EXTENSION, dictFileName); + operationResult = FIO_decompressMultipleFilenames(filenameTable, filenameIdx, forceStdout ? NULL : ZSTD_EXTENSION, dictFileName); } else { /* compression */ if (filenameIdx==1) operationResult = FIO_compressFilename(outFileName, filenameTable[0], dictFileName, cLevel);