]> git.mxchange.org Git - simgear.git/blobdiff - simgear/misc/sg_path.cxx
Use of copy-constructors
[simgear.git] / simgear / misc / sg_path.cxx
index 53504a2013adc84a6b2a977092d46ad88c38ead2..92a16945db57bd94b6d8bdefdebc8df3e2a2ca27 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);
     }
 }
 
@@ -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;
     }
 }
   
@@ -189,40 +188,40 @@ string SGPath::file() const {
 string SGPath::dir() const {
     int index = path.rfind(sgDirPathSep);
     if (index >= 0) {
-    return path.substr(0, index);
+        return path.substr(0, index);
     } else {
-    return "";
+        return "";
     }
 }
 
 // get the base part of the path (everything but the extension.)
-string SGPath::base() const {
-    unsigned int index = path.rfind(sgDirPathSep);
-    if (index == string::npos) {
-        index = 0; // no separator in the name
-    } else {
-        ++index; // skip past the separator
-    }
-
-// find the first dot after the final separator
-    unsigned int firstDot = path.find(".", index);
-    if (firstDot == string::npos) {
-        return path; // no extension, return whole path
+string SGPath::base() const
+{
+    string::size_type index = path.rfind(".");
+    string::size_type lastSep = path.rfind(sgDirPathSep);
+    
+// tolerate dots inside directory names
+    if ((lastSep != string::npos) && (index < lastSep)) {
+        return path;
     }
     
-    return path.substr(0, firstDot);
+    if (index != string::npos) {
+        return path.substr(0, index);
+    } else {
+        return path;
+    }
 }
 
 string SGPath::file_base() const
 {
-    unsigned int index = path.rfind(sgDirPathSep);
+    string::size_type index = path.rfind(sgDirPathSep);
     if (index == string::npos) {
         index = 0; // no separator in the name
     } else {
         ++index; // skip past the separator
     }
     
-    unsigned int firstDot = path.find(".", index);
+    string::size_type firstDot = path.find(".", index);
     if (firstDot == string::npos) {
         return path.substr(index); // no extensions
     }
@@ -248,15 +247,15 @@ string SGPath::lower_extension() const {
 
 string SGPath::complete_lower_extension() const
 {
-    unsigned int index = path.rfind(sgDirPathSep);
+    string::size_type index = path.rfind(sgDirPathSep);
     if (index == string::npos) {
         index = 0; // no separator in the name
     } else {
         ++index; // skip past the separator
     }
     
-    int firstDot = path.find(".", index);
-    if ((firstDot >= 0)  && (path.find(sgDirPathSep, firstDot) == string::npos)) {
+    string::size_type firstDot = path.find(".", index);
+    if ((firstDot != string::npos)  && (path.find(sgDirPathSep, firstDot) == string::npos)) {
         return boost::to_lower_copy(path.substr(firstDot + 1));
     } else {
         return "";
@@ -471,3 +470,16 @@ bool SGPath::operator!=(const SGPath& other) const
     return (path != other.path);
 }
 
+bool SGPath::rename(const SGPath& newName)
+{
+    if (::rename(c_str(), newName.c_str()) != 0) {
+        SG_LOG(SG_IO, SG_WARN, "renamed failed: from " << str() << " to " << newName.str()
+            << " reason: " << strerror(errno));
+        return false;
+    }
+    
+    path = newName.path;
+    _cached = false;
+    return true;
+}
+