From 0a7eb6e6dce1333037e67674cc3a9673c3973eb1 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Thu, 25 Jun 2020 09:40:21 +0200
Subject: [PATCH] BUG: bad names if ensight mask contains NO placeholder (fixes
 #1747)

- affects ensightSurfaceReader only.

  If there are no `*` characters, protect against replacement.
  Otherwise it would attempt to replace a zero-length string with
  a single `0`, which results in prepending the name.

STYLE: ensightSurfaceReader constructor explicit
---
 .../readers/ensight/ensightSurfaceReader.C    | 22 +++++++++++++------
 .../readers/ensight/ensightSurfaceReader.H    |  9 ++++----
 2 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C
index 25f1b63e5b3..f8427951417 100644
--- a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C
+++ b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C
@@ -127,16 +127,24 @@ Foam::fileName Foam::ensightSurfaceReader::replaceMask
 (
     const fileName& fName,
     const label timeIndex
-) const
+)
 {
     fileName result(fName);
-    std::ostringstream oss;
 
-    label nMask = stringOps::count(fName, '*');
-    const std::string maskStr(nMask, '*');
-    oss << std::setfill('0') << std::setw(nMask) << timeIndex;
-    const word indexStr = oss.str();
-    result.replace(maskStr, indexStr);
+    const auto nMask = stringOps::count(fName, '*');
+
+    // If there are any '*' chars, they are assumed to be contiguous
+    // Eg, data/******/geometry
+
+    if (nMask)
+    {
+        std::ostringstream oss;
+        oss << std::setfill('0') << std::setw(nMask) << timeIndex;
+
+        const std::string maskStr(nMask, '*');
+        const std::string indexStr = oss.str();
+        result.replace(maskStr, indexStr);
+    }
 
     return result;
 }
diff --git a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.H b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.H
index da725dc315e..ec120d79230 100644
--- a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.H
+++ b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.H
@@ -112,12 +112,12 @@ protected:
         //- Read and check a section header
         void debugSection(const word& expected, IFstream& is) const;
 
-        //- Replace the mask with an 0 padded string
-        fileName replaceMask
+        //- Replace the '*' mask chars with a 0 padded string.
+        static fileName replaceMask
         (
             const fileName& fName,
             const label timeIndex
-        ) const;
+        );
 
         //- Read (and discard) geometry file header.
         //  \return information about node/element id handling
@@ -158,10 +158,11 @@ public:
     //- Runtime type information
     TypeName("ensight");
 
+
     // Constructors
 
         //- Construct from fileName
-        ensightSurfaceReader(const fileName& fName);
+        explicit ensightSurfaceReader(const fileName& fName);
 
 
     //- Destructor
-- 
GitLab