blob: 22dff874158651ec7af9d4fc46b94acc3a52cb39 [file] [log] [blame]
#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