]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/filefn.h
Avoid using "do { ... } while ( wxFalse )" pseudo-loop.
[wxWidgets.git] / include / wx / filefn.h
index 892db0ec6f1055b484d4b8a8a050f1ec1d2b9202..ad0333d6695de31013eed3de7fb44e61beac7b5c 100644 (file)
@@ -15,7 +15,6 @@
 #include "wx/list.h"
 #include "wx/arrstr.h"
 
-#ifndef __WXPALMOS5__
 #ifdef __WXWINCE__
     #include "wx/msw/wince/time.h"
     #include "wx/msw/private.h"
     #include <time.h>
 #endif
 
-#ifdef __WXWINCE__
-// Nothing
-#elif !defined(__MWERKS__)
+#ifndef __WXWINCE__
     #include <sys/types.h>
     #include <sys/stat.h>
-#else
-    #ifdef __MACH__
-        #include <sys/types.h>
-        #include <utime.h>
-        #include <sys/stat.h>
-        #include <unistd.h>
-    #else
-        #include <stat.h>
-        #include <unistd.h>
-        #include <unix.h>
-    #endif
 #endif
-#endif // !__WXPALMOS5__
 
 #ifdef __OS2__
 // need to check for __OS2__ first since currently both
@@ -60,7 +45,7 @@
 #endif
 
 #if defined(__WINDOWS__) && !defined(__WXMICROWIN__)
-#if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__WXWINCE__) && !defined(__CYGWIN__)
+#if !defined( __GNUWIN32__ ) && !defined(__WXWINCE__) && !defined(__CYGWIN__)
     #include <direct.h>
     #include <dos.h>
     #include <io.h>
     #include <dir.h>
 #endif
 
-#ifndef __WXPALMOS5__
 #ifndef __WXWINCE__
     #include  <fcntl.h>       // O_RDONLY &c
 #endif
-#endif // !__WXPALMOS5__
+
 // ----------------------------------------------------------------------------
 // constants
 // ----------------------------------------------------------------------------
     #endif
 #endif
 
-#if (defined(__VISUALC__) && !defined(__WXWINCE__)) || ( defined(__MWERKS__) && defined( __INTEL__) )
+#if defined(__VISUALC__) && !defined(__WXWINCE__)
     typedef _off_t off_t;
 #elif defined(__SYMANTEC__)
     typedef long off_t;
-#elif defined(__MWERKS__) && !defined(__INTEL__) && !defined(__MACH__)
-    typedef long off_t;
-#elif defined(__WXPALMOS5__)
-    typedef long off_t;
 #endif
 
 enum wxSeekMode
@@ -134,6 +114,51 @@ enum wxFileKind
   wxFILE_KIND_PIPE      // a pipe
 };
 
+// we redefine these constants here because S_IREAD &c are _not_ standard
+// however, we do assume that the values correspond to the Unix umask bits
+enum wxPosixPermissions
+{
+    // standard Posix names for these permission flags:
+    wxS_IRUSR = 00400,
+    wxS_IWUSR = 00200,
+    wxS_IXUSR = 00100,
+
+    wxS_IRGRP = 00040,
+    wxS_IWGRP = 00020,
+    wxS_IXGRP = 00010,
+
+    wxS_IROTH = 00004,
+    wxS_IWOTH = 00002,
+    wxS_IXOTH = 00001,
+
+    // longer but more readable synonyms for the constants above:
+    wxPOSIX_USER_READ = wxS_IRUSR,
+    wxPOSIX_USER_WRITE = wxS_IWUSR,
+    wxPOSIX_USER_EXECUTE = wxS_IXUSR,
+
+    wxPOSIX_GROUP_READ = wxS_IRGRP,
+    wxPOSIX_GROUP_WRITE = wxS_IWGRP,
+    wxPOSIX_GROUP_EXECUTE = wxS_IXGRP,
+
+    wxPOSIX_OTHERS_READ = wxS_IROTH,
+    wxPOSIX_OTHERS_WRITE = wxS_IWOTH,
+    wxPOSIX_OTHERS_EXECUTE = wxS_IXOTH,
+
+    // default mode for the new files: allow reading/writing them to everybody but
+    // the effective file mode will be set after anding this value with umask and
+    // so won't include wxS_IW{GRP,OTH} for the default 022 umask value
+    wxS_DEFAULT = (wxPOSIX_USER_READ | wxPOSIX_USER_WRITE | \
+                   wxPOSIX_GROUP_READ | wxPOSIX_GROUP_WRITE | \
+                   wxPOSIX_OTHERS_READ | wxPOSIX_OTHERS_WRITE),
+
+    // default mode for the new directories (see wxFileName::Mkdir): allow
+    // reading/writing/executing them to everybody, but just like wxS_DEFAULT
+    // the effective directory mode will be set after anding this value with umask
+    wxS_DIR_DEFAULT = (wxPOSIX_USER_READ | wxPOSIX_USER_WRITE | wxPOSIX_USER_EXECUTE | \
+                       wxPOSIX_GROUP_READ | wxPOSIX_GROUP_WRITE | wxPOSIX_GROUP_EXECUTE | \
+                       wxPOSIX_OTHERS_READ | wxPOSIX_OTHERS_WRITE | wxPOSIX_OTHERS_EXECUTE)
+};
+
 // ----------------------------------------------------------------------------
 // declare our versions of low level file functions: some compilers prepend
 // underscores to the usual names, some also have Unicode versions of them
@@ -143,7 +168,7 @@ enum wxFileKind
 // Implemented in filefnwce.cpp
 #if defined( __WXWINCE__)
     typedef __int64 wxFileOffset;
-    #define wxFileOffsetFmtSpec _("I64")
+    #define wxFileOffsetFmtSpec wxT("I64")
     WXDLLIMPEXP_BASE int wxCRT_Open(const wxChar *filename, int oflag, int WXUNUSED(pmode));
     WXDLLIMPEXP_BASE int wxCRT_Access(const wxChar *name, int WXUNUSED(how));
     WXDLLIMPEXP_BASE int wxClose(int fd);
@@ -160,19 +185,20 @@ enum wxFileKind
     #define   wxCRT_RmDir      _wrmdir
     #define   wxCRT_Stat       _wstat
     #define   wxStructStat struct _stat
-#elif (defined(__WXMSW__) || defined(__OS2__)) && !defined(__WXPALMOS__) && \
+#elif (defined(__WINDOWS__) || defined(__OS2__)) && \
       ( \
         defined(__VISUALC__) || \
         defined(__MINGW64__) || \
         (defined(__MINGW32__) && !defined(__WINE__) && \
                                 wxCHECK_W32API_VERSION(0, 5)) || \
-        defined(__MWERKS__) || \
         defined(__DMC__) || \
         defined(__WATCOMC__) || \
         defined(__BORLANDC__) \
       )
 
+    // temporary defines just used immediately below
     #undef wxHAS_HUGE_FILES
+    #undef wxHAS_HUGE_STDIO_FILES
 
     // detect compilers which have support for huge files
     #if defined(__VISUALC__)
@@ -183,9 +209,19 @@ enum wxFileKind
         #define wxHAS_HUGE_FILES 1
     #endif
 
-    // other Windows compilers (DMC, Watcom, Metrowerks and Borland) don't have
-    // huge file support (or at least not all functions needed for it by wx)
-    // currently
+    // detect compilers which have support for huge stdio files
+    #if wxCHECK_VISUALC_VERSION(8)
+        #define wxHAS_HUGE_STDIO_FILES
+        #define wxFseek _fseeki64
+        #define wxFtell _ftelli64
+    #elif wxCHECK_MINGW32_VERSION(3, 5) // mingw-runtime version (not gcc)
+        #define wxHAS_HUGE_STDIO_FILES
+        #define wxFseek fseeko64
+        #define wxFtell ftello64
+    #endif
+
+    // other Windows compilers (DMC, Watcom, and Borland) don't have huge file
+    // support (or at least not all functions needed for it by wx) currently
 
     // types
 
@@ -256,20 +292,8 @@ enum wxFileKind
     // complications
     #define   wxClose      wxPOSIX_IDENT(close)
 
-    #if defined(__MWERKS__)
-        #if __MSL__ >= 0x6000
-            #define wxRead(fd, buf, nCount)  _read(fd, (void *)buf, nCount)
-            #define wxWrite(fd, buf, nCount) _write(fd, (void *)buf, nCount)
-        #else
-            #define wxRead(fd, buf, nCount)\
-                  _read(fd, (const char *)buf, nCount)
-            #define wxWrite(fd, buf, nCount)\
-                  _write(fd, (const char *)buf, nCount)
-        #endif
-    #else // __MWERKS__
-        #define wxRead         wxPOSIX_IDENT(read)
-        #define wxWrite        wxPOSIX_IDENT(write)
-    #endif
+    #define wxRead         wxPOSIX_IDENT(read)
+    #define wxWrite        wxPOSIX_IDENT(write)
 
     #ifdef wxHAS_HUGE_FILES
         #ifndef __MINGW64__
@@ -303,86 +327,87 @@ enum wxFileKind
     #define   wxEof        wxPOSIX_IDENT(eof)
 
     // then the functions taking strings
+
+    // first the ANSI versions
+    #define   wxCRT_OpenA       wxPOSIX_IDENT(open)
+    #define   wxCRT_AccessA     wxPOSIX_IDENT(access)
+    #define   wxCRT_MkDirA      wxPOSIX_IDENT(mkdir)
+    #define   wxCRT_RmDirA      wxPOSIX_IDENT(rmdir)
+    #ifdef wxHAS_HUGE_FILES
+        // MinGW-64 provides underscore-less versions of all file functions
+        // except for this one.
+        #ifdef __MINGW64__
+            #define   wxCRT_StatA       _stati64
+        #else
+            #define   wxCRT_StatA       wxPOSIX_IDENT(stati64)
+        #endif
+    #else
+        // Unfortunately Watcom is not consistent
+        #if defined(__OS2__) && defined(__WATCOMC__)
+            #define   wxCRT_StatA       _stat
+        #else
+            #define   wxCRT_StatA       wxPOSIX_IDENT(stat)
+        #endif
+    #endif
+
+    // then wide char ones
+    #if wxUSE_UNICODE
+        // special workaround for buggy wopen() in bcc 5.5
+        #if defined(__BORLANDC__) && \
+            (__BORLANDC__ >= 0x550 && __BORLANDC__ <= 0x551)
+                WXDLLIMPEXP_BASE int wxCRT_OpenW(const wxChar *pathname,
+                                                 int flags, mode_t mode);
+        #else
+            #define wxCRT_OpenW       _wopen
+        #endif
+
+        #define   wxCRT_AccessW     _waccess
+        #define   wxCRT_MkDirW      _wmkdir
+        #define   wxCRT_RmDirW      _wrmdir
+        #ifdef wxHAS_HUGE_FILES
+            #define   wxCRT_StatW       _wstati64
+        #else
+            #define   wxCRT_StatW       _wstat
+        #endif
+    #endif // wxUSE_UNICODE
+
+
+    // finally the default char-type versions
     #if wxUSE_UNICODE
-        #if wxUSE_UNICODE_MSLU
+        #if wxUSE_UNICODE_MSLU || defined(__WX_STRICT_ANSI_GCC__)
             // implement the missing file functions in Win9x ourselves
-            #if defined( __VISUALC__ ) \
-                || ( defined(__MINGW32__) && wxCHECK_W32API_VERSION( 0, 5 ) ) \
-                || ( defined(__MWERKS__) && defined(__WXMSW__) ) \
-                || ( defined(__BORLANDC__) && (__BORLANDC__ > 0x460) ) \
-                || defined(__DMC__)
-
-                WXDLLIMPEXP_BASE int wxMSLU__wopen(const wxChar *name,
-                                                   int flags, int mode);
-                WXDLLIMPEXP_BASE int wxMSLU__waccess(const wxChar *name,
-                                                     int mode);
-                WXDLLIMPEXP_BASE int wxMSLU__wmkdir(const wxChar *name);
-                WXDLLIMPEXP_BASE int wxMSLU__wrmdir(const wxChar *name);
-
-                #ifdef wxHAS_HUGE_FILES
-                    WXDLLIMPEXP_BASE int
-                    wxMSLU__wstati64(const wxChar *name, wxStructStat *buffer);
-                #else // !wxHAS_HUGE_FILES
-                    WXDLLIMPEXP_BASE int
-                    wxMSLU__wstat(const wxChar *name, wxStructStat *buffer);
-                #endif // wxHAS_HUGE_FILES/!wxHAS_HUGE_FILES
-            #endif // Windows compilers with MSLU support
+            WXDLLIMPEXP_BASE int wxMSLU__wopen(const wxChar *name,
+                                               int flags, int mode);
+            WXDLLIMPEXP_BASE int wxMSLU__waccess(const wxChar *name,
+                                                 int mode);
+            WXDLLIMPEXP_BASE int wxMSLU__wmkdir(const wxChar *name);
+            WXDLLIMPEXP_BASE int wxMSLU__wrmdir(const wxChar *name);
+
+            WXDLLIMPEXP_BASE int
+            wxMSLU__wstat(const wxChar *name, wxStructStat *buffer);
 
             #define   wxCRT_Open       wxMSLU__wopen
 
             #define   wxCRT_Access     wxMSLU__waccess
             #define   wxCRT_MkDir      wxMSLU__wmkdir
             #define   wxCRT_RmDir      wxMSLU__wrmdir
-            #ifdef wxHAS_HUGE_FILES
-                #define   wxCRT_Stat   wxMSLU__wstati64
-            #else
-                #define   wxCRT_Stat   wxMSLU__wstat
-            #endif
+            #define   wxCRT_Stat       wxMSLU__wstat
         #else // !wxUSE_UNICODE_MSLU
-            #ifdef __BORLANDC__
-                #if __BORLANDC__ >= 0x550 && __BORLANDC__ <= 0x551
-                    WXDLLIMPEXP_BASE int wxCRT_Open(const wxChar *pathname,
-                                                    int flags, mode_t mode);
-                #else
-                    #define   wxCRT_Open       _wopen
-                #endif
-                #define   wxCRT_Access     _waccess
-                #define   wxCRT_MkDir      _wmkdir
-                #define   wxCRT_RmDir      _wrmdir
-                #ifdef wxHAS_HUGE_FILES
-                    #define   wxCRT_Stat       _wstati64
-                #else
-                    #define   wxCRT_Stat       _wstat
-                #endif
-            #else
-                #define   wxCRT_Open       _wopen
-                #define   wxCRT_Access     _waccess
-                #define   wxCRT_MkDir      _wmkdir
-                #define   wxCRT_RmDir      _wrmdir
-                #ifdef wxHAS_HUGE_FILES
-                    #define   wxCRT_Stat       _wstati64
-                #else
-                    #define   wxCRT_Stat       _wstat
-                #endif
-            #endif
+            #define wxCRT_Open      wxCRT_OpenW
+            #define wxCRT_Access    wxCRT_AccessW
+            #define wxCRT_MkDir     wxCRT_MkDirW
+            #define wxCRT_RmDir     wxCRT_RmDirW
+            #define wxCRT_Stat      wxCRT_StatW
         #endif // wxUSE_UNICODE_MSLU/!wxUSE_UNICODE_MSLU
     #else // !wxUSE_UNICODE
-        #define   wxCRT_Open       wxPOSIX_IDENT(open)
-        #define   wxCRT_Access     wxPOSIX_IDENT(access)
-        #define   wxCRT_MkDir      wxPOSIX_IDENT(mkdir)
-        #define   wxCRT_RmDir      wxPOSIX_IDENT(rmdir)
-        #ifdef wxHAS_HUGE_FILES
-            #define   wxCRT_Stat       wxPOSIX_IDENT(stati64)
-        #else
-            // Unfortunately Watcom is not consistent, so:-
-            #if defined(__OS2__) && defined(__WATCOMC__)
-                #define   wxCRT_Stat       _stat
-            #else
-                #define   wxCRT_Stat       wxPOSIX_IDENT(stat)
-            #endif
-        #endif
+        #define wxCRT_Open      wxCRT_OpenA
+        #define wxCRT_Access    wxCRT_AccessA
+        #define wxCRT_MkDir     wxCRT_MkDirA
+        #define wxCRT_RmDir     wxCRT_RmDirA
+        #define wxCRT_Stat      wxCRT_StatA
     #endif // wxUSE_UNICODE/!wxUSE_UNICODE
 
+
     // constants (unless already defined by the user code)
     #ifdef wxHAS_UNDERSCORES_IN_POSIX_IDENTS
         #ifndef O_RDONLY
@@ -402,69 +427,39 @@ enum wxFileKind
     #endif // wxHAS_UNDERSCORES_IN_POSIX_IDENTS
 
     #ifdef wxHAS_HUGE_FILES
-        // wxFile is present and supports large files. Currently wxFFile
-        // doesn't have large file support with any Windows compiler (even
-        // Win64 ones).
+        // wxFile is present and supports large files.
         #if wxUSE_FILE
             #define wxHAS_LARGE_FILES
         #endif
+        // wxFFile is present and supports large files
+        #if wxUSE_FFILE && defined wxHAS_HUGE_STDIO_FILES
+            #define wxHAS_LARGE_FFILES
+        #endif
     #endif
 
-    // it's a private define, undefine it so that nobody gets tempted to use it
+    // private defines, undefine so that nobody gets tempted to use
     #undef wxHAS_HUGE_FILES
-#elif defined (__WXPALMOS__)
-    typedef off_t wxFileOffset;
-#ifdef _LARGE_FILES
-    #define wxFileOffsetFmtSpec wxLongLongFmtSpec
-    wxCOMPILE_TIME_ASSERT( sizeof(off_t) == sizeof(wxLongLong_t), BadFileSizeType );
-    // wxFile is present and supports large files
-    #ifdef wxUSE_FILE
-        #define wxHAS_LARGE_FILES
-    #endif
-    // wxFFile is present and supports large files
-    #if SIZEOF_LONG == 8 || defined HAVE_FSEEKO
-        #define wxHAS_LARGE_FFILES
-    #endif
-#else
-    #define wxFileOffsetFmtSpec _T("")
-#endif
-    #define   wxClose      close
-    #define   wxRead       ::read
-    #define   wxWrite      ::write
-    #define   wxLseek      lseek
-    #define   wxSeek       lseek
-    #define   wxFsync      fsync
-    #define   wxEof        eof
-
-    #define   wxCRT_MkDir      mkdir
-    #define   wxCRT_RmDir      rmdir
-
-    #define   wxTell(fd)   lseek(fd, 0, SEEK_CUR)
-
-    #define   wxStructStat struct stat
-
-    #define   wxCRT_Open       open
-    #define   wxCRT_Stat       svfs_stat
-    #define   wxCRT_Lstat      lstat
-    #define   wxCRT_Access     access
-
-    #define wxHAS_NATIVE_LSTAT
+    #undef wxHAS_HUGE_STDIO_FILES
 #else // Unix or Windows using unknown compiler, assume POSIX supported
     typedef off_t wxFileOffset;
-    #ifdef _LARGE_FILES
+    #ifdef HAVE_LARGEFILE_SUPPORT
         #define wxFileOffsetFmtSpec wxLongLongFmtSpec
         wxCOMPILE_TIME_ASSERT( sizeof(off_t) == sizeof(wxLongLong_t),
                                 BadFileSizeType );
         // wxFile is present and supports large files
-        #ifdef wxUSE_FILE
+        #if wxUSE_FILE
             #define wxHAS_LARGE_FILES
         #endif
         // wxFFile is present and supports large files
-        #if SIZEOF_LONG == 8 || defined HAVE_FSEEKO
+        #if wxUSE_FFILE && (SIZEOF_LONG == 8 || defined HAVE_FSEEKO)
             #define wxHAS_LARGE_FFILES
         #endif
+        #ifdef HAVE_FSEEKO
+            #define wxFseek fseeko
+            #define wxFtell ftello
+        #endif
     #else
-        #define wxFileOffsetFmtSpec _T("")
+        #define wxFileOffsetFmtSpec wxT("")
     #endif
     // functions
     #define   wxClose      close
@@ -496,6 +491,15 @@ enum wxFileKind
     #define wxCRT_Lstat wxCRT_Stat
 #endif
 
+// define wxFseek/wxFtell to large file versions if available (done above) or
+// to fseek/ftell if not, to save ifdefs in using code
+#ifndef wxFseek
+    #define wxFseek fseek
+#endif
+#ifndef wxFtell
+    #define wxFtell ftell
+#endif
+
 inline int wxAccess(const wxString& path, mode_t mode)
     { return wxCRT_Access(path.fn_str(), mode); }
 inline int wxOpen(const wxString& path, int flags, mode_t mode)
@@ -509,7 +513,8 @@ inline int wxLstat(const wxString& path, wxStructStat *buf)
     { return wxCRT_Lstat(path.fn_str(), buf); }
 inline int wxRmDir(const wxString& path)
     { return wxCRT_RmDir(path.fn_str()); }
-#if defined(__WINDOWS__) || (defined(__OS2__) && defined(__WATCOMC__))
+#if (defined(__WINDOWS__) && !defined(__CYGWIN__)) \
+        || (defined(__OS2__) && defined(__WATCOMC__))
 inline int wxMkDir(const wxString& path, mode_t WXUNUSED(mode) = 0)
     { return wxCRT_MkDir(path.fn_str()); }
 #else
@@ -642,7 +647,7 @@ WXDLLIMPEXP_BASE wxString wxGetCwd();
 WXDLLIMPEXP_BASE bool wxSetWorkingDirectory(const wxString& d);
 
 // Make directory
-WXDLLIMPEXP_BASE bool wxMkdir(const wxString& dir, int perm = 0777);
+WXDLLIMPEXP_BASE bool wxMkdir(const wxString& dir, int perm = wxS_DIR_DEFAULT);
 
 // Remove directory. Flags reserved for future use.
 WXDLLIMPEXP_BASE bool wxRmdir(const wxString& dir, int flags = 0);
@@ -694,9 +699,6 @@ WXDLLIMPEXP_BASE bool wxIsExecutable(const wxString &path);
   // CYGWIN also uses UNIX settings
   #define wxFILE_SEP_PATH     wxFILE_SEP_PATH_UNIX
   #define wxPATH_SEP          wxPATH_SEP_UNIX
-#elif defined(__WXPALMOS__)
-  #define wxFILE_SEP_PATH     wxFILE_SEP_PATH_UNIX
-  #define wxPATH_SEP          wxPATH_SEP_UNIX
 #elif defined(__MAC__)
   #define wxFILE_SEP_PATH     wxFILE_SEP_PATH_MAC
   #define wxPATH_SEP          wxPATH_SEP_MAC
@@ -730,6 +732,7 @@ WXDLLIMPEXP_BASE bool wxEndsWithPathSeparator(const wxString& filename);
 #if WXWIN_COMPATIBILITY_2_8
 // split the full path into path (including drive for DOS), name and extension
 // (understands both '/' and '\\')
+// Deprecated in favour of wxFileName::SplitPath
 wxDEPRECATED( WXDLLIMPEXP_BASE void wxSplitPath(const wxString& fileName,
                                                 wxString *pstrPath,
                                                 wxString *pstrName,