@@ -624,7 +624,6 @@ FIO_openDstFile(FIO_prefs_t* const prefs,
624624 }
625625}
626626
627-
628627/*! FIO_createDictBuffer() :
629628 * creates a buffer, pointed by `*bufferPtr`,
630629 * loads `filename` content into it, up to DICTSIZE_MAX bytes.
@@ -669,23 +668,17 @@ static size_t FIO_createDictBuffer(void** bufferPtr, const char* fileName, FIO_p
669668 * Checks for and warns if there are any files that would have the same output path
670669 */
671670int FIO_checkFilenameCollisions (const char * * filenameTable , unsigned nbFiles ) {
672- const char * * filenameTableSorted , * c , * prevElem , * filename ;
671+ const char * * filenameTableSorted , * prevElem , * filename ;
673672 unsigned u ;
674673
675- #if defined(_MSC_VER ) || defined(__MINGW32__ ) || defined (__MSVCRT__ ) /* windows support */
676- c = "\\" ;
677- #else
678- c = "/" ;
679- #endif
680-
681674 filenameTableSorted = (const char * * ) malloc (sizeof (char * ) * nbFiles );
682675 if (!filenameTableSorted ) {
683676 DISPLAY ("Unable to malloc new str array, not checking for name collisions\n" );
684677 return 1 ;
685678 }
686679
687680 for (u = 0 ; u < nbFiles ; ++ u ) {
688- filename = strrchr (filenameTable [u ], c [ 0 ] );
681+ filename = strrchr (filenameTable [u ], PATH_SEP );
689682 if (filename == NULL ) {
690683 filenameTableSorted [u ] = filenameTable [u ];
691684 } else {
@@ -1599,6 +1592,7 @@ int FIO_compressFilename(FIO_prefs_t* const prefs, const char* dstFileName,
15991592 cRess_t const ress = FIO_createCResources (prefs , dictFileName , UTIL_getFileSize (srcFileName ), compressionLevel , comprParams );
16001593 int const result = FIO_compressFilename_srcFile (prefs , ress , dstFileName , srcFileName , compressionLevel );
16011594
1595+ #define DISPLAY_LEVEL_DEFAULT 2
16021596
16031597 FIO_freeCResources (ress );
16041598 return result ;
@@ -1663,6 +1657,7 @@ static unsigned long long FIO_getLargestFileSize(const char** inFileNames, unsig
16631657 */
16641658int FIO_compressMultipleFilenames (FIO_prefs_t * const prefs ,
16651659 const char * * inFileNamesTable , unsigned nbFiles ,
1660+ const char * outMirroredRootDirName ,
16661661 const char * outDirName ,
16671662 const char * outFileName , const char * suffix ,
16681663 const char * dictFileName , int compressionLevel ,
@@ -1689,12 +1684,29 @@ int FIO_compressMultipleFilenames(FIO_prefs_t* const prefs,
16891684 ress .dstFile = NULL ;
16901685 }
16911686 } else {
1692- unsigned u ;
1687+ unsigned int u = 0 ;
1688+ if (outMirroredRootDirName )
1689+ UTIL_mirrorSourceFilesDirectories (inFileNamesTable , nbFiles , outMirroredRootDirName );
1690+
16931691 for (u = 0 ; u < nbFiles ; u ++ ) {
16941692 const char * const srcFileName = inFileNamesTable [u ];
1695- const char * const dstFileName = FIO_determineCompressedName (srcFileName , outDirName , suffix ); /* cannot fail */
1693+ const char * dstFileName = NULL ;
1694+ if (outMirroredRootDirName ) {
1695+ char * validMirroredDirName = UTIL_createMirroredDestDirName (srcFileName , outMirroredRootDirName );
1696+ if (validMirroredDirName ) {
1697+ dstFileName = FIO_determineCompressedName (srcFileName , validMirroredDirName , suffix );
1698+ free (validMirroredDirName );
1699+ } else {
1700+ DISPLAYLEVEL (2 , "zstd: --output-dir-mirror cannot compress '%s' into '%s' \n" , srcFileName , outMirroredRootDirName );
1701+ continue ;
1702+ }
1703+ } else {
1704+ dstFileName = FIO_determineCompressedName (srcFileName , outDirName , suffix ); /* cannot fail */
1705+ }
1706+
16961707 error |= FIO_compressFilename_srcFile (prefs , ress , dstFileName , srcFileName , compressionLevel );
16971708 }
1709+
16981710 if (outDirName )
16991711 FIO_checkFilenameCollisions (inFileNamesTable ,nbFiles );
17001712 }
@@ -2536,10 +2548,10 @@ FIO_determineDstName(const char* srcFileName, const char* outDirName)
25362548 /* note : dstFileNameBuffer memory is not going to be free */
25372549}
25382550
2539-
25402551int
25412552FIO_decompressMultipleFilenames (FIO_prefs_t * const prefs ,
25422553 const char * * srcNamesTable , unsigned nbFiles ,
2554+ const char * outMirroredRootDirName ,
25432555 const char * outDirName , const char * outFileName ,
25442556 const char * dictFileName )
25452557{
@@ -2558,12 +2570,26 @@ FIO_decompressMultipleFilenames(FIO_prefs_t* const prefs,
25582570 EXM_THROW (72 , "Write error : %s : cannot properly close output file" ,
25592571 strerror (errno ));
25602572 } else {
2561- unsigned u ;
2573+ unsigned int u = 0 ;
2574+ if (outMirroredRootDirName )
2575+ UTIL_mirrorSourceFilesDirectories (srcNamesTable , nbFiles , outMirroredRootDirName );
2576+
25622577 for (u = 0 ; u < nbFiles ; u ++ ) { /* create dstFileName */
25632578 const char * const srcFileName = srcNamesTable [u ];
2564- const char * const dstFileName = FIO_determineDstName (srcFileName , outDirName );
2579+ const char * dstFileName = NULL ;
2580+ if (outMirroredRootDirName ) {
2581+ char * validMirroredDirName = UTIL_createMirroredDestDirName (srcFileName , outMirroredRootDirName );
2582+ if (validMirroredDirName ) {
2583+ dstFileName = FIO_determineDstName (srcFileName , validMirroredDirName );
2584+ free (validMirroredDirName );
2585+ } else {
2586+ DISPLAYLEVEL (2 , "zstd: --output-dir-mirror cannot decompress '%s' into '%s'\n" , srcFileName , outMirroredRootDirName );
2587+ continue ;
2588+ }
2589+ } else {
2590+ dstFileName = FIO_determineDstName (srcFileName , outDirName );
2591+ }
25652592 if (dstFileName == NULL ) { error = 1 ; continue ; }
2566-
25672593 error |= FIO_decompressSrcFile (prefs , ress , dstFileName , srcFileName );
25682594 }
25692595 if (outDirName )
0 commit comments