From ad86a5d0bc8b47bbd77a70c757eef5e008850c15 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 18 Oct 2019 11:15:10 -0700 Subject: [PATCH] rewrite FIO_createFilename_fromOutDir() --- programs/fileio.c | 62 +++++++++++++++++++++-------------------------- tests/Makefile | 3 ++- 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/programs/fileio.c b/programs/fileio.c index 948310e5..a9075db1 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -686,56 +686,50 @@ int FIO_checkFilenameCollisions(const char** filenameTable, unsigned nbFiles) { return 0; } +static const char* +extractFilename(const char* path, char separator) +{ + const char* search = strrchr(path, separator); + if (search == NULL) return path; + return search+1; +} + /* FIO_createFilename_fromOutDir() : * Takes a source file name and specified output directory, and * allocates memory for and returns a pointer to final path. * This function never returns an error (it may abort() in case of pb) */ static char* -FIO_createFilename_fromOutDir(const char* srcFilename, const char* outDirName, const size_t suffixLen) +FIO_createFilename_fromOutDir(const char* path, const char* outDirName, const size_t suffixLen) { - const char* c, *filenameBegin; - char* filename, *result; - size_t finalPathLen; + const char* filenameStart; + char separator; + char* result; - #if defined(_MSC_VER) || defined(__MINGW32__) || defined (__MSVCRT__) /* windows support */ - c = "\\"; - #else - c = "/"; - #endif +#if defined(_MSC_VER) || defined(__MINGW32__) || defined (__MSVCRT__) /* windows support */ + separator = '\\'; +#else + separator = '/'; +#endif - finalPathLen = strlen(outDirName); - filenameBegin = strrchr(srcFilename, c[0]); - if (filenameBegin == NULL) { - filename = (char*) malloc((strlen(srcFilename)+1) * sizeof(char)); - if (!filename) { - EXM_THROW(30, "zstd: %s", strerror(errno)); - } - strcpy(filename, srcFilename); - } else { - filename = (char*) malloc((strlen(filenameBegin+1)+1) * sizeof(char)); - if (!filename) { - EXM_THROW(30, "zstd: %s", strerror(errno)); - } - strcpy(filename, filenameBegin+1); - } + filenameStart = extractFilename(path, separator); +#if defined(_MSC_VER) || defined(__MINGW32__) || defined (__MSVCRT__) /* windows support */ + filenameStart = extractFilename(filenameStart, '/'); /* sometimes, '/' separator is also used on Windows (mingw+msys2) */ +#endif - finalPathLen += strlen(filename); - result = (char*) malloc((finalPathLen+suffixLen+30) * sizeof(char)); + result = (char*) calloc(1, strlen(outDirName) + 1 + strlen(filenameStart) + suffixLen + 1); if (!result) { - free(filename); - EXM_THROW(30, "zstd: %s", strerror(errno)); + EXM_THROW(30, "zstd: FIO_createFilename_fromOutDir: %s", strerror(errno)); } - strcpy(result, outDirName); - if (outDirName[strlen(outDirName)-1] == c[0]) { - strcat(result, filename); + memcpy(result, outDirName, strlen(outDirName)); + if (outDirName[strlen(outDirName)-1] == separator) { + memcpy(result + strlen(outDirName), filenameStart, strlen(filenameStart)); } else { - strcat(result, c); - strcat(result, filename); + memcpy(result + strlen(outDirName), &separator, 1); + memcpy(result + strlen(outDirName) + 1, filenameStart, strlen(filenameStart)); } - free(filename); return result; } diff --git a/tests/Makefile b/tests/Makefile index bd2f9097..04d0b185 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -250,7 +250,8 @@ clean: $(MAKE) -C $(ZSTDDIR) clean $(MAKE) -C $(PRGDIR) clean @$(RM) -fR $(TESTARTEFACT) - @$(RM) -f core *.o tmp* *.tmp result* *.gcda dictionary *.zst \ + @$(RM) -rf tmp* # some test directories are named tmp* + @$(RM) core *.o *.tmp result* *.gcda dictionary *.zst \ $(PRGDIR)/zstd$(EXT) $(PRGDIR)/zstd32$(EXT) \ fullbench$(EXT) fullbench32$(EXT) \ fullbench-lib$(EXT) fullbench-dll$(EXT) \