#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
