1
0
mirror of https://github.com/facebook/zstd.git synced 2025-07-29 11:21:22 +03:00

added decompression support

This commit is contained in:
Sen Huang
2019-09-05 17:56:24 -07:00
parent 7f98b46876
commit 6beb3c0159
4 changed files with 45 additions and 17 deletions

View File

@ -1422,7 +1422,6 @@ int FIO_compressMultipleFilenames(FIO_prefs_t* const prefs, const char** inFileN
const char* suffix, const char* dictFileName, const char* suffix, const char* dictFileName,
int compressionLevel, ZSTD_compressionParameters comprParams) int compressionLevel, ZSTD_compressionParameters comprParams)
{ {
printf("compressing multiple...\n");
int error = 0; int error = 0;
cRess_t ress = FIO_createCResources(prefs, dictFileName, compressionLevel, comprParams); cRess_t ress = FIO_createCResources(prefs, dictFileName, compressionLevel, comprParams);
@ -1457,7 +1456,7 @@ int FIO_compressMultipleFilenames(FIO_prefs_t* const prefs, const char** inFileN
} } } }
FIO_freeCResources(ress); FIO_freeCResources(ress);
UTIL_freeDestinationFilenameTable(dstFileNamesTable, nbFiles); /*UTIL_freeDestinationFilenameTable(dstFileNamesTable, nbFiles);*/
return error; return error;
} }
@ -2240,14 +2239,24 @@ FIO_determineDstName(const char* srcFileName)
int int
FIO_decompressMultipleFilenames(FIO_prefs_t* const prefs, FIO_decompressMultipleFilenames(FIO_prefs_t* const prefs,
const char* srcNamesTable[], unsigned nbFiles, const char** srcNamesTable, unsigned nbFiles,
const char* outDirName, char** dstFileNamesTable,
const char* outFileName, const char* outFileName,
const char* dictFileName) const char* dictFileName)
{ {
int error = 0; int error = 0;
dRess_t ress = FIO_createDResources(prefs, dictFileName); dRess_t ress = FIO_createDResources(prefs, dictFileName);
if (outFileName) { if (outDirName != NULL) { /* output into a particular folder */
unsigned u;
for (u = 0; u < nbFiles; ++u) {
const char* const srcFileName = srcNamesTable[u];
const char* const dstFileName = FIO_determineDstName(dstFileNamesTable[u]);
if (dstFileName == NULL) { error=1; continue; }
error |= FIO_decompressSrcFile(prefs, ress, dstFileName, srcFileName);
}
} else if (outFileName) {
unsigned u; unsigned u;
ress.dstFile = FIO_openDstFile(prefs, NULL, outFileName); ress.dstFile = FIO_openDstFile(prefs, NULL, outFileName);
if (ress.dstFile == 0) EXM_THROW(71, "cannot open %s", outFileName); if (ress.dstFile == 0) EXM_THROW(71, "cannot open %s", outFileName);
@ -2268,10 +2277,23 @@ FIO_decompressMultipleFilenames(FIO_prefs_t* const prefs,
} }
FIO_freeDResources(ress); FIO_freeDResources(ress);
/* UTIL_freeDestinationFilenameTable(dstFileNamesTable, nbFiles); */
return error; return error;
} }
void FIO_processMultipleFilenameDestinationDir(char** dstFilenameTable,
const char** filenameTable, unsigned filenameIdx,
const char* outFileName, const char* outDirName) {
int dirResult;
dirResult = UTIL_createDir(outDirName);
if (dirResult)
DISPLAY("Directory creation unsuccessful \n");
UTIL_createDestinationDirTable(filenameTable, filenameIdx, outDirName, dstFilenameTable);
if (outFileName) {
outFileName = dstFilenameTable[0]; /* in case -O is called with single file */
}
}
/* ************************************************************************** /* **************************************************************************
* .zst file info (--list command) * .zst file info (--list command)

View File

@ -114,9 +114,14 @@ int FIO_compressMultipleFilenames(FIO_prefs_t* const prefs, const char** inFileN
@return : nb of missing or skipped files */ @return : nb of missing or skipped files */
int FIO_decompressMultipleFilenames(FIO_prefs_t* const prefs, int FIO_decompressMultipleFilenames(FIO_prefs_t* const prefs,
const char** srcNamesTable, unsigned nbFiles, const char** srcNamesTable, unsigned nbFiles,
const char* outDirName, char** dstFilenameTable,
const char* outFileName, const char* outFileName,
const char* dictFileName); const char* dictFileName);
void FIO_processMultipleFilenameDestinationDir(char** dstFilenameTable,
const char** filenameTable, unsigned filenameIdx,
const char* outFileName, const char* outDirName);
/*-************************************* /*-*************************************
* Advanced stuff (should actually be hosted elsewhere) * Advanced stuff (should actually be hosted elsewhere)

View File

@ -108,6 +108,7 @@ void UTIL_createDestinationDirTable(const char** filenameTable, unsigned nbFiles
unsigned u; unsigned u;
char c; char c;
c = '/'; c = '/';
printf("NBFILE: %u\n", nbFiles);
/* duplicate source file table */ /* duplicate source file table */
for (u = 0; u < nbFiles; ++u) { for (u = 0; u < nbFiles; ++u) {
@ -120,14 +121,17 @@ void UTIL_createDestinationDirTable(const char** filenameTable, unsigned nbFiles
dstFilenameTable[u] = (char*) malloc(finalPathLen * sizeof(char) + 1); dstFilenameTable[u] = (char*) malloc(finalPathLen * sizeof(char) + 1);
strcpy(dstFilenameTable[u], outDirName); strcpy(dstFilenameTable[u], outDirName);
strcat(dstFilenameTable[u], filename); strcat(dstFilenameTable[u], filename);
printf("%s %s\n", filenameTable[u], dstFilenameTable[u]);
} }
} }
void UTIL_freeDestinationFilenameTable(char** dstDirTable, unsigned nbFiles) { void UTIL_freeDestinationFilenameTable(char** dstDirTable, unsigned nbFiles) {
unsigned u; unsigned u;
for (u = 0; u < nbFiles; ++u) for (u = 0; u < nbFiles; ++u) {
free(dstDirTable[u]); if (dstDirTable[u] != NULL)
free((void*)dstDirTable); free(dstDirTable[u]);
}
if (dstDirTable != NULL) free((void*)dstDirTable);
} }
int UTIL_isSameFile(const char* file1, const char* file2) int UTIL_isSameFile(const char* file1, const char* file2)

View File

@ -1177,16 +1177,9 @@ int main(int argCount, const char* argv[])
if (adaptMin > cLevel) cLevel = adaptMin; if (adaptMin > cLevel) cLevel = adaptMin;
if (adaptMax < cLevel) cLevel = adaptMax; if (adaptMax < cLevel) cLevel = adaptMax;
if (outDirName) { if (outDirName)
int dirResult; FIO_processMultipleFilenameDestinationDir(dstFilenameTable, filenameTable, filenameIdx, outFileName, outDirName);
dirResult = UTIL_createDir(outDirName);
if (dirResult) DISPLAY("Directory creation unsuccessful \n");
UTIL_createDestinationDirTable(filenameTable, filenameIdx, outDirName, dstFilenameTable);
if (outFileName) {
outFileName = dstFilenameTable[0]; /* in case -O is called with single file */
}
}
if ((filenameIdx==1) && outFileName) if ((filenameIdx==1) && outFileName)
operationResult = FIO_compressFilename(prefs, outFileName, filenameTable[0], dictFileName, cLevel, compressionParams); operationResult = FIO_compressFilename(prefs, outFileName, filenameTable[0], dictFileName, cLevel, compressionParams);
else else
@ -1205,10 +1198,14 @@ int main(int argCount, const char* argv[])
} }
} }
FIO_setMemLimit(prefs, memLimit); FIO_setMemLimit(prefs, memLimit);
if (outDirName)
FIO_processMultipleFilenameDestinationDir(dstFilenameTable, filenameTable, filenameIdx, outFileName, outDirName);
if (filenameIdx==1 && outFileName) if (filenameIdx==1 && outFileName)
operationResult = FIO_decompressFilename(prefs, outFileName, filenameTable[0], dictFileName); operationResult = FIO_decompressFilename(prefs, outFileName, filenameTable[0], dictFileName);
else else
operationResult = FIO_decompressMultipleFilenames(prefs, filenameTable, filenameIdx, outFileName, dictFileName); operationResult = FIO_decompressMultipleFilenames(prefs, filenameTable, filenameIdx, outDirName, dstFilenameTable, outFileName, dictFileName);
#else #else
DISPLAY("Decompression not supported \n"); DISPLAY("Decompression not supported \n");
#endif #endif