X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmisc%2Fsg_path.hxx;h=0684d5701927b5f7b0bb320218a1b6dd06280ec3;hb=e4e31be7d43569a92a5d9fa7e784381b66cbd95a;hp=4b92f033344d14aef68168d4dee52faa2e346908;hpb=0ff748987b4d26cf3f110729bd645d64cb2d3ca0;p=simgear.git diff --git a/simgear/misc/sg_path.hxx b/simgear/misc/sg_path.hxx index 4b92f033..0684d570 100644 --- a/simgear/misc/sg_path.hxx +++ b/simgear/misc/sg_path.hxx @@ -6,7 +6,7 @@ // Written by Curtis L. Olson, started April 1999. // -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org +// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public @@ -18,10 +18,9 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // -// You should have received a copy of the GNU Library General Public -// License along with this library; if not, write to the -// Free Software Foundation, Inc., 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -29,23 +28,17 @@ #ifndef _SG_PATH_HXX #define _SG_PATH_HXX +#include #include +#include -#include STL_STRING +#include -SG_USING_STD(string); - - -#ifdef macintosh -# define SG_PATH_SEP ':' -# define SG_BAD_PATH_SEP '/' -#else -# define SG_PATH_SEP '/' -# define SG_BAD_PATH_SEP ':' +#ifdef _MSC_VER + typedef int mode_t; #endif - /** * A class to hide path separator difference across platforms and assist * in managing file system path names. @@ -58,18 +51,30 @@ class SGPath { private: - string path; + std::string path; public: /** Default constructor */ SGPath(); + /** Copy contructor */ + SGPath(const SGPath& p); + + SGPath& operator=(const SGPath& p); + /** * Construct a path based on the starting path provided. * @param p initial path */ - SGPath( const string& p ); + SGPath( const std::string& p ); + + /** + * Construct a path based on the starting path provided and a relative subpath + * @param p initial path + * @param r relative subpath + */ + SGPath( const SGPath& p, const std::string& r ); /** Destructor */ ~SGPath(); @@ -78,37 +83,68 @@ public: * Set path to a new value * @param p new path */ - void set( const string& p ); + void set( const std::string& p ); SGPath& operator= ( const char* p ) { this->set(p); return *this; } /** * Append another piece to the existing path. Inserts a path * separator between the existing component and the new component. * @param p additional path component */ - void append( const string& p ); + void append( const std::string& p ); + + /** + * Append a new piece to the existing path. Inserts a search path + * separator to the existing path and the new patch component. + * @param p additional path component */ + void add( const std::string& p ); /** * Concatenate a string to the end of the path without inserting a * path separator. - * @param p addtional path suffix + * @param p additional path suffix */ - void concat( const string& p ); + void concat( const std::string& p ); + /** + * Get the file part of the path (everything after the last path sep) + * @return file string + */ + std::string file() const; + /** * Get the directory part of the path. * @return directory string */ - string dir(); + std::string dir() const; - /** Get the path string + /** + * Get the base part of the path (everything but the extension.) + * @return the base string + */ + std::string base() const; + + /** + * Get the extension part of the path (everything after the final ".") + * @return the extension string + */ + std::string extension() const; + + /** + * Get the path string * @return path string */ - string str() const { return path; } + std::string str() const { return path; } - /** Get the path string + /** + * Get the path string * @return path in "C" string (ptr to char array) form. */ - const char* c_str() { return path.c_str(); } + const char* c_str() const { return path.c_str(); } + + /** + * Get the path string in OS native form + */ + std::string str_native() const; /** * Determine if file exists by attempting to fopen it. @@ -116,13 +152,54 @@ public: */ bool exists() const; + /** + * Create the designated directory. + * @return 0 on success, or <0 on failure. + */ + int create_dir(mode_t mode); + + bool isFile() const; + bool isDir() const; + + /** + * Opposite sense to isAbsolute + */ + bool isRelative() const { return !isAbsolute(); } + + /** + * Is this an absolute path? + * I.e starts with a directory seperator, or a single character + colon + */ + bool isAbsolute() const; + + /** + * check for default constructed path + */ + bool isNull() const; private: void fix(); + void validate() const; + + mutable bool _cached; + mutable bool _exists; + mutable bool _isDir; + mutable bool _isFile; }; +/** + * Split a directory string into a list of it's parent directories. + */ +string_list sgPathBranchSplit( const std::string &path ); + +/** + * Split a directory search path into a vector of individual paths + */ +string_list sgPathSplit( const std::string &search_path ); + + #endif // _SG_PATH_HXX