changeset 22029:6e618b8277ad

Strip extra file separators with make_absolute_filename (bug #48351). * oct-env.cc (do_make_absolute): Eliminate unnecessary call to do_getcwd. Don't copy duplicate directory separators over to result string. Strip a trailing directory separator from final result string.
author Rik <rik@octave.org>
date Sat, 02 Jul 2016 15:01:25 -0700
parents 5c949eecb6dd
children 3a4742ebaf63
files liboctave/system/oct-env.cc
diffstat 1 files changed, 13 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/system/oct-env.cc	Sat Jul 02 10:19:44 2016 -0400
+++ b/liboctave/system/oct-env.cc	Sat Jul 02 15:01:25 2016 -0700
@@ -388,9 +388,6 @@
 
       std::string current_dir = dot_path;
 
-      if (current_dir.empty ())
-        current_dir = do_getcwd ();
-
       size_t pos = current_dir.length () - 1;
 
       if (! octave::sys::file_ops::is_dir_sep (current_dir[pos]))
@@ -415,10 +412,10 @@
                 }
 
               if (s[i+1] == '.'
-                  && (i + 2 == slen || octave::sys::file_ops::is_dir_sep (s[i+2])))
+                  && (i + 2 == slen
+                      || octave::sys::file_ops::is_dir_sep (s[i+2])))
                 {
                   i += 2;
-
                   if (i != slen)
                     i++;
 
@@ -428,13 +425,19 @@
                 }
             }
 
-          size_t tmp = s.find_first_of (octave::sys::file_ops::dir_sep_chars (), i);
+          size_t tmp;
+          tmp = s.find_first_of (octave::sys::file_ops::dir_sep_chars (), i);
 
           if (tmp == std::string::npos)
             {
               current_dir.append (s, i, tmp-i);
               break;
             }
+          else if (tmp == i)
+            {
+              /* Two separators in a row, skip adding 2nd separator */
+              i++;
+            }
           else
             {
               current_dir.append (s, i, tmp-i+1);
@@ -442,6 +445,10 @@
             }
         }
 
+      // Strip any trailing directory separator
+      if (octave::sys::file_ops::is_dir_sep (current_dir.back ()))
+        current_dir.pop_back ();
+      
       return current_dir;
     }