| #include "libplatform/impl.h" |
| |
| namespace mp4v2 { namespace platform { namespace io { |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| void |
| FileSystem::pathnameCleanup( string& name ) |
| { |
| string bad; |
| |
| // fold repeating directory separators |
| bad = DIR_SEPARATOR; |
| bad += DIR_SEPARATOR; |
| for( string::size_type pos = name.find( bad ); |
| pos != string::npos; |
| pos = name.find( bad, pos ) ) |
| { |
| name.replace( pos, bad.length(), DIR_SEPARATOR ); |
| } |
| |
| // replace occurances of /./ with / |
| bad = DIR_SEPARATOR; |
| bad += '.'; |
| bad += DIR_SEPARATOR; |
| for( string::size_type pos = name.find( bad ); |
| pos != string::npos; |
| pos = name.find( bad, pos ) ) |
| { |
| name.replace( pos, bad.length(), DIR_SEPARATOR ); |
| } |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| void |
| FileSystem::pathnameOnlyExtension( string& name ) |
| { |
| // compute basename |
| string::size_type dot_pos = name.rfind( '.' ); |
| string::size_type slash_pos = name.rfind( DIR_SEPARATOR ); |
| |
| // dot_pos must be after slash_pos |
| if( slash_pos != string::npos && dot_pos < slash_pos ) |
| dot_pos = string::npos; |
| |
| // return empty-string if no dot |
| if( dot_pos == string::npos ) { |
| name.resize( 0 ); |
| return; |
| } |
| |
| name = name.substr( dot_pos + 1 ); |
| pathnameCleanup( name ); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| void |
| FileSystem::pathnameStripExtension( string& name ) |
| { |
| pathnameCleanup( name ); |
| |
| // compute basename |
| string::size_type dot_pos = name.rfind( '.' ); |
| string::size_type slash_pos = name.rfind( DIR_SEPARATOR ); |
| |
| // dot_pos must be after slash_pos |
| if( slash_pos != string::npos && dot_pos < slash_pos ) |
| dot_pos = string::npos; |
| |
| // chop extension |
| if( dot_pos != string::npos ) |
| name.resize( dot_pos ); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| void |
| FileSystem::pathnameTemp( string& name, string dir, string prefix, string suffix ) |
| { |
| ostringstream buf; |
| |
| if( !dir.empty() ) { |
| buf << dir; |
| |
| // add dir separator if needed |
| // TODO there's a platform specific bug here, if someone passes in a pathname ending |
| // in '\', which would be legitimate on Windows. |
| if( dir[dir.length()-1] != '/' ) |
| buf << '/'; |
| } |
| |
| buf << prefix; |
| buf << std::setfill('0') << std::setw(8) << number::random32(); |
| buf << suffix; |
| |
| name = buf.str(); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| }}} // namespace mp4v2::platform::io |