diff --git a/applications/test/fileName/Test-fileName.C b/applications/test/fileName/Test-fileName.C index a60b36e3aa..3863a698f8 100644 --- a/applications/test/fileName/Test-fileName.C +++ b/applications/test/fileName/Test-fileName.C @@ -161,6 +161,29 @@ unsigned testEquals } +unsigned testRelative(std::initializer_list> tests) +{ + Info<< nl << "Checking fileName::relative()" << nl << endl; + + unsigned nFail = 0; + + for (const Pair& test : tests) + { + const std::string& dir = test.first(); + const std::string& parent = test.second(); + + fileName relative = fileName(dir).relative(parent); + + Info<< "directory: " << dir << nl + << "parent : " << parent << nl + << "relative = " << relative << nl + << endl; + } + + return nFail; +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // Main program: @@ -170,12 +193,13 @@ int main(int argc, char *argv[]) argList::addBoolOption("validate", "test fileName::validate"); argList::addBoolOption("ext", "test handing of file extensions"); argList::addBoolOption("construct", "test constructors"); + argList::addBoolOption("relative", "test relative operations"); argList::addBoolOption("default", "reinstate default tests"); argList::addNote("runs default tests or specified ones only"); #include "setRootCase.H" - // Run default tests, unless only specific tests are requested + // Run default tests, unless specific tests are requested const bool defaultTests = args.found("default") || args.options().empty(); @@ -418,6 +442,49 @@ int main(int argc, char *argv[]) } + if (args.found("relative")) + { + unsigned nFail = 0; + + nFail += testRelative + ( + { + { "/some/dir/subdir/name", "" }, + { "/some/dir/subdir/name", "/" }, + { "/some/dir/subdir/name", "/some" }, + { "/some/dir/subdir/name", "/some/" }, + { "/some/dir/subdir/name", "/some/dir" }, + { "/some/dir/subdir/name", "/some/dir/" }, + { "/some/dir/subdir/name", "/some/dir/subdir/name" }, + { "/some/dir/subdir/name", "/some/dir/subdir/name/" }, + { "/some/dir/subdir/name", "/some/other" }, + + // With single-char for name + { "/some/dir/subdir/a", "" }, + { "/some/dir/subdir/a", "/" }, + { "/some/dir/subdir/a", "/some" }, + { "/some/dir/subdir/a", "/some/" }, + { "/some/dir/subdir/a", "/some/dir" }, + { "/some/dir/subdir/a", "/some/dir/" }, + { "/some/dir/subdir/a", "/some/dir/subdir/a" }, + { "/some/dir/subdir/a", "/some/dir/subdir/a/" }, + { "/some/dir/subdir/a", "/some/other" }, + + // Bad input (trailing slash) + { "/some/dir/subdir/a/", "" }, + { "/some/dir/subdir/a/", "/" }, + { "/some/dir/subdir/a/", "/some" }, + { "/some/dir/subdir/a/", "/some/" }, + { "/some/dir/subdir/a/", "/some/dir" }, + { "/some/dir/subdir/a/", "/some/dir/" }, + { "/some/dir/subdir/a/", "/some/dir/subdir/a" }, + { "/some/dir/subdir/a/", "/some/dir/subdir/a/" }, + { "/some/dir/subdir/a/", "/some/other" }, + } + ); + } + + if (!defaultTests) { return 0; diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C index 0788aa4e8e..3c4dd497b0 100644 --- a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C @@ -320,31 +320,6 @@ vtk::outputOptions getOutputOptions(const argList& args) } -fileName relativeName(const fileName& parent, const fileName& file) -{ - string::size_type next = parent.size(); - if - ( - file.startsWith(parent) - && next < file.size() - && file[next] == '/' - ) - { - return file.substr(next+1); - } - else - { - return file; - } -} - - -fileName relativeName(const Time& runTime, const fileName& file) -{ - return relativeName(runTime.path(), file); -} - - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) @@ -672,7 +647,7 @@ int main(int argc, char *argv[]) + timeDesc ); Info<< " faceSet : " - << relativeName(runTime, outputName) << nl; + << outputName.relative(runTime.path()) << nl; vtk::writeFaceSet ( @@ -700,7 +675,7 @@ int main(int argc, char *argv[]) + timeDesc ); Info<< " pointSet : " - << relativeName(runTime, outputName) << nl; + << outputName.relative(runTime.path()) << nl; vtk::writePointSet ( @@ -1095,7 +1070,7 @@ int main(int argc, char *argv[]) + timeDesc ); Info<< " Internal : " - << relativeName(runTime, outputName) << endl; + << outputName.relative(runTime.path()) << nl; // Write mesh vtk::internalWriter writer @@ -1255,7 +1230,7 @@ int main(int argc, char *argv[]) + timeDesc ); Info<< " Combined patches : " - << relativeName(runTime, outputName) << nl; + << outputName.relative(runTime.path()) << nl; vtk::patchWriter writer ( @@ -1325,7 +1300,7 @@ int main(int argc, char *argv[]) + timeDesc ); Info<< " Patch : " - << relativeName(runTime, outputName) << nl; + << outputName.relative(runTime.path()) << nl; vtk::patchWriter writer ( @@ -1426,7 +1401,7 @@ int main(int argc, char *argv[]) + timeDesc ); Info<< " FaceZone : " - << relativeName(runTime, outputName) << nl; + << outputName.relative(runTime.path()) << nl; indirectPrimitivePatch pp ( @@ -1472,7 +1447,7 @@ int main(int argc, char *argv[]) + "_" + timeDesc ); Info<< " Lagrangian: " - << relativeName(runTime, outputName) << nl; + << outputName.relative(runTime.path()) << nl; IOobjectList cloudObjs ( diff --git a/src/OpenFOAM/primitives/strings/fileName/fileName.C b/src/OpenFOAM/primitives/strings/fileName/fileName.C index 70e4fc5b8a..5affbb873f 100644 --- a/src/OpenFOAM/primitives/strings/fileName/fileName.C +++ b/src/OpenFOAM/primitives/strings/fileName/fileName.C @@ -404,6 +404,25 @@ Foam::fileName Foam::fileName::path() const } +Foam::fileName Foam::fileName::relative(const fileName& parent) const +{ + const auto top = parent.size(); + const fileName& f = *this; + + // Everything after "parent/xxx" -> "xxx" + if + ( + top && (f.size() > (top+1)) && (*this)[top] == '/' + && f.startsWith(parent) + ) + { + return f.substr(top+1); + } + + return f; +} + + Foam::fileName Foam::fileName::lessExt() const { const auto i = find_ext(); diff --git a/src/OpenFOAM/primitives/strings/fileName/fileName.H b/src/OpenFOAM/primitives/strings/fileName/fileName.H index f368126216..db94cea4f2 100644 --- a/src/OpenFOAM/primitives/strings/fileName/fileName.H +++ b/src/OpenFOAM/primitives/strings/fileName/fileName.H @@ -265,6 +265,9 @@ public: //- Return directory path name (part before last /) fileName path() const; + //- Return name after stripping off the parent directory + fileName relative(const fileName& parent) const; + //- Return file name without extension (part before last .) fileName lessExt() const;