X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmisc%2Fsg_path.cxx;h=542eb8f60fa13fba5cda1c0b2faf7b96fac5b680;hb=0bf579cf27afcab6c718cb0227ceb8b6af76d9fa;hp=72c2d7457280d13113a5e0a23dad1a779116b64f;hpb=b8ce139b8a6cb3e49432e7fbee1afafd06975dcc;p=simgear.git diff --git a/simgear/misc/sg_path.cxx b/simgear/misc/sg_path.cxx index 72c2d745..542eb8f6 100644 --- a/simgear/misc/sg_path.cxx +++ b/simgear/misc/sg_path.cxx @@ -23,42 +23,67 @@ // $Id$ +#include + +#include +#include + #include "sg_path.hxx" +/** + * define directory path separators + */ + +#if defined( macintosh ) +static const char sgDirPathSep = ':'; +static const char sgDirPathSepBad = '/'; +#else +static const char sgDirPathSep = '/'; +static const char sgDirPathSepBad = ':'; +#endif + +#if defined( WIN32 ) +static const char sgSearchPathSep = ';'; +#else +static const char sgSearchPathSep = ':'; +#endif + + // If Unix, replace all ":" with "/". If MacOS, replace all "/" with // ":" it should go without saying that neither of these characters // should be used in file or directory names. In windoze, allow the // second character to be a ":" for things like c:\foo\bar -static string fix_path( const string path ) { - string result = path; - - for ( int i = 0; i < (int)path.size(); ++i ) { +void +SGPath::fix() +{ + for ( string::size_type i = 0; i < path.size(); ++i ) { #if defined( WIN32 ) // for windoze, don't replace the ":" for the second character if ( i == 1 ) { continue; } #endif - if ( result[i] == SG_BAD_PATH_SEP ) { - result[i] = SG_PATH_SEP; + if ( path[i] == sgDirPathSepBad ) { + path[i] = sgDirPathSep; } } - - return result; } // default constructor -SGPath::SGPath() { - path = ""; +SGPath::SGPath() + : path("") +{ } // create a path based on "path" -SGPath::SGPath( const string p ) { - set( p ); +SGPath::SGPath( const std::string& p ) + : path(p) +{ + fix(); } @@ -68,45 +93,106 @@ SGPath::~SGPath() { // set path -void SGPath::set( const string p ) { - path = fix_path( p ); +void SGPath::set( const string& p ) { + path = p; + fix(); } // append another piece to the existing path -void SGPath::append( const string p ) { - string part = fix_path( p ); - +void SGPath::append( const string& p ) { if ( path.size() == 0 ) { - path = part; + path = p; } else { - if ( part[0] != SG_PATH_SEP ) { - path += SG_PATH_SEP; + if ( p[0] != sgDirPathSep ) { + path += sgDirPathSep; } - path += part; + path += p; } + fix(); } // concatenate a string to the end of the path without inserting a // path separator -void SGPath::concat( const string p ) { - string part = fix_path( p ); - +void SGPath::concat( const string& p ) { if ( path.size() == 0 ) { - path = part; + path = p; } else { - path += part; + path += p; } + fix(); } +// Get the file part of the path (everything after the last path sep) +string SGPath::file() const { + int index = path.rfind(sgDirPathSep); + if (index >= 0) { + return path.substr(index + 1); + } else { + return ""; + } +} + + // get the directory part of the path. -string SGPath::dir() { - int index = path.rfind(SG_PATH_SEP); +string SGPath::dir() const { + int index = path.rfind(sgDirPathSep); + if (index >= 0) { + return path.substr(0, index); + } else { + return ""; + } +} + +// get the base part of the path (everything but the extension.) +string SGPath::base() const { + int index = path.rfind("."); if (index >= 0) { return path.substr(0, index); } else { return ""; } } + +// get the extention (everything after the final ".") +string SGPath::extension() const { + int index = path.rfind("."); + if (index >= 0) { + return path.substr(index + 1); + } else { + return ""; + } +} + +bool SGPath::exists() const { + FILE* fp = fopen( path.c_str(), "r"); + if (fp == 0) { + return false; + } + fclose(fp); + return true; +} + + +string_list sgPathSplit( const string &search_path ) { + string tmp = search_path; + string_list result; + result.clear(); + + bool done = false; + + while ( !done ) { + int index = tmp.find(sgSearchPathSep); + if (index >= 0) { + result.push_back( tmp.substr(0, index) ); + tmp = tmp.substr( index + 1 ); + } else { + result.push_back( tmp ); + done = true; + } + } + + return result; +}