diff liboctave/system/oct-env.cc @ 21732:6a1eded90355

use namespace for system env class * oct-env.h, oct-env.cc: Put env class in octave::sys namespace. Change all uses.
author John W. Eaton <jwe@octave.org>
date Wed, 18 May 2016 14:58:29 -0400
parents 815b2f500fab
children cb0fdd941d84
line wrap: on
line diff
--- a/liboctave/system/oct-env.cc	Wed May 18 14:09:17 2016 -0400
+++ b/liboctave/system/oct-env.cc	Wed May 18 14:58:29 2016 -0400
@@ -26,13 +26,13 @@
 from GNU Bash, the Bourne Again SHell, copyright (C) 1987, 1989, 1991
 Free Software Foundation, Inc.
 
-  octave_env::do_absolute_pathname
-  octave_env::do_base_pathname
-  octave_env::do_chdir
-  octave_env::do_getcwd
-  octave_env::do_make_absolute
-  octave_env::do_polite_directory_format
-  octave_env::pathname_backup
+  octave::sys::env::do_absolute_pathname
+  octave::sys:env::do_base_pathname
+  octave::sys:env::do_chdir
+  octave::sys:env::do_getcwd
+  octave::sys:env::do_make_absolute
+  octave::sys:env::do_polite_directory_format
+  octave::sys:env::pathname_backup
 
 */
 
@@ -60,543 +60,551 @@
 #include "oct-syscalls.h"
 #include "singleton-cleanup.h"
 
-octave_env::octave_env (void)
-  : follow_symbolic_links (true), verbatim_pwd (true),
-    current_directory (), prog_name (), prog_invocation_name (),
-    user_name (), host_name ()
+namespace
+octave
 {
-  // Get a real value for the current directory.
-  do_getcwd ();
+  namespace
+  sys
+  {
+    env::env (void)
+      : follow_symbolic_links (true), verbatim_pwd (true),
+        current_directory (), prog_name (), prog_invocation_name (),
+        user_name (), host_name ()
+    {
+      // Get a real value for the current directory.
+      do_getcwd ();
+
+      // Etc.
+      do_get_user_name ();
 
-  // Etc.
-  do_get_user_name ();
+      do_get_host_name ();
+    }
+
+    env *env::instance = 0;
 
-  do_get_host_name ();
-}
+    bool
+    env::instance_ok (void)
+    {
+      bool retval = true;
+
+      if (! instance)
+        {
+          instance = new env ();
 
-octave_env *octave_env::instance = 0;
+          if (instance)
+            singleton_cleanup_list::add (cleanup_instance);
+        }
 
-bool
-octave_env::instance_ok (void)
-{
-  bool retval = true;
+      if (! instance)
+        (*current_liboctave_error_handler)
+          ("unable to create current working directory object!");
+
+      return retval;
+    }
 
-  if (! instance)
+    std::string
+    env::polite_directory_format (const std::string& name)
+    {
+      return (instance_ok ())
+        ? instance->do_polite_directory_format (name) : "";
+    }
+
+    bool
+    env::absolute_pathname (const std::string& s)
     {
-      instance = new octave_env ();
+      return (instance_ok ())
+        ? instance->do_absolute_pathname (s) : false;
+    }
 
-      if (instance)
-        singleton_cleanup_list::add (cleanup_instance);
+    bool
+    env::rooted_relative_pathname (const std::string& s)
+    {
+      return (instance_ok ())
+        ? instance->do_rooted_relative_pathname (s) : false;
     }
 
-  if (! instance)
-    (*current_liboctave_error_handler)
-      ("unable to create current working directory object!");
-
-  return retval;
-}
+    std::string
+    env::base_pathname (const std::string& s)
+    {
+      return (instance_ok ())
+        ? instance->do_base_pathname (s) : "";
+    }
 
-std::string
-octave_env::polite_directory_format (const std::string& name)
-{
-  return (instance_ok ())
-         ? instance->do_polite_directory_format (name) : "";
-}
-
-bool
-octave_env::absolute_pathname (const std::string& s)
-{
-  return (instance_ok ())
-         ? instance->do_absolute_pathname (s) : false;
-}
+    std::string
+    env::make_absolute (const std::string& s, const std::string& dot_path)
+    {
+      return (instance_ok ())
+        ? instance->do_make_absolute (s, dot_path) : "";
+    }
 
-bool
-octave_env::rooted_relative_pathname (const std::string& s)
-{
-  return (instance_ok ())
-         ? instance->do_rooted_relative_pathname (s) : false;
-}
-
-std::string
-octave_env::base_pathname (const std::string& s)
-{
-  return (instance_ok ())
-         ? instance->do_base_pathname (s) : "";
-}
+    std::string
+    env::get_current_directory ()
+    {
+      return (instance_ok ())
+        ? instance->do_getcwd () : "";
+    }
 
-std::string
-octave_env::make_absolute (const std::string& s, const std::string& dot_path)
-{
-  return (instance_ok ())
-         ? instance->do_make_absolute (s, dot_path) : "";
-}
+    std::string
+    env::get_home_directory ()
+    {
+      return (instance_ok ())
+        ? instance->do_get_home_directory () : "";
+    }
 
-std::string
-octave_env::get_current_directory ()
-{
-  return (instance_ok ())
-         ? instance->do_getcwd () : "";
-}
+    std::string
+    env::get_temp_directory ()
+    {
+      return (instance_ok ())
+        ? instance->do_get_temp_directory () : "";
+    }
 
-std::string
-octave_env::get_home_directory ()
-{
-  return (instance_ok ())
-         ? instance->do_get_home_directory () : "";
-}
+    std::string
+    env::get_program_name (void)
+    {
+      return (instance_ok ())
+        ? instance->prog_name : "";
+    }
 
-std::string
-octave_env::get_temp_directory ()
-{
-  return (instance_ok ())
-         ? instance->do_get_temp_directory () : "";
-}
-
-std::string
-octave_env::get_program_name (void)
-{
-  return (instance_ok ())
-         ? instance->prog_name : "";
-}
+    std::string
+    env::get_program_invocation_name (void)
+    {
+      return (instance_ok ())
+        ? instance->prog_invocation_name : "";
+    }
 
-std::string
-octave_env::get_program_invocation_name (void)
-{
-  return (instance_ok ())
-         ? instance->prog_invocation_name : "";
-}
-
-void
-octave_env::set_program_name (const std::string& s)
-{
-  if (instance_ok ())
-    instance->do_set_program_name (s);
-}
+    void
+    env::set_program_name (const std::string& s)
+    {
+      if (instance_ok ())
+        instance->do_set_program_name (s);
+    }
 
-std::string
-octave_env::get_user_name (void)
-{
-  return (instance_ok ())
-         ? instance->do_get_user_name () : "";
-}
+    std::string
+    env::get_user_name (void)
+    {
+      return (instance_ok ())
+        ? instance->do_get_user_name () : "";
+    }
 
-std::string
-octave_env::get_host_name (void)
-{
-  return (instance_ok ())
-         ? instance->do_get_host_name () : "";
-}
+    std::string
+    env::get_host_name (void)
+    {
+      return (instance_ok ())
+        ? instance->do_get_host_name () : "";
+    }
 
-std::string
-octave_env::do_get_temp_directory (void) const
-{
-  std::string tempd;
+    std::string
+    env::do_get_temp_directory (void) const
+    {
+      std::string tempd;
 
 #if defined (__MINGW32__) || defined (_MSC_VER)
 
-  tempd = do_getenv ("TEMP");
+      tempd = do_getenv ("TEMP");
 
-  if (tempd.empty ())
-    tempd = do_getenv ("TMP");
+      if (tempd.empty ())
+        tempd = do_getenv ("TMP");
 
-  #if defined (P_tmpdir)
-  if (tempd.empty ())
-    tempd = P_tmpdir;
-  #endif
+#if defined (P_tmpdir)
+      if (tempd.empty ())
+        tempd = P_tmpdir;
+#endif
 
-  // Some versions of MinGW and MSVC either don't define P_tmpdir, or
-  // define it to a single backslash.  In such cases just use C:\temp.
-  if (tempd.empty () || tempd == "\\")
-    tempd = "c:\\temp";
+      // Some versions of MinGW and MSVC either don't define P_tmpdir, or
+      // define it to a single backslash.  In such cases just use C:\temp.
+      if (tempd.empty () || tempd == "\\")
+        tempd = "c:\\temp";
 
 #else
 
-  tempd = do_getenv ("TMP");
+      tempd = do_getenv ("TMP");
 
-  #if defined (P_tmpdir)
-  if (tempd.empty ())
-    tempd = P_tmpdir;
-  #else
-  if (tempd.empty ())
-    tempd = "/tmp";
-  #endif
+#if defined (P_tmpdir)
+      if (tempd.empty ())
+        tempd = P_tmpdir;
+#else
+      if (tempd.empty ())
+        tempd = "/tmp";
+#endif
 
 #endif
 
-  return tempd;
-}
+      return tempd;
+    }
 
-// FIXME: this leaves no way to distinguish between a
-// variable that is not set and one that is set to the empty string.
-// Is this a problem?
+    // FIXME: this leaves no way to distinguish between a
+    // variable that is not set and one that is set to the empty string.
+    // Is this a problem?
 
-std::string
-octave_env::getenv (const std::string& name)
-{
-  return (instance_ok ())
-         ? instance->do_getenv (name) : "";
-}
+    std::string
+    env::getenv (const std::string& name)
+    {
+      return (instance_ok ())
+        ? instance->do_getenv (name) : "";
+    }
 
-void
-octave_env::putenv (const std::string& name, const std::string& value)
-{
-  octave_putenv (name, value);
-}
+    void
+    env::putenv (const std::string& name, const std::string& value)
+    {
+      octave_putenv (name, value);
+    }
 
-bool
-octave_env::have_x11_display (void)
-{
-  std::string display = getenv ("DISPLAY");
+    bool
+    env::have_x11_display (void)
+    {
+      std::string display = getenv ("DISPLAY");
 
-  return ! display.empty ();
-}
+      return ! display.empty ();
+    }
 
-bool
-octave_env::chdir (const std::string& newdir)
-{
-  return (instance_ok ())
-         ? instance->do_chdir (newdir) : false;
-}
+    bool
+    env::chdir (const std::string& newdir)
+    {
+      return (instance_ok ())
+        ? instance->do_chdir (newdir) : false;
+    }
 
-void
-octave_env::do_set_program_name (const std::string& s) const
-{
-  static bool initialized = false;
-
-  if (! initialized)
+    void
+    env::do_set_program_name (const std::string& s) const
     {
-      // The string passed to gnulib's ::set_program_name function must
-      // exist for the duration of the program so allocate a copy here
-      // instead of passing S.c_str () which only exists as long as the
-      // string object S.
+      static bool initialized = false;
 
-      // For gnulib.
-      ::set_program_name (strsave (s.c_str ()));
+      if (! initialized)
+        {
+          // The string passed to gnulib's ::set_program_name function must
+          // exist for the duration of the program so allocate a copy here
+          // instead of passing S.c_str () which only exists as long as the
+          // string object S.
+
+          // For gnulib.
+          ::set_program_name (strsave (s.c_str ()));
 
-      // Let gnulib strip off things like the "lt-" prefix from libtool.
-      prog_invocation_name = program_name;
+          // Let gnulib strip off things like the "lt-" prefix from libtool.
+          prog_invocation_name = program_name;
 
-      size_t pos
-        = prog_invocation_name.find_last_of (file_ops::dir_sep_chars ());
+          size_t pos
+            = prog_invocation_name.find_last_of (file_ops::dir_sep_chars ());
 
-      // Also keep a shortened version of the program name.
-      prog_name = (pos == std::string::npos
-                   ? prog_invocation_name
-                   : prog_invocation_name.substr (pos+1));
+          // Also keep a shortened version of the program name.
+          prog_name = (pos == std::string::npos
+                       ? prog_invocation_name
+                       : prog_invocation_name.substr (pos+1));
 
-      initialized = true;
+          initialized = true;
+        }
     }
-}
 
-// Return a pretty pathname.  If the first part of the pathname is the
-// same as $HOME, then replace that with '~'.
+    // Return a pretty pathname.  If the first part of the pathname is the
+    // same as $HOME, then replace that with '~'.
 
-std::string
-octave_env::do_polite_directory_format (const std::string& name) const
-{
-  std::string retval;
+    std::string
+    env::do_polite_directory_format (const std::string& name) const
+    {
+      std::string retval;
 
-  std::string home_dir = do_get_home_directory ();
+      std::string home_dir = do_get_home_directory ();
 
-  size_t len = home_dir.length ();
+      size_t len = home_dir.length ();
 
-  if (len > 1 && home_dir == name.substr (0, len)
-      && (name.length () == len || file_ops::is_dir_sep (name[len])))
-    {
-      retval = "~";
-      retval.append (name.substr (len));
-    }
-  else
-    retval = name;
+      if (len > 1 && home_dir == name.substr (0, len)
+          && (name.length () == len || file_ops::is_dir_sep (name[len])))
+        {
+          retval = "~";
+          retval.append (name.substr (len));
+        }
+      else
+        retval = name;
 
-  return retval;
-}
+      return retval;
+    }
 
-bool
-octave_env::do_absolute_pathname (const std::string& s) const
-{
-  size_t len = s.length ();
+    bool
+    env::do_absolute_pathname (const std::string& s) const
+    {
+      size_t len = s.length ();
 
-  if (len == 0)
-    return false;
+      if (len == 0)
+        return false;
 
-  if (file_ops::is_dir_sep (s[0]))
-    return true;
+      if (file_ops::is_dir_sep (s[0]))
+        return true;
 
 #if defined (OCTAVE_HAVE_WINDOWS_FILESYSTEM)
-  if ((len == 2 && isalpha (s[0]) && s[1] == ':')
-      || (len > 2 && isalpha (s[0]) && s[1] == ':'
-          && file_ops::is_dir_sep (s[2])))
-    return true;
+      if ((len == 2 && isalpha (s[0]) && s[1] == ':')
+          || (len > 2 && isalpha (s[0]) && s[1] == ':'
+              && file_ops::is_dir_sep (s[2])))
+        return true;
 #endif
 
-  return false;
-}
+      return false;
+    }
 
-bool
-octave_env::do_rooted_relative_pathname (const std::string& s) const
-{
-  size_t len = s.length ();
+    bool
+    env::do_rooted_relative_pathname (const std::string& s) const
+    {
+      size_t len = s.length ();
+
+      if (len == 0)
+        return false;
 
-  if (len == 0)
-    return false;
+      if (len == 1 && s[0] == '.')
+        return true;
+
+      if (len > 1 && s[0] == '.' && file_ops::is_dir_sep (s[1]))
+        return true;
 
-  if (len == 1 && s[0] == '.')
-    return true;
+      if (len == 2 && s[0] == '.' && s[1] == '.')
+        return true;
 
-  if (len > 1 && s[0] == '.' && file_ops::is_dir_sep (s[1]))
-    return true;
+      if (len > 2 && s[0] == '.' && s[1] == '.' && file_ops::is_dir_sep (s[2]))
+        return true;
 
-  if (len == 2 && s[0] == '.' && s[1] == '.')
-    return true;
+      return false;
+    }
 
-  if (len > 2 && s[0] == '.' && s[1] == '.' && file_ops::is_dir_sep (s[2]))
-    return true;
-
-  return false;
-}
+    // Return the 'basename' of the pathname in STRING (the stuff after
+    // the last directory separator).  If STRING is not a full pathname,
+    // simply return it.
 
-// Return the 'basename' of the pathname in STRING (the stuff after
-// the last directory separator).  If STRING is not a full pathname,
-// simply return it.
+    std::string
+    env::do_base_pathname (const std::string& s) const
+    {
+      if (! (do_absolute_pathname (s) || do_rooted_relative_pathname (s)))
+        return s;
+
+      size_t pos = s.find_last_of (file_ops::dir_sep_chars ());
 
-std::string
-octave_env::do_base_pathname (const std::string& s) const
-{
-  if (! (do_absolute_pathname (s) || do_rooted_relative_pathname (s)))
-    return s;
+      if (pos == std::string::npos)
+        return s;
+      else
+        return s.substr (pos+1);
+    }
 
-  size_t pos = s.find_last_of (file_ops::dir_sep_chars ());
+    // Turn STRING (a pathname) into an absolute pathname, assuming that
+    // DOT_PATH contains the symbolic location of the current directory.
 
-  if (pos == std::string::npos)
-    return s;
-  else
-    return s.substr (pos+1);
-}
+    std::string
+    env::do_make_absolute (const std::string& s,
+                           const std::string& dot_path) const
+    {
+      if (dot_path.empty () || s.empty () || do_absolute_pathname (s))
+        return s;
 
-// Turn STRING (a pathname) into an absolute pathname, assuming that
-// DOT_PATH contains the symbolic location of the current directory.
+      std::string current_dir = dot_path;
 
-std::string
-octave_env::do_make_absolute (const std::string& s,
-                              const std::string& dot_path) const
-{
-  if (dot_path.empty () || s.empty () || do_absolute_pathname (s))
-    return s;
+      if (current_dir.empty ())
+        current_dir = do_getcwd ();
+
+      size_t pos = current_dir.length () - 1;
 
-  std::string current_dir = dot_path;
+      if (! file_ops::is_dir_sep (current_dir[pos]))
+        current_dir.append (file_ops::dir_sep_str ());
 
-  if (current_dir.empty ())
-    current_dir = do_getcwd ();
+      // FIXME: this is probably not correct for all systems.
+
+      size_t i = 0;
+      size_t slen = s.length ();
 
-  size_t pos = current_dir.length () - 1;
-
-  if (! file_ops::is_dir_sep (current_dir[pos]))
-    current_dir.append (file_ops::dir_sep_str ());
+      while (i < slen)
+        {
+          if (s[i] == '.')
+            {
+              if (i + 1 == slen)
+                return current_dir;
 
-  // FIXME: this is probably not correct for all systems.
-
-  size_t i = 0;
-  size_t slen = s.length ();
+              if (file_ops::is_dir_sep (s[i+1]))
+                {
+                  i += 2;
+                  continue;
+                }
 
-  while (i < slen)
-    {
-      if (s[i] == '.')
-        {
-          if (i + 1 == slen)
-            return current_dir;
+              if (s[i+1] == '.'
+                  && (i + 2 == slen || file_ops::is_dir_sep (s[i+2])))
+                {
+                  i += 2;
 
-          if (file_ops::is_dir_sep (s[i+1]))
-            {
-              i += 2;
-              continue;
+                  if (i != slen)
+                    i++;
+
+                  pathname_backup (current_dir, 1);
+
+                  continue;
+                }
             }
 
-          if (s[i+1] == '.'
-              && (i + 2 == slen || file_ops::is_dir_sep (s[i+2])))
-            {
-              i += 2;
+          size_t tmp = s.find_first_of (file_ops::dir_sep_chars (), i);
 
-              if (i != slen)
-                i++;
-
-              pathname_backup (current_dir, 1);
-
-              continue;
+          if (tmp == std::string::npos)
+            {
+              current_dir.append (s, i, tmp-i);
+              break;
+            }
+          else
+            {
+              current_dir.append (s, i, tmp-i+1);
+              i = tmp + 1;
             }
         }
 
-      size_t tmp = s.find_first_of (file_ops::dir_sep_chars (), i);
-
-      if (tmp == std::string::npos)
-        {
-          current_dir.append (s, i, tmp-i);
-          break;
-        }
-      else
-        {
-          current_dir.append (s, i, tmp-i+1);
-          i = tmp + 1;
-        }
+      return current_dir;
     }
 
-  return current_dir;
-}
-
-// Return a string which is the current working directory.
+    // Return a string which is the current working directory.
 
-std::string
-octave_env::do_getcwd () const
-{
-  if (! follow_symbolic_links)
-    current_directory = "";
+    std::string
+    env::do_getcwd () const
+    {
+      if (! follow_symbolic_links)
+        current_directory = "";
+
+      if (verbatim_pwd || current_directory.empty ())
+        current_directory = ::octave_getcwd ();
 
-  if (verbatim_pwd || current_directory.empty ())
-    current_directory = ::octave_getcwd ();
-
-  return current_directory;
-}
+      return current_directory;
+    }
 
-// This value is not cached because it can change while Octave is
-// running.
+    // This value is not cached because it can change while Octave is
+    // running.
 
-std::string
-octave_env::do_get_home_directory (void) const
-{
-  std::string hd = do_getenv ("HOME");
+    std::string
+    env::do_get_home_directory (void) const
+    {
+      std::string hd = do_getenv ("HOME");
 
 #if defined (__MINGW32__) || defined (_MSC_VER)
-  // Maybe we are started directly from cmd.exe.
-  if (hd.empty ())
-    {
-      std::string drv = do_getenv ("HOMEDRIVE");
-      if (drv.empty ())
-        hd = do_getenv ("HOMEPATH");
-      else
-        hd = drv + do_getenv ("HOMEPATH");
-    }
+      // Maybe we are started directly from cmd.exe.
+      if (hd.empty ())
+        {
+          std::string drv = do_getenv ("HOMEDRIVE");
+          if (drv.empty ())
+            hd = do_getenv ("HOMEPATH");
+          else
+            hd = drv + do_getenv ("HOMEPATH");
+        }
 #endif
 
-  if (hd.empty ())
-    {
-      octave::sys::password pw = octave::sys::password::getpwuid (octave::sys::getuid ());
+      if (hd.empty ())
+        {
+          octave::sys::password pw = octave::sys::password::getpwuid (octave::sys::getuid ());
 
-      hd = pw ? pw.dir () : std::string (file_ops::dir_sep_str ());
+          hd = pw ? pw.dir () : std::string (file_ops::dir_sep_str ());
+        }
+
+      return hd;
     }
 
-  return hd;
-}
+    std::string
+    env::do_get_user_name (void) const
+    {
+      if (user_name.empty ())
+        {
+          octave::sys::password pw = octave::sys::password::getpwuid (octave::sys::getuid ());
 
-std::string
-octave_env::do_get_user_name (void) const
-{
-  if (user_name.empty ())
-    {
-      octave::sys::password pw = octave::sys::password::getpwuid (octave::sys::getuid ());
+          user_name = pw ? pw.name () : std::string ("unknown");
+        }
 
-      user_name = pw ? pw.name () : std::string ("unknown");
+      return user_name;
     }
 
-  return user_name;
-}
+    std::string
+    env::do_get_host_name (void) const
+    {
+      if (host_name.empty ())
+        {
+          char hostname[1024];
 
-std::string
-octave_env::do_get_host_name (void) const
-{
-  if (host_name.empty ())
-    {
-      char hostname[1024];
+          int status = gnulib::gethostname (hostname, 1023);
 
-      int status = gnulib::gethostname (hostname, 1023);
+          host_name = (status < 0) ? "unknown" : hostname;
+        }
 
-      host_name = (status < 0) ? "unknown" : hostname;
+      return host_name;
     }
 
-  return host_name;
-}
+    std::string
+    env::do_getenv (const std::string& name) const
+    {
+      char *value = ::getenv (name.c_str ());
+
+      return value ? value : "";
+    }
 
-std::string
-octave_env::do_getenv (const std::string& name) const
-{
-  char *value = ::getenv (name.c_str ());
+    // Do the work of changing to the directory NEWDIR.  Handle symbolic
+    // link following, etc.
+
+    bool
+    env::do_chdir (const std::string& newdir)
+    {
+      bool retval = false;
 
-  return value ? value : "";
-}
+      std::string tmp;
+
+      if (follow_symbolic_links)
+        {
+          if (current_directory.empty ())
+            do_getcwd ();
 
-// Do the work of changing to the directory NEWDIR.  Handle symbolic
-// link following, etc.
+          if (current_directory.empty ())
+            tmp = newdir;
+          else
+            tmp = do_make_absolute (newdir, current_directory);
 
-bool
-octave_env::do_chdir (const std::string& newdir)
-{
-  bool retval = false;
+          // Get rid of trailing directory separator.
+
+          size_t len = tmp.length ();
 
-  std::string tmp;
+          if (len > 1)
+            {
+              if (file_ops::is_dir_sep (tmp[--len]))
+                tmp.resize (len);
+            }
 
-  if (follow_symbolic_links)
-    {
-      if (current_directory.empty ())
-        do_getcwd ();
-
-      if (current_directory.empty ())
-        tmp = newdir;
+          if (! ::octave_chdir (tmp))
+            {
+              current_directory = tmp;
+              retval = true;
+            }
+        }
       else
-        tmp = do_make_absolute (newdir, current_directory);
+        retval = (! ::octave_chdir (newdir));
 
-      // Get rid of trailing directory separator.
+      return retval;
+    }
+
+    // Remove the last N directories from PATH.
 
-      size_t len = tmp.length ();
+    void
+    env::pathname_backup (std::string& path, int n) const
+    {
+      if (path.empty ())
+        return;
+
+      size_t i = path.length () - 1;
 
-      if (len > 1)
+      while (n--)
         {
-          if (file_ops::is_dir_sep (tmp[--len]))
-            tmp.resize (len);
+          while (file_ops::is_dir_sep (path[i]) && i > 0)
+            i--;
+
+          while (! file_ops::is_dir_sep (path[i]) && i > 0)
+            i--;
+
+          i++;
         }
 
-      if (! ::octave_chdir (tmp))
-        {
-          current_directory = tmp;
-          retval = true;
-        }
-    }
-  else
-    retval = (! ::octave_chdir (newdir));
-
-  return retval;
-}
-
-// Remove the last N directories from PATH.
-
-void
-octave_env::pathname_backup (std::string& path, int n) const
-{
-  if (path.empty ())
-    return;
-
-  size_t i = path.length () - 1;
-
-  while (n--)
-    {
-      while (file_ops::is_dir_sep (path[i]) && i > 0)
-        i--;
-
-      while (! file_ops::is_dir_sep (path[i]) && i > 0)
-        i--;
-
-      i++;
+      path.resize (i);
     }
 
-  path.resize (i);
-}
+    void
+    env::error (int err_num) const
+    {
+      (*current_liboctave_error_handler) ("%s", gnulib::strerror (err_num));
+    }
 
-void
-octave_env::error (int err_num) const
-{
-  (*current_liboctave_error_handler) ("%s", gnulib::strerror (err_num));
+    void
+    env::error (const std::string& s) const
+    {
+      (*current_liboctave_error_handler) ("%s", s.c_str ());
+    }
+  }
 }
-
-void
-octave_env::error (const std::string& s) const
-{
-  (*current_liboctave_error_handler) ("%s", s.c_str ());
-}