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.
This commit is contained in:
ehofman 2005-12-19 10:22:27 +00:00
parent bedbe3caad
commit 9289cfdde9
2 changed files with 34 additions and 19 deletions

View File

@ -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;

View File

@ -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
*/