From 9289cfdde99971b76f1ec71d3a9f5a0c9a9afc3b Mon Sep 17 00:00:00 2001 From: ehofman Date: Mon, 19 Dec 2005 10:22:27 +0000 Subject: [PATCH] Frederic Bouvier: Fix a problem where the directory being created is made relative when in fact it's absolute. It also tightens things a bit on the Windows side. Erik: Make the section that splits up the directory in a lists of parent directories a standalone function. --- simgear/misc/sg_path.cxx | 42 ++++++++++++++++++++++++---------------- simgear/misc/sg_path.hxx | 11 +++++++++-- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/simgear/misc/sg_path.cxx b/simgear/misc/sg_path.cxx index a72175ab..cee7df45 100644 --- a/simgear/misc/sg_path.cxx +++ b/simgear/misc/sg_path.cxx @@ -197,25 +197,14 @@ bool SGPath::exists() const { void SGPath::create_dir( mode_t mode ) { string_list dirlist = sgPathSplit(dir()); string path = dirlist[0]; - string_list path_elements; - string element; - while ( path.size() ) { - size_t p = path.find( sgDirPathSep ); - if ( p != string::npos ) { - element = path.substr( 0, p ); - path.erase( 0, p + 1 ); - } else { - element = path; - path = ""; - } - if ( element.size() ) - path_elements.push_back( element ); - } + string_list path_elements = sgPathBranchSplit(path); + bool absolute = !path.empty() && path[0] == sgDirPathSep; int i = 1; - SGPath dir = path_elements[0]; -#ifdef WIN32 - if ( path_elements.size() >= 2 ) { + SGPath dir = absolute ? string( 1, sgDirPathSep ) : ""; + dir.concat( path_elements[0] ); +#ifdef _MSC_VER + if ( dir.str().find(':') != string::npos && path_elements.size() >= 2 ) { dir.append( path_elements[1] ); i = 2; } @@ -241,6 +230,25 @@ void SGPath::create_dir( mode_t mode ) { } } +string_list sgPathBranchSplit( const string &dirpath ) { + string_list path_elements; + string element, path = dirpath; + while ( path.size() ) { + size_t p = path.find( sgDirPathSep ); + if ( p != string::npos ) { + element = path.substr( 0, p ); + path.erase( 0, p + 1 ); + } else { + element = path; + path = ""; + } + if ( element.size() ) + path_elements.push_back( element ); + } + return path_elements; +} + + string_list sgPathSplit( const string &search_path ) { string tmp = search_path; string_list result; diff --git a/simgear/misc/sg_path.hxx b/simgear/misc/sg_path.hxx index f843061b..363884d4 100644 --- a/simgear/misc/sg_path.hxx +++ b/simgear/misc/sg_path.hxx @@ -120,12 +120,14 @@ public: */ string extension() const; - /** Get the path string + /** + * Get the path string * @return path string */ 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(); } @@ -148,6 +150,11 @@ private: }; +/** + * Split a directory string into a list of it's parent directories. + */ +string_list sgPathBranchSplit( const string &path ); + /** * Split a directory search path into a vector of individual paths */