rewrite FIO_createFilename_fromOutDir()

This commit is contained in:
Yann Collet 2019-10-18 11:15:10 -07:00
parent caf40d0ae4
commit ad86a5d0bc
2 changed files with 30 additions and 35 deletions

View File

@ -686,56 +686,50 @@ int FIO_checkFilenameCollisions(const char** filenameTable, unsigned nbFiles) {
return 0; 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() : /* FIO_createFilename_fromOutDir() :
* Takes a source file name and specified output directory, and * Takes a source file name and specified output directory, and
* allocates memory for and returns a pointer to final path. * allocates memory for and returns a pointer to final path.
* This function never returns an error (it may abort() in case of pb) * This function never returns an error (it may abort() in case of pb)
*/ */
static char* 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; const char* filenameStart;
char* filename, *result; char separator;
size_t finalPathLen; char* result;
#if defined(_MSC_VER) || defined(__MINGW32__) || defined (__MSVCRT__) /* windows support */ #if defined(_MSC_VER) || defined(__MINGW32__) || defined (__MSVCRT__) /* windows support */
c = "\\"; separator = '\\';
#else #else
c = "/"; separator = '/';
#endif #endif
finalPathLen = strlen(outDirName); filenameStart = extractFilename(path, separator);
filenameBegin = strrchr(srcFilename, c[0]); #if defined(_MSC_VER) || defined(__MINGW32__) || defined (__MSVCRT__) /* windows support */
if (filenameBegin == NULL) { filenameStart = extractFilename(filenameStart, '/'); /* sometimes, '/' separator is also used on Windows (mingw+msys2) */
filename = (char*) malloc((strlen(srcFilename)+1) * sizeof(char)); #endif
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);
}
finalPathLen += strlen(filename); result = (char*) calloc(1, strlen(outDirName) + 1 + strlen(filenameStart) + suffixLen + 1);
result = (char*) malloc((finalPathLen+suffixLen+30) * sizeof(char));
if (!result) { if (!result) {
free(filename); EXM_THROW(30, "zstd: FIO_createFilename_fromOutDir: %s", strerror(errno));
EXM_THROW(30, "zstd: %s", strerror(errno));
} }
strcpy(result, outDirName); memcpy(result, outDirName, strlen(outDirName));
if (outDirName[strlen(outDirName)-1] == c[0]) { if (outDirName[strlen(outDirName)-1] == separator) {
strcat(result, filename); memcpy(result + strlen(outDirName), filenameStart, strlen(filenameStart));
} else { } else {
strcat(result, c); memcpy(result + strlen(outDirName), &separator, 1);
strcat(result, filename); memcpy(result + strlen(outDirName) + 1, filenameStart, strlen(filenameStart));
} }
free(filename);
return result; return result;
} }

View File

@ -250,7 +250,8 @@ clean:
$(MAKE) -C $(ZSTDDIR) clean $(MAKE) -C $(ZSTDDIR) clean
$(MAKE) -C $(PRGDIR) clean $(MAKE) -C $(PRGDIR) clean
@$(RM) -fR $(TESTARTEFACT) @$(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) \ $(PRGDIR)/zstd$(EXT) $(PRGDIR)/zstd32$(EXT) \
fullbench$(EXT) fullbench32$(EXT) \ fullbench$(EXT) fullbench32$(EXT) \
fullbench-lib$(EXT) fullbench-dll$(EXT) \ fullbench-lib$(EXT) fullbench-dll$(EXT) \