You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.6 KiB
104 lines
2.6 KiB
#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 << setfill('0') << setw(8) << number::random32();
|
|
buf << suffix;
|
|
|
|
name = buf.str();
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
}}} // namespace mp4v2::platform::io
|