diff liboctave/file-ops.h @ 10197:4d433bd2d4dc

attempt to avoid trouble with gnulib #defines in a consistent way
author John W. Eaton <jwe@octave.org>
date Tue, 26 Jan 2010 00:45:04 -0500
parents 0522a65bcd56
children 2fcc927a8757
line wrap: on
line diff
--- a/liboctave/file-ops.h
+++ b/liboctave/file-ops.h
@@ -35,36 +35,15 @@
 {
 public:
 
-  static int mkdir (const std::string& nm, mode_t md);
-  static int mkdir (const std::string& nm, mode_t md, std::string& msg);
-
-  static int mkfifo (const std::string& nm, mode_t md);
-  static int mkfifo (const std::string& nm, mode_t md, std::string& msg);
-
-  static int link (const std::string&, const std::string&);
-  static int link (const std::string&, const std::string&, std::string&);
-
-  static int symlink (const std::string&, const std::string&);
-  static int symlink (const std::string&, const std::string&, std::string&);
-
-  static int readlink (const std::string&, std::string&);
-  static int readlink (const std::string&, std::string&, std::string&);
+  // Use a singleton class for dir_sep data members instead of just
+  // making them static members of the dir_path class so that we can
+  // ensure proper initialization.
 
-  static int rename (const std::string&, const std::string&);
-  static int rename (const std::string&, const std::string&, std::string&);
-
-  static int rmdir (const std::string&);
-  static int rmdir (const std::string&, std::string&);
-
-  static int recursive_rmdir (const std::string&);
-  static int recursive_rmdir (const std::string&, std::string&);
-
-  static std::string canonicalize_file_name (const std::string&);
-  static std::string canonicalize_file_name (const std::string&, std::string&);
-
-  static std::string tempnam (const std::string&, const std::string&);
-  static std::string tempnam (const std::string&, const std::string&,
-                              std::string&);
+  file_ops (char dir_sep_char_arg = 0,
+            const std::string& dir_sep_str_arg = std::string ("/"),
+            const std::string& dir_sep_chars_arg = std::string ("/"))
+    : xdir_sep_char (dir_sep_char_arg), xdir_sep_str (dir_sep_str_arg),
+      xdir_sep_chars (dir_sep_chars_arg) { }
 
   typedef std::string (*tilde_expansion_hook) (const std::string&);
 
@@ -76,13 +55,20 @@
 
   static string_vector tilde_additional_suffixes;
 
-  static std::string tilde_expand (const std::string&);
-  static string_vector tilde_expand (const string_vector&);
+  static char dir_sep_char (void)
+  {
+    return instance_ok () ? instance->xdir_sep_char : 0;
+  }
 
-  static int umask (mode_t);
+  static std::string dir_sep_str (void)
+  {
+    return instance_ok () ? instance->xdir_sep_str : std::string ();
+  }
 
-  static int unlink (const std::string&);
-  static int unlink (const std::string&, std::string&);
+  static std::string dir_sep_chars (void)
+  {
+    return instance_ok () ? instance->xdir_sep_chars : std::string ();
+  }
 
   static bool is_dir_sep (char c)
   {
@@ -90,25 +76,14 @@
     return tmp.find (c) != std::string::npos;
   }
 
+  static std::string tilde_expand (const std::string&);
+
+  static string_vector tilde_expand (const string_vector&);
+
   static std::string concat (const std::string&, const std::string&);
 
-  static char dir_sep_char (void)
-  {
-    return static_members::dir_sep_char ();
-  }
-
-  static std::string dir_sep_str (void)
-  {
-    return static_members::dir_sep_str ();
-  }
-
-  static std::string dir_sep_chars (void)
-  {
-    return static_members::dir_sep_chars ();
-  }
-
-  // Return the tail member of a path.
-  static std::string tail (std::string path)
+  // Return the tail member of a file name.
+  static std::string tail (const std::string& path)
   {
     size_t ipos = path.find_last_of (dir_sep_chars ());
 
@@ -120,54 +95,92 @@
     return path.substr (ipos);
   }
 
+  static std::string canonicalize_file_name (const std::string&);
+
+  static std::string canonicalize_file_name (const std::string&, std::string&);
+
 private:
 
-  static int mkdir_internal (const std::string&, mode_t, std::string&);
-
-  static int mkfifo_internal (const std::string&, mode_t, std::string&);
-
-  // Use a singleton class for these data members instead of just
-  // making them static members of the dir_path class so that we can
-  // ensure proper initialization.
+  static file_ops *instance;
 
-  class static_members
-  {
-  public:
+  // No copying!
 
-    static_members (void);
-
-    static char dir_sep_char (void)
-    {
-      return instance_ok () ? instance->xdir_sep_char : 0;
-    }
+  file_ops (const file_ops&);
 
-    static std::string dir_sep_str (void)
-    {
-      return instance_ok () ? instance->xdir_sep_str : std::string ();
-    }
+  file_ops& operator = (const file_ops&);
 
-    static std::string dir_sep_chars (void)
-    {
-      return instance_ok () ? instance->xdir_sep_chars : std::string ();
-    }
-
-  private:
+  static bool instance_ok (void);
 
-    // The real thing.
-    static static_members *instance;
-
-    // No copying!
-
-    static_members (const static_members&);
-
-    static_members& operator = (const static_members&);
-
-    static bool instance_ok (void);
-
-    char xdir_sep_char;
-    std::string xdir_sep_str;
-    std::string xdir_sep_chars;
-  };
+  char xdir_sep_char;
+  std::string xdir_sep_str;
+  std::string xdir_sep_chars;
 };
 
+// We don't have these in the file_ops class with their simple names
+// (i.e., mkdir instead of octave_mdir) because function names in
+// standard headers may be #defined.
+
+extern OCTAVE_API int
+octave_mkdir (const std::string& nm, mode_t md);
+
+extern OCTAVE_API int
+octave_mkdir (const std::string& nm, mode_t md, std::string& msg);
+
+extern OCTAVE_API int
+octave_mkfifo (const std::string& nm, mode_t md);
+
+extern OCTAVE_API int
+octave_mkfifo (const std::string& nm, mode_t md, std::string& msg);
+
+extern OCTAVE_API int
+octave_link (const std::string&, const std::string&);
+
+extern OCTAVE_API int
+octave_link (const std::string&, const std::string&, std::string&);
+
+extern OCTAVE_API int
+octave_symlink (const std::string&, const std::string&);
+
+extern OCTAVE_API int
+octave_symlink (const std::string&, const std::string&, std::string&);
+
+extern OCTAVE_API int
+octave_readlink (const std::string&, std::string&);
+
+extern OCTAVE_API int
+octave_readlink (const std::string&, std::string&, std::string&);
+
+extern OCTAVE_API int
+octave_rename (const std::string&, const std::string&);
+
+extern OCTAVE_API int
+octave_rename (const std::string&, const std::string&, std::string&);
+
+extern OCTAVE_API int
+octave_rmdir (const std::string&);
+
+extern OCTAVE_API int
+octave_rmdir (const std::string&, std::string&);
+
+extern OCTAVE_API int
+octave_recursive_rmdir (const std::string&);
+
+extern OCTAVE_API int
+octave_recursive_rmdir (const std::string&, std::string&);
+
+extern OCTAVE_API int
+octave_umask (mode_t);
+
+extern OCTAVE_API int
+octave_unlink (const std::string&);
+
+extern OCTAVE_API int
+octave_unlink (const std::string&, std::string&);
+
+extern OCTAVE_API std::string
+octave_tempnam (const std::string&, const std::string&);
+
+extern OCTAVE_API std::string
+octave_tempnam (const std::string&, const std::string&, std::string&);
+
 #endif