Skip to content

Commit 1c9426a

Browse files
committed
Add output-dir-mirror option
1 parent 7afd5d8 commit 1c9426a

File tree

7 files changed

+398
-26
lines changed

7 files changed

+398
-26
lines changed

programs/fileio.c

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
671670
int 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
*/
16641658
int 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-
25402551
int
25412552
FIO_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)

programs/fileio.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ int FIO_listMultipleFiles(unsigned numFiles, const char** filenameTable, int dis
122122
* @return : nb of missing files */
123123
int FIO_compressMultipleFilenames(FIO_prefs_t* const prefs,
124124
const char** inFileNamesTable, unsigned nbFiles,
125+
const char* outMirroredDirName,
125126
const char* outDirName,
126127
const char* outFileName, const char* suffix,
127128
const char* dictFileName, int compressionLevel,
@@ -131,6 +132,7 @@ int FIO_compressMultipleFilenames(FIO_prefs_t* const prefs,
131132
* @return : nb of missing or skipped files */
132133
int FIO_decompressMultipleFilenames(FIO_prefs_t* const prefs,
133134
const char** srcNamesTable, unsigned nbFiles,
135+
const char* outMirroredDirName,
134136
const char* outDirName,
135137
const char* outFileName,
136138
const char* dictFileName);

0 commit comments

Comments
 (0)