diff -uNr SimGear.orig/simgear/misc/sg_path.cxx SimGear/simgear/misc/sg_path.cxx
--- SimGear.orig/simgear/misc/sg_path.cxx 2010-01-23 12:40:37.000000000 +0100
+++ SimGear/simgear/misc/sg_path.cxx 2010-01-31 18:40:57.477501771 +0100
@@ -27,50 +27,12 @@
#include <simgear_config.h>
#include <simgear/debug/logstream.hxx>
#include <stdio.h>
-#include <sys/stat.h>
-#include <sys/stat.h>
#ifdef _WIN32
# include <direct.h>
#endif
#include "sg_path.hxx"
-/**
- * define directory path separators
- */
-
-static const char sgDirPathSep = '/';
-static const char sgDirPathSepBad = '\\';
-
-#ifdef _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
-
-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 ( path[i] == sgDirPathSepBad ) {
- path[i] = sgDirPathSep;
- }
- }
-}
-
-
// default constructor
SGPath::SGPath()
: path("")
@@ -78,19 +40,6 @@
}
-// create a path based on "path"
-SGPath::SGPath( const std::string& p )
- : path(p)
-{
- fix();
-}
-
-
-// destructor
-SGPath::~SGPath() {
-}
-
-
// set path
void SGPath::set( const string& p ) {
path = p;
@@ -98,37 +47,11 @@
}
-// append another piece to the existing path
-void SGPath::append( const string& p ) {
- if ( path.size() == 0 ) {
- path = p;
- } else {
- if ( p[0] != sgDirPathSep ) {
- path += sgDirPathSep;
- }
- path += p;
- }
- fix();
-}
-
//add a new path component to the existing path string
void SGPath::add( const string& p ) {
append( sgSearchPathSep+p );
}
-
-// concatenate a string to the end of the path without inserting a
-// path separator
-void SGPath::concat( const string& p ) {
- if ( path.size() == 0 ) {
- path = p;
- } else {
- 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);
@@ -139,17 +62,6 @@
}
}
-
-// get the directory part of the path.
-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(".");
@@ -180,91 +92,3 @@
fclose(fp);
return true;
}
-
-#ifdef _WIN32
-# define sgMkDir(d,m) _mkdir(d)
-#else
-# define sgMkDir(d,m) mkdir(d,m)
-#endif
-
-
-int SGPath::create_dir( mode_t mode ) {
- string_list dirlist = sgPathSplit(dir());
- if ( dirlist.empty() )
- return -1;
- string path = dirlist[0];
- string_list path_elements = sgPathBranchSplit(path);
- bool absolute = !path.empty() && path[0] == sgDirPathSep;
-
- unsigned int i = 1;
- SGPath dir = absolute ? string( 1, sgDirPathSep ) : "";
- dir.concat( path_elements[0] );
-#ifdef _WIN32
- if ( dir.str().find(':') != string::npos && path_elements.size() >= 2 ) {
- dir.append( path_elements[1] );
- i = 2;
- }
-#endif
- struct stat info;
- int r;
- for(; ( r = stat( dir.c_str(), &info ) ) == 0 && i < path_elements.size(); i++) {
- dir.append(path_elements[i]);
- }
- if ( r == 0 ) {
- return 0; // Directory already exists
- }
- if ( sgMkDir( dir.c_str(), mode) ) {
- SG_LOG( SG_IO, SG_ALERT, "Error creating directory: " + dir.str() );
- return -2;
- }
- for(; i < path_elements.size(); i++) {
- dir.append(path_elements[i]);
- if ( sgMkDir( dir.c_str(), mode) ) {
- SG_LOG( SG_IO, SG_ALERT, "Error creating directory: " + dir.str() );
- return -2;
- }
- }
-
- return 0;
-}
-
-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;
- 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 {
- if ( !tmp.empty() )
- result.push_back( tmp );
- done = true;
- }
- }
-
- return result;
-}
diff -uNr SimGear.orig/simgear/misc/sg_path.hxx SimGear/simgear/misc/sg_path.hxx
--- SimGear.orig/simgear/misc/sg_path.hxx 2008-07-28 09:52:14.000000000 +0200
+++ SimGear/simgear/misc/sg_path.hxx 2010-01-31 18:41:03.790503865 +0100
@@ -29,6 +29,8 @@
#define _SG_PATH_HXX
#include <sys/types.h>
+#include <sys/stat.h>
+#include <simgear/debug/logstream.hxx>
#include <simgear/compiler.h>
#include <string>
@@ -42,6 +44,65 @@
#endif
/**
+ * define directory path separators
+ */
+
+static const char sgDirPathSep = '/';
+static const char sgDirPathSepBad = '\\';
+
+#ifdef _WIN32
+static const char sgSearchPathSep = ';';
+#else
+static const char sgSearchPathSep = ':';
+#endif
+
+/**
+ * Split a directory string into a list of it's parent directories.
+ */
+static inline 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;
+}
+
+/**
+ * Split a directory search path into a vector of individual paths
+ */
+static inline 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 {
+ if ( !tmp.empty() )
+ result.push_back( tmp );
+ done = true;
+ }
+ }
+
+ return result;
+}
+
+/**
* A class to hide path separator difference across platforms and assist
* in managing file system path names.
*
@@ -64,10 +125,13 @@
* Construct a path based on the starting path provided.
* @param p initial path
*/
- SGPath( const string& p );
+ SGPath( const string& p ) : path(p)
+ {
+ fix();
+ }
/** Destructor */
- ~SGPath();
+ ~SGPath() {}
/**
* Set path to a new value
@@ -80,7 +144,17 @@
* 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 string& p ) {
+ if ( path.size() == 0 ) {
+ path = p;
+ } else {
+ if ( p[0] != sgDirPathSep ) {
+ path += sgDirPathSep;
+ }
+ path += p;
+ }
+ fix();
+ }
/**
* Append a new piece to the existing path. Inserts a search path
@@ -93,7 +167,14 @@
* path separator.
* @param p additional path suffix
*/
- void concat( const string& p );
+ void concat( const string& p ) {
+ if ( path.size() == 0 ) {
+ path = p;
+ } else {
+ path += p;
+ }
+ fix();
+ }
/**
* Get the file part of the path (everything after the last path sep)
@@ -105,7 +186,14 @@
* Get the directory part of the path.
* @return directory string
*/
- string dir() const;
+ string 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.)
@@ -141,26 +229,76 @@
* Create the designated directory.
* @return 0 on success, or <0 on failure.
*/
- int create_dir(mode_t mode);
+ int create_dir(mode_t mode) {
+ string_list dirlist = sgPathSplit(dir());
+ if ( dirlist.empty() )
+ return -1;
+ string path = dirlist[0];
+ string_list path_elements = sgPathBranchSplit(path);
+ bool absolute = !path.empty() && path[0] == sgDirPathSep;
+
+ unsigned int i = 1;
+ SGPath dir = absolute ? string( 1, sgDirPathSep ) : "";
+ dir.concat( path_elements[0] );
+#ifdef _WIN32
+ if ( dir.str().find(':') != string::npos && path_elements.size() >= 2 ) {
+ dir.append( path_elements[1] );
+ i = 2;
+ }
+#endif
+ struct stat info;
+ int r;
+ for(; ( r = stat( dir.c_str(), &info ) ) == 0 && i < path_elements.size(); i++) {
+ dir.append(path_elements[i]);
+ }
+ if ( r == 0 ) {
+ return 0; // Directory already exists
+ }
+#ifdef _WIN32
+# define sgMkDir(d,m) _mkdir(d)
+#else
+# define sgMkDir(d,m) mkdir(d,m)
+#endif
+ if ( sgMkDir( dir.c_str(), mode) ) {
+ SG_LOG( SG_IO, SG_ALERT, "Error creating directory: " + dir.str() );
+ return -2;
+ }
+ for(; i < path_elements.size(); i++) {
+ dir.append(path_elements[i]);
+ if ( sgMkDir( dir.c_str(), mode) ) {
+ SG_LOG( SG_IO, SG_ALERT, "Error creating directory: " + dir.str() );
+ return -2;
+ }
+ }
+
+ return 0;
+ }
private:
- void fix();
+ // 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
+
+ void 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 ( path[i] == sgDirPathSepBad ) {
+ path[i] = sgDirPathSep;
+ }
+ }
+ }
};
-/**
- * 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
- */
-string_list sgPathSplit( const string &search_path );
-
-
#endif // _SG_PATH_HXX