regroup name creation logic into its own function

for a cleaner main file decompression loop
This commit is contained in:
Yann Collet
2018-09-28 18:19:23 -07:00
parent ec1cb8e996
commit 1ab71a8e72
+57 -41
View File
@@ -1895,48 +1895,27 @@ int FIO_decompressFilename(const char* dstFileName, const char* srcFileName,
} }
#define MAXSUFFIXSIZE 8 /* FIO_determineDstName() :
int FIO_decompressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles, * create a destination filename from a srcFileName.
const char* outFileName, * @return a pointer to it.
const char* dictFileName) * @return == NULL if there is an error */
static const char*
FIO_determineDstName(const char* srcFileName)
{ {
int skippedFiles = 0; static size_t dfnbCapacity = 0;
int missingFiles = 0; static char* dstFileNameBuffer = NULL; /* using static allocation : this function cannot be multi-threaded */
dRess_t ress = FIO_createDResources(dictFileName);
if (outFileName) {
unsigned u;
ress.dstFile = FIO_openDstFile(outFileName);
if (ress.dstFile == 0) EXM_THROW(71, "cannot open %s", outFileName);
for (u=0; u<nbFiles; u++)
missingFiles += FIO_decompressSrcFile(ress, outFileName, srcNamesTable[u]);
if (fclose(ress.dstFile))
EXM_THROW(72, "Write error : cannot properly close output file");
} else {
size_t suffixSize;
size_t dfnbCapacity = FNSPACE;
unsigned u;
char* dstFileName = (char*)malloc(dfnbCapacity);
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];
const char* const suffixPtr = strrchr(srcFileName, '.');
size_t const sfnSize = strlen(srcFileName); size_t const sfnSize = strlen(srcFileName);
if (!suffixPtr) { size_t suffixSize;
const char* const suffixPtr = strrchr(srcFileName, '.');
if (suffixPtr == NULL) {
DISPLAYLEVEL(1, "zstd: %s: unknown suffix -- ignored \n", DISPLAYLEVEL(1, "zstd: %s: unknown suffix -- ignored \n",
srcFileName); srcFileName);
skippedFiles++; return NULL;
continue;
} }
suffixSize = strlen(suffixPtr); suffixSize = strlen(suffixPtr);
if (dfnbCapacity+suffixSize <= sfnSize+1) {
free(dstFileName); /* check suffix is authorized */
dfnbCapacity = sfnSize + 20;
dstFileName = (char*)malloc(dfnbCapacity);
if (dstFileName==NULL)
EXM_THROW(74, "not enough memory for dstFileName");
}
if (sfnSize <= suffixSize if (sfnSize <= suffixSize
|| ( strcmp(suffixPtr, ZSTD_EXTENSION) || ( strcmp(suffixPtr, ZSTD_EXTENSION)
#ifdef ZSTD_GZDECOMPRESS #ifdef ZSTD_GZDECOMPRESS
@@ -1963,15 +1942,52 @@ int FIO_decompressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles
; ;
DISPLAYLEVEL(1, "zstd: %s: unknown suffix (%s expected) -- ignored \n", DISPLAYLEVEL(1, "zstd: %s: unknown suffix (%s expected) -- ignored \n",
srcFileName, suffixlist); srcFileName, suffixlist);
skippedFiles++; return NULL;
continue;
} else {
memcpy(dstFileName, srcFileName, sfnSize - suffixSize);
dstFileName[sfnSize-suffixSize] = '\0';
} }
/* allocate enough space to write dstFilename into it */
if (dfnbCapacity+suffixSize <= sfnSize+1) {
free(dstFileNameBuffer);
dfnbCapacity = sfnSize + 20;
dstFileNameBuffer = (char*)malloc(dfnbCapacity);
if (dstFileNameBuffer==NULL)
EXM_THROW(74, "not enough memory for dstFileName");
}
/* return dst name == src name truncated from suffix */
memcpy(dstFileNameBuffer, srcFileName, sfnSize - suffixSize);
dstFileNameBuffer[sfnSize-suffixSize] = '\0';
return dstFileNameBuffer;
/* note : dstFileNameBuffer memory is not going to be free */
}
int FIO_decompressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles,
const char* outFileName,
const char* dictFileName)
{
int skippedFiles = 0;
int missingFiles = 0;
dRess_t ress = FIO_createDResources(dictFileName);
if (outFileName) {
unsigned u;
ress.dstFile = FIO_openDstFile(outFileName);
if (ress.dstFile == 0) EXM_THROW(71, "cannot open %s", outFileName);
for (u=0; u<nbFiles; u++)
missingFiles += FIO_decompressSrcFile(ress, outFileName, srcNamesTable[u]);
if (fclose(ress.dstFile))
EXM_THROW(72, "Write error : cannot properly close output file");
} else {
unsigned u;
for (u=0; u<nbFiles; u++) { /* create dstFileName */
const char* const srcFileName = srcNamesTable[u];
const char* const dstFileName = FIO_determineDstName(srcFileName);
if (dstFileName == NULL) { skippedFiles++; continue; }
missingFiles += FIO_decompressDstFile(ress, dstFileName, srcFileName); missingFiles += FIO_decompressDstFile(ress, dstFileName, srcFileName);
} }
free(dstFileName);
} }
FIO_freeDResources(ress); FIO_freeDResources(ress);