]> git.mxchange.org Git - simgear.git/blobdiff - simgear/misc/sg_path.cxx
Move vector property templates to separate header file.
[simgear.git] / simgear / misc / sg_path.cxx
index 2a98b34ec4b88aa75262f9c860b8b803c159a8b3..d51c93afdf74c791746a33883a878db061a1c2a4 100644 (file)
@@ -53,22 +53,20 @@ static const char sgSearchPathSep = ':';
 #endif
 
 
-// If Unix, replace all ":" with "/".  In windoze, allow the
-// second character to be a ":" for things like c:\foo\bar
-
+// For windows, replace "\" by "/".
 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;
+    string::size_type sz = path.size();
+    for ( string::size_type i = 0; i < sz; ++i ) {
+        if ( path[i] == sgDirPathSepBad ) {
+            path[i] = sgDirPathSep;
+        }
     }
+    // drop trailing "/"
+    while ((sz>1)&&(path[sz-1]==sgDirPathSep))
+    {
+        path.resize(--sz);
     }
 }
 
@@ -111,7 +109,7 @@ SGPath::SGPath(const SGPath& p) :
   _modTime(p._modTime)
 {
 }
-    
+
 SGPath& SGPath::operator=(const SGPath& p)
 {
   path = p.path;
@@ -144,12 +142,12 @@ void SGPath::set_cached(bool cached)
 // append another piece to the existing path
 void SGPath::append( const string& p ) {
     if ( path.size() == 0 ) {
-    path = p;
+        path = p;
     } else {
     if ( p[0] != sgDirPathSep ) {
         path += sgDirPathSep;
     }
-    path += p;
+        path += p;
     }
     fix();
     _cached = false;
@@ -165,9 +163,9 @@ void SGPath::add( const string& p ) {
 // path separator
 void SGPath::concat( const string& p ) {
     if ( path.size() == 0 ) {
-    path = p;
+        path = p;
     } else {
-    path += p;
+        path += p;
     }
     fix();
     _cached = false;
@@ -175,12 +173,13 @@ void SGPath::concat( const string& p ) {
 
 
 // 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);
+string SGPath::file() const
+{
+    string::size_type index = path.rfind(sgDirPathSep);
+    if (index != string::npos) {
+        return path.substr(index + 1);
     } else {
-    return "";
+        return path;
     }
 }
   
@@ -206,7 +205,7 @@ string SGPath::base() const
         return path;
     }
     
-    if (index >= 0) {
+    if (index != string::npos) {
         return path.substr(0, index);
     } else {
         return path;
@@ -256,7 +255,7 @@ string SGPath::complete_lower_extension() const
     }
     
     string::size_type firstDot = path.find(".", index);
-    if ((firstDot >= 0)  && (path.find(sgDirPathSep, firstDot) == string::npos)) {
+    if ((firstDot != string::npos)  && (path.find(sgDirPathSep, firstDot) == string::npos)) {
         return boost::to_lower_copy(path.substr(firstDot + 1));
     } else {
         return "";
@@ -484,3 +483,21 @@ bool SGPath::rename(const SGPath& newName)
     return true;
 }
 
+std::string SGPath::realpath() const
+{
+#ifdef _WIN32
+    // Not implemented for Windows yet. Return original path instead.
+    return path;
+#else
+    char* buf = ::realpath(path.c_str(), NULL);
+    if (!buf)
+    {
+        SG_LOG(SG_IO, SG_ALERT, "ERROR: The path '" << path << "' does not exist in the file system.");
+        return path;
+    }
+    std::string p(buf);
+    free(buf);
+    return p;
+#endif
+}
+