Skip to content

Commit 397806d

Browse files
authored
Merge pull request #3425 from roystgnr/namebased_fix
Don't look in path names for file suffixes
2 parents b13e3aa + 1cbeb75 commit 397806d

1 file changed

Lines changed: 68 additions & 49 deletions

File tree

src/mesh/namebased_io.C

Lines changed: 68 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,19 @@ typedef int pid_t;
5757
#endif
5858

5959

60+
namespace // Anonymous namespace for helper
61+
{
62+
// Only check a basename for a suffix, without any preceding
63+
// path name. "/tmp/foo.e25ad0/mesh.msh" is not ExodusII.
64+
std::string_view basename_of(const std::string & fullname)
65+
{
66+
std::size_t first_char = fullname.find_last_of("/\\");
67+
if (first_char == std::string::npos)
68+
first_char = 0;
69+
return std::string_view(fullname).substr(first_char);
70+
}
71+
}
72+
6073
namespace libMesh
6174
{
6275

@@ -68,14 +81,16 @@ void NameBasedIO::read (const std::string & name)
6881
{
6982
MeshBase & mymesh = MeshInput<MeshBase>::mesh();
7083

84+
const std::string_view basename = basename_of(name);
85+
7186
// See if the file exists. Perform this check on all processors
7287
// so that the code is terminated properly in the case that the
7388
// file does not exist.
7489

7590
// For Nemesis files, the name we try to read will have suffixes
7691
// identifying processor rank
77-
if (name.rfind(".nem") + 4 == name.size() ||
78-
name.rfind(".n") + 2 == name.size())
92+
if (basename.rfind(".nem") + 4 == basename.size() ||
93+
basename.rfind(".n") + 2 == basename.size())
7994
{
8095
std::ostringstream full_name;
8196

@@ -94,24 +109,24 @@ void NameBasedIO::read (const std::string & name)
94109
std::ifstream in (full_name.str().c_str());
95110
libmesh_error_msg_if(!in.good(), "ERROR: cannot locate specified file:\n\t" << full_name.str());
96111
}
97-
else if (name.rfind(".cp")) {} // Do error checking in the reader
112+
else if (basename.rfind(".cp")) {} // Do error checking in the reader
98113
else
99114
{
100115
std::ifstream in (name.c_str());
101116
libmesh_error_msg_if(!in.good(), "ERROR: cannot locate specified file:\n\t" << name);
102117
}
103118

104119
// Look for parallel formats first
105-
if (is_parallel_file_format(name))
120+
if (is_parallel_file_format(basename))
106121
{
107122
// no need to handle bz2 files here -- the Xdr class does that.
108-
if ((name.rfind(".xda") < name.size()) ||
109-
(name.rfind(".xdr") < name.size()))
123+
if ((basename.rfind(".xda") < basename.size()) ||
124+
(basename.rfind(".xdr") < basename.size()))
110125
{
111126
XdrIO xdr_io(mymesh);
112127

113128
// .xda* ==> bzip2/gzip/ASCII flavors
114-
if (name.rfind(".xda") < name.size())
129+
if (basename.rfind(".xda") < basename.size())
115130
{
116131
xdr_io.binary() = false;
117132
xdr_io.read (name);
@@ -148,12 +163,12 @@ void NameBasedIO::read (const std::string & name)
148163
mymesh.allow_renumbering(false);
149164
#endif
150165
}
151-
else if (name.rfind(".nem") < name.size() ||
152-
name.rfind(".n") < name.size())
166+
else if (basename.rfind(".nem") < basename.size() ||
167+
basename.rfind(".n") < basename.size())
153168
Nemesis_IO(mymesh).read (name);
154-
else if (name.rfind(".cp") < name.size())
169+
else if (basename.rfind(".cp") < basename.size())
155170
{
156-
if (name.rfind(".cpa") < name.size())
171+
if (basename.rfind(".cpa") < basename.size())
157172
CheckpointIO(mymesh, false).read(name);
158173
else
159174
CheckpointIO(mymesh, true).read(name);
@@ -203,45 +218,45 @@ void NameBasedIO::read (const std::string & name)
203218
#endif
204219
}
205220

206-
if (new_name.rfind(".mat") < new_name.size())
221+
if (basename.rfind(".mat") < basename.size())
207222
MatlabIO(mymesh).read(new_name);
208223

209-
else if (new_name.rfind(".ucd") < new_name.size())
224+
else if (basename.rfind(".ucd") < basename.size())
210225
UCDIO(mymesh).read (new_name);
211226

212-
else if ((new_name.rfind(".off") < new_name.size()) ||
213-
(new_name.rfind(".ogl") < new_name.size()) ||
214-
(new_name.rfind(".oogl") < new_name.size()))
227+
else if ((basename.rfind(".off") < basename.size()) ||
228+
(basename.rfind(".ogl") < basename.size()) ||
229+
(basename.rfind(".oogl") < basename.size()))
215230
OFFIO(mymesh).read (new_name);
216231

217-
else if (new_name.rfind(".unv") < new_name.size())
232+
else if (basename.rfind(".unv") < basename.size())
218233
UNVIO(mymesh).read (new_name);
219234

220-
else if ((new_name.rfind(".node") < new_name.size()) ||
221-
(new_name.rfind(".ele") < new_name.size()))
235+
else if ((basename.rfind(".node") < basename.size()) ||
236+
(basename.rfind(".ele") < basename.size()))
222237
TetGenIO(mymesh).read (new_name);
223238

224-
else if (new_name.rfind(".exd") < new_name.size() ||
225-
new_name.rfind(".e") < new_name.size())
239+
else if (basename.rfind(".exd") < basename.size() ||
240+
basename.rfind(".e") < basename.size())
226241
ExodusII_IO(mymesh).read (new_name);
227242

228-
else if (new_name.rfind(".msh") < new_name.size())
243+
else if (basename.rfind(".msh") < basename.size())
229244
GmshIO(mymesh).read (new_name);
230245

231-
else if (new_name.rfind(".gmv") < new_name.size())
246+
else if (basename.rfind(".gmv") < basename.size())
232247
GMVIO(mymesh).read (new_name);
233248

234-
else if (new_name.rfind(".vtu") < new_name.size())
249+
else if (basename.rfind(".vtu") < basename.size())
235250
VTKIO(mymesh).read(new_name);
236251

237-
else if (new_name.rfind(".inp") < new_name.size())
252+
else if (basename.rfind(".inp") < basename.size())
238253
AbaqusIO(mymesh).read(new_name);
239254

240-
else if ((new_name.rfind(".bext") < new_name.size()) ||
241-
(new_name.rfind(".bxt") < new_name.size()))
255+
else if ((basename.rfind(".bext") < basename.size()) ||
256+
(basename.rfind(".bxt") < basename.size()))
242257
DynaIO(mymesh).read (new_name);
243258

244-
else if (new_name.rfind(".bez") < new_name.size())
259+
else if (basename.rfind(".bez") < basename.size())
245260
DynaIO(mymesh, false).read (new_name);
246261

247262
else
@@ -294,25 +309,27 @@ void NameBasedIO::write (const std::string & name)
294309
{
295310
MeshBase & mymesh = MeshInput<MeshBase>::mesh();
296311

312+
const std::string_view basename = basename_of(name);
313+
297314
// parallel formats are special -- they may choose to write
298315
// separate files, let's not try to handle the zipping here.
299-
if (is_parallel_file_format(name))
316+
if (is_parallel_file_format(basename))
300317
{
301318
// no need to handle bz2 files here -- the Xdr class does that.
302-
if (name.rfind(".xda") < name.size())
319+
if (basename.rfind(".xda") < basename.size())
303320
XdrIO(mymesh).write(name);
304321

305-
else if (name.rfind(".xdr") < name.size())
322+
else if (basename.rfind(".xdr") < basename.size())
306323
XdrIO(mymesh,true).write(name);
307324

308-
else if (name.rfind(".nem") < name.size() ||
309-
name.rfind(".n") < name.size())
325+
else if (basename.rfind(".nem") < basename.size() ||
326+
basename.rfind(".n") < basename.size())
310327
Nemesis_IO(mymesh).write(name);
311328

312-
else if (name.rfind(".cpa") < name.size())
329+
else if (basename.rfind(".cpa") < basename.size())
313330
CheckpointIO(mymesh,false).write(name);
314331

315-
else if (name.rfind(".cpr") < name.size())
332+
else if (basename.rfind(".cpr") < basename.size())
316333
CheckpointIO(mymesh,true).write(name);
317334

318335
else
@@ -345,16 +362,16 @@ void NameBasedIO::write (const std::string & name)
345362
// New scope so that io will close before we try to zip the file
346363
{
347364
// Write the file based on extension
348-
if (new_name.rfind(".dat") < new_name.size())
365+
if (basename.rfind(".dat") < basename.size())
349366
TecplotIO(mymesh).write (new_name);
350367

351-
else if (new_name.rfind(".plt") < new_name.size())
368+
else if (basename.rfind(".plt") < basename.size())
352369
TecplotIO(mymesh,true).write (new_name);
353370

354-
else if (new_name.rfind(".ucd") < new_name.size())
371+
else if (basename.rfind(".ucd") < basename.size())
355372
UCDIO (mymesh).write (new_name);
356373

357-
else if (new_name.rfind(".gmv") < new_name.size())
374+
else if (basename.rfind(".gmv") < basename.size())
358375
if (mymesh.n_partitions() > 1)
359376
GMVIO(mymesh).write (new_name);
360377
else
@@ -364,26 +381,26 @@ void NameBasedIO::write (const std::string & name)
364381
io.write (new_name);
365382
}
366383

367-
else if (new_name.rfind(".exd") < new_name.size() ||
368-
new_name.rfind(".e") < new_name.size())
384+
else if (basename.rfind(".exd") < basename.size() ||
385+
basename.rfind(".e") < basename.size())
369386
ExodusII_IO(mymesh).write(new_name);
370387

371-
else if (new_name.rfind(".unv") < new_name.size())
388+
else if (basename.rfind(".unv") < basename.size())
372389
UNVIO(mymesh).write (new_name);
373390

374-
else if (new_name.rfind(".mesh") < new_name.size())
391+
else if (basename.rfind(".mesh") < basename.size())
375392
MEDITIO(mymesh).write (new_name);
376393

377-
else if (new_name.rfind(".poly") < new_name.size())
394+
else if (basename.rfind(".poly") < basename.size())
378395
TetGenIO(mymesh).write (new_name);
379396

380-
else if (new_name.rfind(".msh") < new_name.size())
397+
else if (basename.rfind(".msh") < basename.size())
381398
GmshIO(mymesh).write (new_name);
382399

383-
else if (new_name.rfind(".fro") < new_name.size())
400+
else if (basename.rfind(".fro") < basename.size())
384401
FroIO(mymesh).write (new_name);
385402

386-
else if (new_name.rfind(".vtu") < new_name.size())
403+
else if (basename.rfind(".vtu") < basename.size())
387404
VTKIO(mymesh).write (new_name);
388405

389406
else
@@ -519,14 +536,16 @@ void NameBasedIO::write_equation_systems (const std::string & filename,
519536
// writing complete restarts
520537
if (!system_names)
521538
{
522-
if (filename.rfind(".xda") < filename.size())
539+
const std::string_view basename = basename_of(filename);
540+
541+
if (basename.rfind(".xda") < basename.size())
523542
{
524543
es.write(filename,WRITE,
525544
EquationSystems::WRITE_DATA |
526545
EquationSystems::WRITE_ADDITIONAL_DATA);
527546
return;
528547
}
529-
else if (filename.rfind(".xdr") < filename.size())
548+
else if (basename.rfind(".xdr") < basename.size())
530549
{
531550
es.write(filename,ENCODE,
532551
EquationSystems::WRITE_DATA |

0 commit comments

Comments
 (0)