@@ -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+
6073namespace 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