From b09f59390bbda3481dd78f1ed885a89dedae9923 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 5 Nov 2019 17:02:43 -0800 Subject: [PATCH] refactor code to only use FileNamesTable* --- programs/util.c | 101 ++++--- programs/util.h | 41 ++- programs/zstdcli.c | 671 +++++++++++++++++++++------------------------ 3 files changed, 393 insertions(+), 420 deletions(-) diff --git a/programs/util.c b/programs/util.c index 23f37ccd2..55ca5a681 100644 --- a/programs/util.c +++ b/programs/util.c @@ -335,6 +335,7 @@ UTIL_createFileNamesTable(const char** filenames, size_t tableSize, char* buf) table->fileNames = filenames; table->buf = buf; table->tableSize = tableSize; + table->tableCapacity = tableSize; return table; } @@ -346,6 +347,23 @@ void UTIL_freeFileNamesTable(FileNamesTable* table) free(table); } +FileNamesTable* UTIL_allocateFileNamesTable(size_t tableSize) +{ + const char** const fnTable = (const char**)malloc(tableSize * sizeof(*fnTable)); + FileNamesTable* fnt; + if (fnTable==NULL) return NULL; + fnt = UTIL_createFileNamesTable(fnTable, tableSize, NULL); + fnt->tableSize = 0; /* the table is empty */ + return fnt; +} + +void UTIL_refFilename(FileNamesTable* fnt, const char* filename) +{ + if (fnt->tableCapacity <= fnt->tableSize) abort(); + fnt->fileNames[fnt->tableSize] = filename; + fnt->tableSize++; +} + static size_t getTotalTableSize(FileNamesTable* table) { size_t fnb = 0, totalSize = 0; @@ -568,71 +586,66 @@ const char* UTIL_getFileExtension(const char* infilename) return extension; } -/* - * UTIL_createFileList - takes a list of files and directories (params: inputNames, inputNamesNb), scans directories, - * and returns a new list of files (params: return value, allocatedBuffer, allocatedNamesNb). - * After finishing usage of the list the structures should be freed with UTIL_freeFileList(params: return value, allocatedBuffer) - * In case of error UTIL_createFileList returns NULL and UTIL_freeFileList should not be called. - */ -const char** -UTIL_createFileList(const char **inputNames, unsigned inputNamesNb, - char** allocatedBuffer, unsigned* allocatedNamesNb, - int followLinks) + +static FileNamesTable* +createFNT_fromFNT(FileNamesTable* fnt, int followLinks) { size_t pos; - unsigned i, nbFiles; + size_t const nbIfns = fnt->tableSize; + unsigned nbFiles; + const char** const inputNames = fnt->fileNames; char* buf = (char*)malloc(LIST_SIZE_INCREASE); char* bufend = buf + LIST_SIZE_INCREASE; if (!buf) return NULL; - for (i=0, pos=0, nbFiles=0; i= bufend) { - ptrdiff_t newListSize = (bufend - buf) + LIST_SIZE_INCREASE; - assert(newListSize >= 0); - buf = (char*)UTIL_realloc(buf, (size_t)newListSize); - bufend = buf + newListSize; - if (!buf) return NULL; - } - if (buf + pos + len < bufend) { - memcpy(buf+pos, inputNames[i], len+1); /* including final \0 */ - pos += len + 1; - nbFiles++; - } - } else { - nbFiles += (unsigned)UTIL_prepareFileList(inputNames[i], &buf, &pos, &bufend, followLinks); - if (buf == NULL) return NULL; - } } + { size_t ifnNb; + for (ifnNb=0, pos=0, nbFiles=0; ifnNb= bufend) { + ptrdiff_t newListSize = (bufend - buf) + LIST_SIZE_INCREASE; + assert(newListSize >= 0); + buf = (char*)UTIL_realloc(buf, (size_t)newListSize); + bufend = buf + newListSize; + if (!buf) return NULL; + } + if (buf + pos + len < bufend) { + memcpy(buf+pos, inputNames[ifnNb], len+1); /* including final \0 */ + pos += len + 1; + nbFiles++; + } + } else { + nbFiles += (unsigned)UTIL_prepareFileList(inputNames[ifnNb], &buf, &pos, &bufend, followLinks); + if (buf == NULL) return NULL; + } } } if (nbFiles == 0) { free(buf); return NULL; } - { const char** const fileTable = (const char**)malloc((nbFiles + 1) * sizeof(*fileTable)); - if (!fileTable) { free(buf); return NULL; } + { size_t ifnNb; + const char** const fileNamesTable = (const char**)malloc((nbFiles + 1) * sizeof(*fileNamesTable)); + if (!fileNamesTable) { free(buf); return NULL; } - for (i = 0, pos = 0; i < nbFiles; i++) { - fileTable[i] = buf + pos; - if (buf + pos > bufend) { free(buf); free((void*)fileTable); return NULL; } - pos += strlen(fileTable[i]) + 1; + for (ifnNb = 0, pos = 0; ifnNb < nbFiles; ifnNb++) { + fileNamesTable[ifnNb] = buf + pos; + if (buf + pos > bufend) { free(buf); free((void*)fileNamesTable); return NULL; } + pos += strlen(fileNamesTable[ifnNb]) + 1; } - *allocatedBuffer = buf; - *allocatedNamesNb = nbFiles; - - return fileTable; + return UTIL_createFileNamesTable(fileNamesTable, nbFiles, buf); } } -void UTIL_freeFileList(const char** filenameTable, char* allocatedBuffer) +FileNamesTable* +UTIL_expandFileNamesTable(FileNamesTable* fnt, int followLinks) { - if (allocatedBuffer) free(allocatedBuffer); - if (filenameTable) free((void*)filenameTable); + FileNamesTable* const newFNT = createFNT_fromFNT(fnt, followLinks); + UTIL_freeFileNamesTable(fnt); + return newFNT; } - /*-**************************************** * count the number of physical cores ******************************************/ diff --git a/programs/util.h b/programs/util.h index 93780a4fe..3f154de0d 100644 --- a/programs/util.h +++ b/programs/util.h @@ -159,12 +159,12 @@ U64 UTIL_getTotalFileSize(const char* const * fileNamesTable, unsigned nbFiles); /* do not define UTIL_HAS_CREATEFILELIST */ #endif /* #ifdef _WIN32 */ -/*Note: tableSize denotes the total capacity of table*/ typedef struct { const char** fileNames; - char* buf; - size_t tableSize; + char* buf; /* fileNames are stored in this buffer (or are read-only) */ + size_t tableSize; /* nb of fileNames */ + size_t tableCapacity; } FileNamesTable; /*! UTIL_createFileNamesTable_fromFileName() : @@ -183,7 +183,6 @@ UTIL_createFileNamesTable_fromFileName(const char* inputFileName); FileNamesTable* UTIL_createFileNamesTable(const char** filenames, size_t tableSize, char* buf); - /*! UTIL_freeFileNamesTable() : * This function is compatible with NULL argument and never fails. */ @@ -197,19 +196,31 @@ FileNamesTable* UTIL_concatenateTwoTables(FileNamesTable* table1, FileNamesTable* table2); -/* - * UTIL_createFileList() : - * takes a list of files and directories (@inputNames, @inputNamesNb), - * scans directories, and returns a new list of files (@return, @allocatedBuffer, @allocatedNamesNb). - * In case of error, UTIL_createFileList() returns NULL. - * After list's end of life, the structures should be freed with UTIL_freeFileList (@return, @allocatedBuffer). +/*! UTIL_expandFileNamesTable() : + * read names from @fnt, expand those corresponding to directories + * @return : an expanded FileNamesTable*, with only file names, + * or NULL in case of error. + * Note: the function takes ownership of fnt, and consumes it (free it) */ -const char** -UTIL_createFileList(const char **inputNames, unsigned inputNamesNb, - char** allocatedBuffer, unsigned* allocatedNamesNb, - int followLinks); +FileNamesTable* UTIL_expandFileNamesTable(FileNamesTable* fnt, int followLinks); -void UTIL_freeFileList(const char** filenameTable, char* allocatedBuffer); + +/*! UTIL_allocateFileNamesTable() : + * Allocates a table of const char*, to insert read-only names later on. + * The created FileNamesTable* doesn't hold a buffer. + * @return : FileNamesTable*, or NULL, if allocation fails. + */ +FileNamesTable* UTIL_allocateFileNamesTable(size_t tableSize); + + +/*! UTIL_refFilename() : + * Add a read-only name to reference into @fnt table. + * Since @filename is only referenced, its lifetime must outlive @fnt. + * This function never fails, but it can abort(). + * Internal table must be large enough to reference a new member + * (capacity > size), otherwise the function will abort(). + */ +void UTIL_refFilename(FileNamesTable* fnt, const char* filename); /*-**************************************** diff --git a/programs/zstdcli.c b/programs/zstdcli.c index a244b6c4d..8a9b1fcdb 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -585,10 +585,8 @@ int main(int argCount, const char* argv[]) int cLevelLast = -1000000000; unsigned recursive = 0; unsigned memLimit = 0; - size_t filenameTableSize = argCount; - const char** filenameTable = (const char**)malloc(filenameTableSize * sizeof(const char*)); /* argCount >= 1 */ - char* tableBuf = NULL; - unsigned filenameIdx = 0; + FileNamesTable* filenames = UTIL_allocateFileNamesTable((size_t)argCount); /* argCount >= 1 */ + FileNamesTable* file_of_names = UTIL_allocateFileNamesTable((size_t)argCount); /* argCount >= 1 */ const char* programName = argv[0]; const char* outFileName = NULL; const char* outDirName = NULL; @@ -601,11 +599,6 @@ int main(int argCount, const char* argv[]) size_t srcSizeHint = 0; int dictCLevel = g_defaultDictCLevel; unsigned dictSelect = g_defaultSelectivityLevel; -#ifdef UTIL_HAS_CREATEFILELIST - const char** extendedFileList = NULL; - char* fileNamesBuf = NULL; - unsigned fileNamesNb; -#endif #ifndef ZSTD_NODICT ZDICT_cover_params_t coverParams = defaultCoverParams(); ZDICT_fastCover_params_t fastCoverParams = defaultFastCoverParams(); @@ -620,8 +613,7 @@ int main(int argCount, const char* argv[]) /* init */ (void)recursive; (void)cLevelLast; /* not used when ZSTD_NOBENCH set */ (void)memLimit; /* not used when ZSTD_NODECOMPRESS set */ - if (filenameTable==NULL) { DISPLAY("zstd: %s \n", strerror(errno)); exit(1); } - filenameTable[0] = stdinmark; + if ((filenames==NULL) || (file_of_names==NULL)) { DISPLAY("zstd: allocation error \n"); exit(1); } g_displayOut = stderr; cLevel = init_cLevel(); programName = lastNameFromPath(programName); @@ -651,363 +643,317 @@ int main(int argCount, const char* argv[]) /* command switches */ for (argNb=1; argNb maxFast) fastLevel = maxFast; + if (fastLevel) { + dictCLevel = cLevel = -(int)fastLevel; } else { - cLevel = -1; /* default for --fast */ + CLEAN_RETURN(badusage(programName)); } - continue; + } else if (*argument != 0) { + /* Invalid character following --fast */ + CLEAN_RETURN(badusage(programName)); + } else { + cLevel = -1; /* default for --fast */ } + continue; + } #endif - if (longCommandWArg(&argument, "--filelist=")) { - /* note : in theory, it's better to just store the arguments at this stage, - * and only start to load & interpret the file after command line is parsed. - * For a single file, it would be easy to just store its name here, and parse later. - * However, this implementation makes it possible to read multiple files. - * An equivalent will have to be able to store multiple file names. - */ - FileNamesTable* extendedTable; - FileNamesTable* curTable; - FileNamesTable* concatenatedTables; - - if (!UTIL_fileExist(argument) || !UTIL_isRegularFile(argument)){ - DISPLAYLEVEL(1, "[ERROR] wrong fileName: %s\n", argument); - CLEAN_RETURN(badusage(programName)); - } - - extendedTable = UTIL_createFileNamesTable_fromFileName(argument); - if (!extendedTable) { - CLEAN_RETURN(badusage(programName)); - } - - - filenameTable[filenameIdx] = NULL; /* marking end of table */ - filenameIdx += (unsigned) extendedTable->tableSize; - - curTable = UTIL_createFileNamesTable(filenameTable, filenameTableSize, tableBuf); - - if (!curTable) { - UTIL_freeFileNamesTable(extendedTable); - CLEAN_RETURN(badusage(programName)); - } - - concatenatedTables = UTIL_concatenateTwoTables(curTable, extendedTable); - if (!concatenatedTables) { - UTIL_freeFileNamesTable(curTable); - UTIL_freeFileNamesTable(extendedTable); - CLEAN_RETURN(badusage(programName)); - } - - /* transfer ownership */ - filenameTable = concatenatedTables->fileNames; - filenameTableSize = concatenatedTables->tableSize; - tableBuf = concatenatedTables->buf; - concatenatedTables->fileNames = NULL; - concatenatedTables->tableSize = 0; - concatenatedTables->buf = NULL; - UTIL_freeFileNamesTable(concatenatedTables); - - continue; - } - /* fall-through, will trigger bad_usage() later on */ + if (longCommandWArg(&argument, "--filelist=")) { + UTIL_refFilename(file_of_names, argument); + continue; } - argument++; - while (argument[0]!=0) { - if (lastCommand) { - DISPLAY("error : command must be followed by argument \n"); - CLEAN_RETURN(1); - } + /* fall-through, will trigger bad_usage() later on */ + } + + argument++; + while (argument[0]!=0) { + if (lastCommand) { + DISPLAY("error : command must be followed by argument \n"); + CLEAN_RETURN(1); + } #ifndef ZSTD_NOCOMPRESS - /* compression Level */ - if ((*argument>='0') && (*argument<='9')) { - dictCLevel = cLevel = (int)readU32FromChar(&argument); - continue; - } + /* compression Level */ + if ((*argument>='0') && (*argument<='9')) { + dictCLevel = cLevel = (int)readU32FromChar(&argument); + continue; + } #endif - switch(argument[0]) - { - /* Display help */ - case 'V': g_displayOut=stdout; printVersion(); CLEAN_RETURN(0); /* Version Only */ - case 'H': - case 'h': g_displayOut=stdout; CLEAN_RETURN(usage_advanced(programName)); + switch(argument[0]) + { + /* Display help */ + case 'V': g_displayOut=stdout; printVersion(); CLEAN_RETURN(0); /* Version Only */ + case 'H': + case 'h': g_displayOut=stdout; CLEAN_RETURN(usage_advanced(programName)); - /* Compress */ - case 'z': operation=zom_compress; argument++; break; + /* Compress */ + case 'z': operation=zom_compress; argument++; break; - /* Decoding */ - case 'd': + /* Decoding */ + case 'd': #ifndef ZSTD_NOBENCH - benchParams.mode = BMK_decodeOnly; - if (operation==zom_bench) { argument++; break; } /* benchmark decode (hidden option) */ + benchParams.mode = BMK_decodeOnly; + if (operation==zom_bench) { argument++; break; } /* benchmark decode (hidden option) */ #endif - operation=zom_decompress; argument++; break; + operation=zom_decompress; argument++; break; - /* Force stdout, even if stdout==console */ - case 'c': forceStdout=1; outFileName=stdoutmark; argument++; break; + /* Force stdout, even if stdout==console */ + case 'c': forceStdout=1; outFileName=stdoutmark; argument++; break; - /* Use file content as dictionary */ - case 'D': nextEntryIsDictionary = 1; lastCommand = 1; argument++; break; + /* Use file content as dictionary */ + case 'D': nextEntryIsDictionary = 1; lastCommand = 1; argument++; break; - /* Overwrite */ - case 'f': FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; argument++; break; + /* Overwrite */ + case 'f': FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; argument++; break; - /* Verbose mode */ - case 'v': g_displayLevel++; argument++; break; + /* Verbose mode */ + case 'v': g_displayLevel++; argument++; break; - /* Quiet mode */ - case 'q': g_displayLevel--; argument++; break; + /* Quiet mode */ + case 'q': g_displayLevel--; argument++; break; - /* keep source file (default) */ - case 'k': FIO_setRemoveSrcFile(prefs, 0); argument++; break; + /* keep source file (default) */ + case 'k': FIO_setRemoveSrcFile(prefs, 0); argument++; break; - /* Checksum */ - case 'C': FIO_setChecksumFlag(prefs, 2); argument++; break; + /* Checksum */ + case 'C': FIO_setChecksumFlag(prefs, 2); argument++; break; - /* test compressed file */ - case 't': operation=zom_test; argument++; break; + /* test compressed file */ + case 't': operation=zom_test; argument++; break; - /* destination file name */ - case 'o': nextArgumentIsOutFileName=1; lastCommand=1; argument++; break; + /* destination file name */ + case 'o': nextArgumentIsOutFileName=1; lastCommand=1; argument++; break; - /* limit decompression memory */ - case 'M': - argument++; - memLimit = readU32FromChar(&argument); - break; - case 'l': operation=zom_list; argument++; break; + /* limit decompression memory */ + case 'M': + argument++; + memLimit = readU32FromChar(&argument); + break; + case 'l': operation=zom_list; argument++; break; #ifdef UTIL_HAS_CREATEFILELIST - /* recursive */ - case 'r': recursive=1; argument++; break; + /* recursive */ + case 'r': recursive=1; argument++; break; #endif #ifndef ZSTD_NOBENCH - /* Benchmark */ - case 'b': - operation=zom_bench; - argument++; - break; + /* Benchmark */ + case 'b': + operation=zom_bench; + argument++; + break; - /* range bench (benchmark only) */ - case 'e': - /* compression Level */ - argument++; - cLevelLast = (int)readU32FromChar(&argument); - break; + /* range bench (benchmark only) */ + case 'e': + /* compression Level */ + argument++; + cLevelLast = (int)readU32FromChar(&argument); + break; - /* Modify Nb Iterations (benchmark only) */ - case 'i': - argument++; - bench_nbSeconds = readU32FromChar(&argument); - break; + /* Modify Nb Iterations (benchmark only) */ + case 'i': + argument++; + bench_nbSeconds = readU32FromChar(&argument); + break; - /* cut input into blocks (benchmark only) */ - case 'B': - argument++; - blockSize = readU32FromChar(&argument); - break; + /* cut input into blocks (benchmark only) */ + case 'B': + argument++; + blockSize = readU32FromChar(&argument); + break; - /* benchmark files separately (hidden option) */ - case 'S': - argument++; - separateFiles = 1; - break; + /* benchmark files separately (hidden option) */ + case 'S': + argument++; + separateFiles = 1; + break; #endif /* ZSTD_NOBENCH */ - /* nb of threads (hidden option) */ - case 'T': - argument++; - nbWorkers = (int)readU32FromChar(&argument); - break; - - /* Dictionary Selection level */ - case 's': - argument++; - dictSelect = readU32FromChar(&argument); - break; - - /* Pause at the end (-p) or set an additional param (-p#) (hidden option) */ - case 'p': argument++; -#ifndef ZSTD_NOBENCH - if ((*argument>='0') && (*argument<='9')) { - benchParams.additionalParam = (int)readU32FromChar(&argument); - } else -#endif - main_pause=1; - break; - - /* Select compressibility of synthetic sample */ - case 'P': - { argument++; - compressibility = (double)readU32FromChar(&argument) / 100; - } + /* nb of threads (hidden option) */ + case 'T': + argument++; + nbWorkers = (int)readU32FromChar(&argument); break; - /* unknown command */ - default : CLEAN_RETURN(badusage(programName)); - } + /* Dictionary Selection level */ + case 's': + argument++; + dictSelect = readU32FromChar(&argument); + break; + + /* Pause at the end (-p) or set an additional param (-p#) (hidden option) */ + case 'p': argument++; +#ifndef ZSTD_NOBENCH + if ((*argument>='0') && (*argument<='9')) { + benchParams.additionalParam = (int)readU32FromChar(&argument); + } else +#endif + main_pause=1; + break; + + /* Select compressibility of synthetic sample */ + case 'P': + { argument++; + compressibility = (double)readU32FromChar(&argument) / 100; } - continue; - } /* if (argument[0]=='-') */ + break; - if (nextArgumentIsMaxDict) { /* kept available for compatibility with old syntax ; will be removed one day */ - nextArgumentIsMaxDict = 0; - lastCommand = 0; - maxDictSize = readU32FromChar(&argument); - continue; + /* unknown command */ + default : CLEAN_RETURN(badusage(programName)); + } } + continue; + } /* if (argument[0]=='-') */ - if (nextArgumentIsDictID) { /* kept available for compatibility with old syntax ; will be removed one day */ - nextArgumentIsDictID = 0; - lastCommand = 0; - dictID = readU32FromChar(&argument); - continue; - } + if (nextArgumentIsMaxDict) { /* kept available for compatibility with old syntax ; will be removed one day */ + nextArgumentIsMaxDict = 0; + lastCommand = 0; + maxDictSize = readU32FromChar(&argument); + continue; + } - } /* if (nextArgumentIsAFile==0) */ + if (nextArgumentIsDictID) { /* kept available for compatibility with old syntax ; will be removed one day */ + nextArgumentIsDictID = 0; + lastCommand = 0; + dictID = readU32FromChar(&argument); + continue; + } if (nextEntryIsDictionary) { nextEntryIsDictionary = 0; @@ -1031,8 +977,8 @@ int main(int argCount, const char* argv[]) continue; } - /* add filename to list */ - filenameTable[filenameIdx++] = argument; + /* none of the above : add filename to list */ + UTIL_refFilename(filenames, argument); } if (lastCommand) { /* forgotten argument */ @@ -1056,37 +1002,47 @@ int main(int argCount, const char* argv[]) #ifdef UTIL_HAS_CREATEFILELIST g_utilDisplayLevel = g_displayLevel; if (!followLinks) { - unsigned u; - for (u=0, fileNamesNb=0; utableSize; + for (u=0, fileNamesNb=0; ufileNames[u]) #ifndef _MSC_VER - && !UTIL_isFIFO(filenameTable[u]) + && !UTIL_isFIFO(filenames->fileNames[u]) #endif /* _MSC_VER */ ) { - DISPLAYLEVEL(2, "Warning : %s is a symbolic link, ignoring\n", filenameTable[u]); + DISPLAYLEVEL(2, "Warning : %s is a symbolic link, ignoring\n", filenames->fileNames[u]); } else { - filenameTable[fileNamesNb++] = filenameTable[u]; + filenames->fileNames[fileNamesNb++] = filenames->fileNames[u]; } } - if (fileNamesNb == 0 && filenameIdx > 0) + if (fileNamesNb == 0 && nbFilenames > 0) /* all names are eliminated */ CLEAN_RETURN(1); - filenameIdx = fileNamesNb; + filenames->tableSize = fileNamesNb; + } /* if (!followLinks) */ + + /* read names from a file */ + if (file_of_names->tableSize) { + size_t const nbFileLists = file_of_names->tableSize; + size_t flNb; + for (flNb=0; flNb < nbFileLists; flNb++) { + FileNamesTable* const fnt = UTIL_createFileNamesTable_fromFileName(file_of_names->fileNames[flNb]); + if (fnt==NULL) { + DISPLAYLEVEL(1, "zstd: error reading %s \n", file_of_names->fileNames[flNb]); + CLEAN_RETURN(1); + } + filenames = UTIL_concatenateTwoTables(filenames, fnt); + } } + if (recursive) { /* at this stage, filenameTable is a list of paths, which can contain both files and directories */ - extendedFileList = UTIL_createFileList(filenameTable, filenameIdx, &fileNamesBuf, &fileNamesNb, followLinks); - if (extendedFileList) { - unsigned u; - for (u=0; utableSize, filenames->fileNames, g_displayLevel); CLEAN_RETURN(ret); #else DISPLAY("file information is not supported \n"); @@ -1117,18 +1073,18 @@ int main(int argCount, const char* argv[]) if (cLevelLast < cLevel) cLevelLast = cLevel; if (cLevelLast > cLevel) DISPLAYLEVEL(3, "Benchmarking levels from %d to %d\n", cLevel, cLevelLast); - if (filenameIdx) { + if (filenames->tableSize > 0) { if(separateFiles) { unsigned i; - for(i = 0; i < filenameIdx; i++) { + for(i = 0; i < filenames->tableSize; i++) { int c; - DISPLAYLEVEL(3, "Benchmarking %s \n", filenameTable[i]); + DISPLAYLEVEL(3, "Benchmarking %s \n", filenames->fileNames[i]); for(c = cLevel; c <= cLevelLast; c++) { - BMK_benchFilesAdvanced(&filenameTable[i], 1, dictFileName, c, &compressionParams, g_displayLevel, &benchParams); + BMK_benchFilesAdvanced(&filenames->fileNames[i], 1, dictFileName, c, &compressionParams, g_displayLevel, &benchParams); } } } else { for(; cLevel <= cLevelLast; cLevel++) { - BMK_benchFilesAdvanced(filenameTable, filenameIdx, dictFileName, cLevel, &compressionParams, g_displayLevel, &benchParams); + BMK_benchFilesAdvanced(filenames->fileNames, (unsigned)filenames->tableSize, dictFileName, cLevel, &compressionParams, g_displayLevel, &benchParams); } } } else { for(; cLevel <= cLevelLast; cLevel++) { @@ -1152,18 +1108,18 @@ int main(int argCount, const char* argv[]) int const optimize = !coverParams.k || !coverParams.d; coverParams.nbThreads = (unsigned)nbWorkers; coverParams.zParams = zParams; - operationResult = DiB_trainFromFiles(outFileName, maxDictSize, filenameTable, filenameIdx, blockSize, NULL, &coverParams, NULL, optimize); + operationResult = DiB_trainFromFiles(outFileName, maxDictSize, filenames->fileNames, (unsigned)filenames->tableSize, blockSize, NULL, &coverParams, NULL, optimize); } else if (dict == fastCover) { int const optimize = !fastCoverParams.k || !fastCoverParams.d; fastCoverParams.nbThreads = (unsigned)nbWorkers; fastCoverParams.zParams = zParams; - operationResult = DiB_trainFromFiles(outFileName, maxDictSize, filenameTable, filenameIdx, blockSize, NULL, NULL, &fastCoverParams, optimize); + operationResult = DiB_trainFromFiles(outFileName, maxDictSize, filenames->fileNames, (unsigned)filenames->tableSize, blockSize, NULL, NULL, &fastCoverParams, optimize); } else { ZDICT_legacy_params_t dictParams; memset(&dictParams, 0, sizeof(dictParams)); dictParams.selectivityLevel = dictSelect; dictParams.zParams = zParams; - operationResult = DiB_trainFromFiles(outFileName, maxDictSize, filenameTable, filenameIdx, blockSize, &dictParams, NULL, NULL, 0); + operationResult = DiB_trainFromFiles(outFileName, maxDictSize, filenames->fileNames, (unsigned)filenames->tableSize, blockSize, &dictParams, NULL, NULL, 0); } #else (void)dictCLevel; (void)dictSelect; (void)dictID; (void)maxDictSize; /* not used when ZSTD_NODICT set */ @@ -1178,16 +1134,16 @@ int main(int argCount, const char* argv[]) #endif /* No input filename ==> use stdin and stdout */ - filenameIdx += !filenameIdx; /* filenameTable[0] is stdin by default */ - if (!strcmp(filenameTable[0], stdinmark) && !outFileName) + if (filenames->tableSize == 0) UTIL_refFilename(filenames, stdinmark); + if (!strcmp(filenames->fileNames[0], stdinmark) && !outFileName) outFileName = stdoutmark; /* when input is stdin, default output is stdout */ /* Check if input/output defined as console; trigger an error in this case */ - if (!strcmp(filenameTable[0], stdinmark) && IS_CONSOLE(stdin) ) + if (!strcmp(filenames->fileNames[0], stdinmark) && IS_CONSOLE(stdin) ) CLEAN_RETURN(badusage(programName)); if ( outFileName && !strcmp(outFileName, stdoutmark) && IS_CONSOLE(stdout) - && !strcmp(filenameTable[0], stdinmark) + && !strcmp(filenames->fileNames[0], stdinmark) && !forceStdout && operation!=zom_decompress ) CLEAN_RETURN(badusage(programName)); @@ -1202,8 +1158,8 @@ int main(int argCount, const char* argv[]) #endif /* No status message in pipe mode (stdin - stdout) or multi-files mode */ - if (!strcmp(filenameTable[0], stdinmark) && outFileName && !strcmp(outFileName,stdoutmark) && (g_displayLevel==2)) g_displayLevel=1; - if ((filenameIdx>1) & (g_displayLevel==2)) g_displayLevel=1; + if (!strcmp(filenames->fileNames[0], stdinmark) && outFileName && !strcmp(outFileName,stdoutmark) && (g_displayLevel==2)) g_displayLevel=1; + if ((filenames->tableSize > 1) & (g_displayLevel==2)) g_displayLevel=1; /* IO Stream/File */ FIO_setNotificationLevel(g_displayLevel); @@ -1228,10 +1184,10 @@ int main(int argCount, const char* argv[]) if (adaptMin > cLevel) cLevel = adaptMin; if (adaptMax < cLevel) cLevel = adaptMax; - if ((filenameIdx==1) && outFileName) - operationResult = FIO_compressFilename(prefs, outFileName, filenameTable[0], dictFileName, cLevel, compressionParams); + if ((filenames->tableSize==1) && outFileName) + operationResult = FIO_compressFilename(prefs, outFileName, filenames->fileNames[0], dictFileName, cLevel, compressionParams); else - operationResult = FIO_compressMultipleFilenames(prefs, filenameTable, filenameIdx, outDirName, outFileName, suffix, dictFileName, cLevel, compressionParams); + operationResult = FIO_compressMultipleFilenames(prefs, filenames->fileNames, (unsigned)filenames->tableSize, outDirName, outFileName, suffix, dictFileName, cLevel, compressionParams); #else (void)suffix; (void)adapt; (void)rsyncable; (void)ultra; (void)cLevel; (void)ldmFlag; (void)literalCompressionMode; (void)targetCBlockSize; (void)streamSrcSize; (void)srcSizeHint; /* not used when ZSTD_NOCOMPRESS set */ DISPLAY("Compression not supported \n"); @@ -1246,10 +1202,10 @@ int main(int argCount, const char* argv[]) } } FIO_setMemLimit(prefs, memLimit); - if (filenameIdx==1 && outFileName) { - operationResult = FIO_decompressFilename(prefs, outFileName, filenameTable[0], dictFileName); + if (filenames->tableSize == 1 && outFileName) { + operationResult = FIO_decompressFilename(prefs, outFileName, filenames->fileNames[0], dictFileName); } else { - operationResult = FIO_decompressMultipleFilenames(prefs, filenameTable, filenameIdx, outDirName, outFileName, dictFileName); + operationResult = FIO_decompressMultipleFilenames(prefs, filenames->fileNames, (unsigned)filenames->tableSize, outDirName, outFileName, dictFileName); } #else DISPLAY("Decompression not supported \n"); @@ -1258,16 +1214,9 @@ int main(int argCount, const char* argv[]) _end: FIO_freePreferences(prefs); - - free(tableBuf); - if (main_pause) waitEnter(); -#ifdef UTIL_HAS_CREATEFILELIST - if (extendedFileList) - UTIL_freeFileList(extendedFileList, fileNamesBuf); - else -#endif - free((void*)filenameTable); + UTIL_freeFileNamesTable(filenames); + UTIL_freeFileNamesTable(file_of_names); return operationResult; }