From c4542294a86c11cd959fe67f7c6f33faf68aa6f7 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Thu, 11 Oct 2018 10:07:11 +0200
Subject: [PATCH] ENH: more stringent checks for fileName concatenation

- avoids some doubled slashes

STYLE: simplify concatenation of processor directory names
---
 .../extrude/extrudeMesh/extrudeMesh.C         |  3 +--
 .../decomposePar/decomposePar.C               |  8 +++----
 .../decomposePar/domainDecomposition.C        |  2 +-
 .../decomposePar/faMeshDecomposition.C        |  9 ++++----
 .../reconstructPar/reconstructPar.C           |  2 +-
 .../reconstructParMesh/reconstructParMesh.C   |  4 ++--
 .../profilingSummary/profilingSummary.C       |  4 ++--
 .../preProcessing/mapFields/mapFields.C       |  9 ++++----
 src/OpenFOAM/global/argList/argList.C         |  2 +-
 .../masterUncollatedFileOperation.C           |  3 +--
 .../primitives/strings/fileName/fileName.C    | 23 ++++++++++++++-----
 11 files changed, 38 insertions(+), 31 deletions(-)

diff --git a/applications/utilities/mesh/generation/extrude/extrudeMesh/extrudeMesh.C b/applications/utilities/mesh/generation/extrude/extrudeMesh/extrudeMesh.C
index 26b33a8605e..1529ce78226 100644
--- a/applications/utilities/mesh/generation/extrude/extrudeMesh/extrudeMesh.C
+++ b/applications/utilities/mesh/generation/extrude/extrudeMesh/extrudeMesh.C
@@ -358,8 +358,7 @@ int main(int argc, char *argv[])
         if (Pstream::parRun())
         {
             sourceCaseDir =
-                sourceCaseDir
-               /"processor" + Foam::name(Pstream::myProcNo());
+                sourceCaseDir/("processor" + Foam::name(Pstream::myProcNo()));
         }
         wordList sourcePatches;
         dict.readEntry("sourcePatches", sourcePatches);
diff --git a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
index e061325c846..d7354e91ac6 100644
--- a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
+++ b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
@@ -589,7 +589,7 @@ int main(int argc, char *argv[])
                 (
                     Time::controlDictName,
                     args.rootPath(),
-                    args.caseName()/fileName(word("processor") + name(proci))
+                    args.caseName()/("processor" + Foam::name(proci))
                 );
                 processorDb.setTime(runTime);
 
@@ -1016,7 +1016,7 @@ int main(int argc, char *argv[])
                                 Time::controlDictName,
                                 args.rootPath(),
                                 args.caseName()
-                               /fileName(word("processor") + name(proci))
+                              / ("processor" + Foam::name(proci))
                             )
                         );
                     }
@@ -1374,8 +1374,8 @@ int main(int argc, char *argv[])
                         (
                             Time::controlDictName,
                             args.rootPath(),
-                            args.caseName()/
-                            fileName(word("processor") + name(procI))
+                            args.caseName()
+                          / ("processor" + Foam::name(procI))
                         );
 
                         processorDb.setTime(runTime);
diff --git a/applications/utilities/parallelProcessing/decomposePar/domainDecomposition.C b/applications/utilities/parallelProcessing/decomposePar/domainDecomposition.C
index 3576fd34044..1d34f53a5a4 100644
--- a/applications/utilities/parallelProcessing/decomposePar/domainDecomposition.C
+++ b/applications/utilities/parallelProcessing/decomposePar/domainDecomposition.C
@@ -305,7 +305,7 @@ bool Foam::domainDecomposition::writeDecomposition(const bool decomposeSets)
 
         fileName processorCasePath
         (
-            time().caseName()/fileName(word("processor") + Foam::name(proci))
+            time().caseName()/("processor" + Foam::name(proci))
         );
 
         // create a database
diff --git a/applications/utilities/parallelProcessing/decomposePar/faMeshDecomposition.C b/applications/utilities/parallelProcessing/decomposePar/faMeshDecomposition.C
index a1296bd86e6..bcefd8c7c9e 100644
--- a/applications/utilities/parallelProcessing/decomposePar/faMeshDecomposition.C
+++ b/applications/utilities/parallelProcessing/decomposePar/faMeshDecomposition.C
@@ -50,7 +50,7 @@ void Foam::faMeshDecomposition::distributeFaces()
         (
             Time::controlDictName,
             time().rootPath(),
-            time().caseName()/fileName(word("processor") + Foam::name(procI))
+            time().caseName()/("processor" + Foam::name(procI))
         );
 
         fvMesh procMesh
@@ -250,7 +250,7 @@ void Foam::faMeshDecomposition::decomposeMesh()
         (
             Time::controlDictName,
             time().rootPath(),
-            time().caseName()/fileName(word("processor") + Foam::name(procI))
+            time().caseName()/("processor" + Foam::name(procI))
         );
 
         fvMesh procFvMesh
@@ -1059,8 +1059,7 @@ void Foam::faMeshDecomposition::decomposeMesh()
     {
         fileName processorCasePath
         (
-            time().caseName()/fileName(word("processor")
-          + Foam::name(procI))
+            time().caseName()/("processor" + Foam::name(procI))
         );
 
         // create a database
@@ -1179,7 +1178,7 @@ bool Foam::faMeshDecomposition::writeDecomposition()
 
         fileName processorCasePath
         (
-            time().caseName()/fileName(word("processor") + Foam::name(procI))
+            time().caseName()/("processor" + Foam::name(procI))
         );
 
         // create a database
diff --git a/applications/utilities/parallelProcessing/reconstructPar/reconstructPar.C b/applications/utilities/parallelProcessing/reconstructPar/reconstructPar.C
index 37e179440d0..6429453e7bf 100644
--- a/applications/utilities/parallelProcessing/reconstructPar/reconstructPar.C
+++ b/applications/utilities/parallelProcessing/reconstructPar/reconstructPar.C
@@ -223,7 +223,7 @@ int main(int argc, char *argv[])
             (
                 Time::controlDictName,
                 args.rootPath(),
-                args.caseName()/fileName(word("processor") + name(proci))
+                args.caseName()/("processor" + Foam::name(proci))
             )
         );
     }
diff --git a/applications/utilities/parallelProcessing/reconstructParMesh/reconstructParMesh.C b/applications/utilities/parallelProcessing/reconstructParMesh/reconstructParMesh.C
index 5236940d408..8bc73b9040e 100644
--- a/applications/utilities/parallelProcessing/reconstructParMesh/reconstructParMesh.C
+++ b/applications/utilities/parallelProcessing/reconstructParMesh/reconstructParMesh.C
@@ -550,7 +550,7 @@ int main(int argc, char *argv[])
     forAll(databases, proci)
     {
         Info<< "Reading database "
-            << args.caseName()/fileName(word("processor") + name(proci))
+            << args.caseName()/("processor" + Foam::name(proci))
             << endl;
 
         databases.set
@@ -560,7 +560,7 @@ int main(int argc, char *argv[])
             (
                 Time::controlDictName,
                 args.rootPath(),
-                args.caseName()/fileName(word("processor") + name(proci))
+                args.caseName()/("processor" + Foam::name(proci))
             )
         );
     }
diff --git a/applications/utilities/postProcessing/miscellaneous/profilingSummary/profilingSummary.C b/applications/utilities/postProcessing/miscellaneous/profilingSummary/profilingSummary.C
index 877bdf3de5b..920ba165a57 100644
--- a/applications/utilities/postProcessing/miscellaneous/profilingSummary/profilingSummary.C
+++ b/applications/utilities/postProcessing/miscellaneous/profilingSummary/profilingSummary.C
@@ -88,7 +88,7 @@ int main(int argc, char *argv[])
     const label nProcs = fileHandler().nProcs(args.path());
     #else
     label nProcs = 0;
-    while (isDir(args.path()/(word("processor") + name(nProcs))))
+    while (isDir(args.path()/("processor" + Foam::name(nProcs))))
     {
         ++nProcs;
     }
@@ -106,7 +106,7 @@ int main(int argc, char *argv[])
             (
                 Time::controlDictName,
                 args.rootPath(),
-                args.caseName()/fileName(word("processor") + name(proci))
+                args.caseName()/("processor" + Foam::name(proci))
             )
         );
     }
diff --git a/applications/utilities/preProcessing/mapFields/mapFields.C b/applications/utilities/preProcessing/mapFields/mapFields.C
index d6fe3578544..649e908d6a8 100644
--- a/applications/utilities/preProcessing/mapFields/mapFields.C
+++ b/applications/utilities/preProcessing/mapFields/mapFields.C
@@ -396,7 +396,7 @@ int main(int argc, char *argv[])
             (
                 Time::controlDictName,
                 rootDirSource,
-                caseDirSource/fileName(word("processor") + name(proci))
+                caseDirSource/("processor" + Foam::name(proci))
             );
 
             #include "setTimeIndex.H"
@@ -471,7 +471,7 @@ int main(int argc, char *argv[])
             (
                 Time::controlDictName,
                 rootDirTarget,
-                caseDirTarget/fileName(word("processor") + name(proci))
+                caseDirTarget/("processor" + Foam::name(proci))
             );
 
             fvMesh meshTarget
@@ -536,7 +536,7 @@ int main(int argc, char *argv[])
             (
                 Time::controlDictName,
                 rootDirSource,
-                caseDirSource/fileName(word("processor") + name(procISource))
+                caseDirSource/("processor" + Foam::name(procISource))
             );
 
             #include "setTimeIndex.H"
@@ -572,8 +572,7 @@ int main(int argc, char *argv[])
                     (
                         Time::controlDictName,
                         rootDirTarget,
-                        caseDirTarget/fileName(word("processor")
-                      + name(procITarget))
+                        caseDirTarget/("processor" + Foam::name(procITarget))
                     );
 
                     fvMesh meshTarget
diff --git a/src/OpenFOAM/global/argList/argList.C b/src/OpenFOAM/global/argList/argList.C
index 467002727ee..b2f0d979cc2 100644
--- a/src/OpenFOAM/global/argList/argList.C
+++ b/src/OpenFOAM/global/argList/argList.C
@@ -1317,7 +1317,7 @@ void Foam::argList::parse
                         isDir
                         (
                             rootPath_/globalCase_
-                          / "processor" + Foam::name(++nProcDirs)
+                          / ("processor" + Foam::name(++nProcDirs))
                         )
                     )
                     {}
diff --git a/src/OpenFOAM/global/fileOperations/masterUncollatedFileOperation/masterUncollatedFileOperation.C b/src/OpenFOAM/global/fileOperations/masterUncollatedFileOperation/masterUncollatedFileOperation.C
index 18ff87a6cb6..13a28663c54 100644
--- a/src/OpenFOAM/global/fileOperations/masterUncollatedFileOperation/masterUncollatedFileOperation.C
+++ b/src/OpenFOAM/global/fileOperations/masterUncollatedFileOperation/masterUncollatedFileOperation.C
@@ -367,8 +367,7 @@ Foam::fileOperations::masterUncollatedFileOperation::localObjectPath
             // Uncollated type, e.g. processor1
             const word procName
             (
-                "processor"
-               +Foam::name(Pstream::myProcNo(Pstream::worldComm))
+                "processor" + Foam::name(Pstream::myProcNo(Pstream::worldComm))
             );
             return
                 processorsPath
diff --git a/src/OpenFOAM/primitives/strings/fileName/fileName.C b/src/OpenFOAM/primitives/strings/fileName/fileName.C
index 83a6d0b70a6..6fda7a5c8f5 100644
--- a/src/OpenFOAM/primitives/strings/fileName/fileName.C
+++ b/src/OpenFOAM/primitives/strings/fileName/fileName.C
@@ -426,13 +426,17 @@ Foam::fileName& Foam::fileName::operator/=(const string& other)
         {
             // Two non-empty strings: can concatenate
 
-            s.append("/");
+            if (s.back() != '/' && other.front() != '/')
+            {
+                s += '/';
+            }
+
             s.append(other);
         }
     }
     else if (other.size())
     {
-        // Or, if the first string is empty
+        // The first string is empty
         s = other;
     }
 
@@ -449,16 +453,23 @@ Foam::fileName Foam::operator/(const string& a, const string& b)
         if (b.size())
         {
             // Two non-empty strings: can concatenate
-            return fileName(a + '/' + b);
+
+            if (a.back() == '/' || b.front() == '/')
+            {
+                return fileName(a + b);
+            }
+            else
+            {
+                return fileName(a + '/' + b);
+            }
         }
 
-        return a;
+        return a;  // The second string was empty
     }
 
-    // Or, if the first string is empty
-
     if (b.size())
     {
+        // The first string is empty
         return b;
     }
 
-- 
GitLab