feat(cli): move decompressed filename policy to Rust
Port destination-name derivation to the Rust file-I/O preference module. Preserve build-configured suffix matching, tar-name conversion, stdin/stdout sentinels, output-directory handling, diagnostics, static-buffer reuse, and allocation behavior through the existing C adapter. Test Plan:\n- cargo test --manifest-path rust/cli/Cargo.toml --no-default-features --features cli,compression,decompression,benchmark\n- cargo test --manifest-path rust/cli/Cargo.toml --no-default-features --features helpers\n- cargo clippy --manifest-path rust/cli/Cargo.toml --all-targets --no-default-features --features cli,compression,decompression,benchmark\n- cargo clippy --manifest-path rust/cli/Cargo.toml --all-targets --no-default-features --features helpers\n- make -B -C programs -j2 zstd zstd-small zstd-frugal\n- make -C tests -j2 test-cli-tests
This commit is contained in:
+3
-96
@@ -312,6 +312,8 @@ unsigned long long FIO_rust_getLargestFileSize(const char** inFileNames, unsigne
|
||||
void FIO_rust_setInBuffer(ZSTD_inBuffer* output, const void* buf, size_t s, size_t pos);
|
||||
void FIO_rust_setOutBuffer(ZSTD_outBuffer* output, void* buf, size_t s, size_t pos);
|
||||
const char* FIO_rust_determineCompressedName(const char* srcFileName, const char* outDirName, const char* suffix);
|
||||
const char* FIO_rust_determineDstName(const char* srcFileName, const char* outDirName,
|
||||
const char* const* suffixList, const char* suffixListStr);
|
||||
#ifdef ZSTD_LZ4COMPRESS
|
||||
int FIO_rust_LZ4_GetBlockSize_FromBlockId(int id);
|
||||
#endif
|
||||
@@ -690,20 +692,6 @@ int FIO_checkFilenameCollisions(const char** filenameTable, unsigned nbFiles) {
|
||||
return FIO_rust_checkFilenameCollisions(filenameTable, nbFiles);
|
||||
}
|
||||
|
||||
char* UTIL_createFilenameFromOutDir(const char* path, const char* outDirName,
|
||||
size_t suffixLen);
|
||||
|
||||
/* 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* path, const char* outDirName, const size_t suffixLen)
|
||||
{
|
||||
return UTIL_createFilenameFromOutDir(path, outDirName, suffixLen);
|
||||
}
|
||||
|
||||
/* FIO_highbit64() :
|
||||
* gives position of highest bit.
|
||||
* note : only works for v > 0 !
|
||||
@@ -2705,88 +2693,7 @@ static const char *suffixListStr =
|
||||
static const char*
|
||||
FIO_determineDstName(const char* srcFileName, const char* outDirName)
|
||||
{
|
||||
static size_t dfnbCapacity = 0;
|
||||
static char* dstFileNameBuffer = NULL; /* using static allocation : this function cannot be multi-threaded */
|
||||
size_t dstFileNameEndPos;
|
||||
char* outDirFilename = NULL;
|
||||
const char* dstSuffix = "";
|
||||
size_t dstSuffixLen = 0;
|
||||
|
||||
size_t sfnSize = strlen(srcFileName);
|
||||
|
||||
size_t srcSuffixLen;
|
||||
const char* const srcSuffix = strrchr(srcFileName, '.');
|
||||
|
||||
if(!strcmp(srcFileName, stdinmark)) {
|
||||
return stdoutmark;
|
||||
}
|
||||
|
||||
if (srcSuffix == NULL) {
|
||||
DISPLAYLEVEL(1,
|
||||
"zstd: %s: unknown suffix (%s expected). "
|
||||
"Can't derive the output file name. "
|
||||
"Specify it with -o dstFileName. Ignoring.\n",
|
||||
srcFileName, suffixListStr);
|
||||
return NULL;
|
||||
}
|
||||
srcSuffixLen = strlen(srcSuffix);
|
||||
|
||||
{
|
||||
const char** matchedSuffixPtr;
|
||||
for (matchedSuffixPtr = suffixList; *matchedSuffixPtr != NULL; matchedSuffixPtr++) {
|
||||
if (!strcmp(*matchedSuffixPtr, srcSuffix)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* check suffix is authorized */
|
||||
if (sfnSize <= srcSuffixLen || *matchedSuffixPtr == NULL) {
|
||||
DISPLAYLEVEL(1,
|
||||
"zstd: %s: unknown suffix (%s expected). "
|
||||
"Can't derive the output file name. "
|
||||
"Specify it with -o dstFileName. Ignoring.\n",
|
||||
srcFileName, suffixListStr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((*matchedSuffixPtr)[1] == 't') {
|
||||
dstSuffix = ".tar";
|
||||
dstSuffixLen = strlen(dstSuffix);
|
||||
}
|
||||
}
|
||||
|
||||
if (outDirName) {
|
||||
outDirFilename = FIO_createFilename_fromOutDir(srcFileName, outDirName, 0);
|
||||
sfnSize = strlen(outDirFilename);
|
||||
assert(outDirFilename != NULL);
|
||||
}
|
||||
|
||||
if (dfnbCapacity+srcSuffixLen <= sfnSize+1+dstSuffixLen) {
|
||||
/* allocate enough space to write dstFilename into it */
|
||||
free(dstFileNameBuffer);
|
||||
dfnbCapacity = sfnSize + 20;
|
||||
dstFileNameBuffer = (char*)malloc(dfnbCapacity);
|
||||
if (dstFileNameBuffer==NULL)
|
||||
EXM_THROW(74, "%s : not enough memory for dstFileName",
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
/* return dst name == src name truncated from suffix */
|
||||
assert(dstFileNameBuffer != NULL);
|
||||
dstFileNameEndPos = sfnSize - srcSuffixLen;
|
||||
if (outDirFilename) {
|
||||
memcpy(dstFileNameBuffer, outDirFilename, dstFileNameEndPos);
|
||||
free(outDirFilename);
|
||||
} else {
|
||||
memcpy(dstFileNameBuffer, srcFileName, dstFileNameEndPos);
|
||||
}
|
||||
|
||||
/* The short tar extensions tzst, tgz, txz and tlz4 files should have "tar"
|
||||
* extension on decompression. Also writes terminating null. */
|
||||
strcpy(dstFileNameBuffer + dstFileNameEndPos, dstSuffix);
|
||||
return dstFileNameBuffer;
|
||||
|
||||
/* note : dstFileNameBuffer memory is not going to be free */
|
||||
return FIO_rust_determineDstName(srcFileName, outDirName, suffixList, suffixListStr);
|
||||
}
|
||||
|
||||
int
|
||||
|
||||
Reference in New Issue
Block a user