]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filefn.cpp
Reinsert missing ctor removed in date/time tidy
[wxWidgets.git] / src / common / filefn.cpp
index 2d99f34d50aa7871aa0eec41374aec4e83d98942..de78ad948a3e52ecd6ae72037363d342b1562c46 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     29/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Julian Smart
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 #ifndef __MWERKS__
     #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>
+    #include <fcntl.h>
+#endif
 #endif
 
 #ifdef __UNIX__
     #include <windows.h>
     #include "wx/msw/mslu.h"
 
+    // for _getcwd
+    #ifdef __MINGW32__
+        #include <io.h>
+    #endif
+
     // sys/cygwin.h is needed for cygwin_conv_to_full_win32_path()
     //
     // note that it must be included after <windows.h>
         #ifdef __CYGWIN__
             #include <sys/cygwin.h>
         #endif
-
-        #ifndef __TWIN32__
-            #include <sys/unistd.h>
-        #endif
     #endif // __GNUWIN32__
 #endif // __WINDOWS__
 
@@ -214,34 +223,43 @@ void wxPathList::Add (const wxString& path)
 // Add paths e.g. from the PATH environment variable
 void wxPathList::AddEnvList (const wxString& envVariable)
 {
-  static const wxChar PATH_TOKS[] =
+    static const wxChar PATH_TOKS[] =
 #ifdef __WINDOWS__
-        wxT(" ;"); // Don't seperate with colon in DOS (used for drive)
+        /*
+        The space has been removed from the tokenizers, otherwise a
+        path such as "C:\Program Files" would be split into 2 paths:
+        "C:\Program" and "Files"
+        */
+//        wxT(" ;"); // Don't seperate with colon in DOS (used for drive)
+        wxT(";"); // Don't seperate with colon in DOS (used for drive)
 #else
         wxT(" :;");
 #endif
 
-  wxChar *val = wxGetenv (WXSTRINGCAST envVariable);
-  if (val && *val)
+    wxChar *val = wxGetenv (WXSTRINGCAST envVariable);
+    if (val && *val)
     {
-      wxChar *s = copystring (val);
-      wxChar *save_ptr, *token = wxStrtok (s, PATH_TOKS, &save_ptr);
+        wxChar *s = copystring (val);
+        wxChar *save_ptr, *token = wxStrtok (s, PATH_TOKS, &save_ptr);
 
-      if (token)
-      {
-          Add (copystring (token));
-          while (token)
-          {
-              if ((token = wxStrtok ((wxChar *) NULL, PATH_TOKS, &save_ptr)) != NULL)
-                  Add (wxString(token));
-          }
-      }
+        if (token)
+        {
+            Add(token);
+            while (token)
+            {
+                if ( (token = wxStrtok ((wxChar *) NULL, PATH_TOKS, &save_ptr))
+                    != NULL )
+                {
+                    Add(token);
+                }
+            }
+        }
 
-      // suppress warning about unused variable save_ptr when wxStrtok() is a
-      // macro which throws away its third argument
-      save_ptr = token;
+        // suppress warning about unused variable save_ptr when wxStrtok() is a
+        // macro which throws away its third argument
+        save_ptr = token;
 
-      delete [] s;
+        delete [] s;
     }
 }
 
@@ -272,9 +290,9 @@ bool wxPathList::Member (const wxString& path)
           path.CompareTo (path2) == 0
 #endif
         )
-        return true;
+        return TRUE;
   }
-  return false;
+  return FALSE;
 }
 
 wxString wxPathList::FindValidPath (const wxString& file)
@@ -354,23 +372,23 @@ wxIsAbsolutePath (const wxString& filename)
         // "MacOS:MyText.txt" is absolute whereas "MyDir:MyText.txt"
         // is not. Or maybe ":MyDir:MyText.txt" has to be used? RR.
         if (filename.Find(':') != wxNOT_FOUND && filename[0] != ':')
-            return true ;
+            return TRUE ;
 #else
         // Unix like or Windows
         if (filename[0] == wxT('/'))
-            return true;
+            return TRUE;
 #endif
 #ifdef __VMS__
         if ((filename[0] == wxT('[') && filename[1] != wxT('.')))
-            return true;
+            return TRUE;
 #endif
 #ifdef __WINDOWS__
         // MSDOS like
         if (filename[0] == wxT('\\') || (wxIsalpha (filename[0]) && filename[1] == wxT(':')))
-            return true;
+            return TRUE;
 #endif
     }
-    return false ;
+    return FALSE ;
 }
 
 /*
@@ -549,7 +567,7 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name)
     s = nm;
     d = lnm;
 #ifdef __WXMSW__
-    q = false;
+    q = FALSE;
 #else
     q = nm[0] == wxT('\\') && nm[1] == wxT('~');
 #endif
@@ -865,7 +883,7 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec )
     int         j;
     OSErr       theErr;
     OSStatus    theStatus;
-    Boolean     isDirectory = false;
+    Boolean     isDirectory = FALSE;
     Str255    theParentPath = "\p";
     FSSpec      theParentSpec;
     FSRef       theParentRef;
@@ -926,7 +944,7 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec )
         (*myPath)[length-1] = 0 ;
 
     // create path string for return value
-    wxString result( (char*) *myPath ) ;
+    wxString result = wxMacMakeStringFromCString( *myPath ) ;
 
     // free allocated handle
     ::HUnlock( myPath ) ;
@@ -939,7 +957,8 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec )
 // Mac file names are POSIX (Unix style) under Darwin
 // therefore the conversion functions below are not needed
 
-static char sMacFileNameConversion[ 1000 ] ;
+static wxChar sMacFileNameConversion[ 1000 ] ;
+static char scMacFileNameConversion[ 1000 ] ;
 
 #endif
 void wxMacFilename2FSSpec( const char *path , FSSpec *spec )
@@ -956,10 +975,10 @@ void wxMacFilename2FSSpec( const char *path , FSSpec *spec )
     if ( strchr( path , ':' ) == NULL )
     {
         // try whether it is a volume / or a mounted volume
-        strncpy( sMacFileNameConversion , path , 1000 ) ;
-        sMacFileNameConversion[998] = 0 ;
-        strcat( sMacFileNameConversion , ":" ) ;
-        err = FSpLocationFromFullPath( strlen(sMacFileNameConversion) , sMacFileNameConversion , spec ) ;
+        strncpy( scMacFileNameConversion , path , 1000 ) ;
+        scMacFileNameConversion[998] = 0 ;
+        strcat( scMacFileNameConversion , ":" ) ;
+        err = FSpLocationFromFullPath( strlen(scMacFileNameConversion) , scMacFileNameConversion , spec ) ;
     }
     else
     {
@@ -968,15 +987,22 @@ void wxMacFilename2FSSpec( const char *path , FSSpec *spec )
 #endif
 }
 
+#if wxUSE_UNICODE
+WXDLLEXPORT void wxMacFilename2FSSpec( const wxChar *path , FSSpec *spec ) 
+{
+    return wxMacFilename2FSSpec( wxMacStringToCString( wxString( path ) ) , spec ) ;
+}
+#endif
+
 #ifndef __DARWIN__
 
-wxString wxMac2UnixFilename (const char *str)
+wxString wxMac2UnixFilename (const wxChar *str)
 {
-    char *s = sMacFileNameConversion ;
-    strcpy( s , str ) ;
+    wxChar *s = sMacFileNameConversion ;
+    wxStrcpy( s , str ) ;
     if (s)
     {
-        memmove( s+1 , s ,strlen( s ) + 1) ;
+        memmove( s+1 , s ,wxStrlen( s ) + 1 * sizeof(wxChar)) ;
         if ( *s == ':' )
             *s = '.' ;
         else
@@ -994,25 +1020,25 @@ wxString wxMac2UnixFilename (const char *str)
     return wxString(sMacFileNameConversion) ;
 }
 
-wxString wxUnix2MacFilename (const char *str)
+wxString wxUnix2MacFilename (const wxChar *str)
 {
-    char *s = sMacFileNameConversion ;
-    strcpy( s , str ) ;
+    wxChar *s = sMacFileNameConversion ;
+    wxStrcpy( s , str ) ;
     if (s)
     {
         if ( *s == '.' )
         {
             // relative path , since it goes on with slash which is translated to a :
-            memmove( s , s+1 ,strlen( s ) ) ;
+            memmove( s , s+1 ,wxStrlen( s ) * sizeof(wxChar)) ;
         }
         else if ( *s == '/' )
         {
             // absolute path -> on mac just start with the drive name
-            memmove( s , s+1 ,strlen( s ) ) ;
+            memmove( s , s+1 ,wxStrlen( s ) * sizeof(wxChar) ) ;
         }
         else
         {
-            wxASSERT_MSG( 1 , "unkown path beginning" ) ;
+            wxASSERT_MSG( 1 , wxT("unkown path beginning") ) ;
         }
         while (*s)
         {
@@ -1022,7 +1048,7 @@ wxString wxUnix2MacFilename (const char *str)
                 if ( *(s+1) == '.' && *(s+2) == '.' && ( (*(s+3) == '/' || *(s+3) == '\\') ) )
                 {
                     *s = ':';
-                    memmove( s+1 , s+3 ,strlen( s+3 ) + 1 ) ;
+                    memmove( s+1 , s+3 ,(wxStrlen( s+3 ) + 1)*sizeof(wxChar) ) ;
                 }
                 else
                     *s = ':';
@@ -1030,7 +1056,7 @@ wxString wxUnix2MacFilename (const char *str)
             s++ ;
         }
     }
-    return wxString (sMacFileNameConversion) ;
+    return wxString(sMacFileNameConversion) ;
 }
 
 wxString wxMacFSSpec2UnixFilename( const FSSpec *spec )
@@ -1088,7 +1114,7 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil
 {
   wxString outfile;
   if ( !wxGetTempFileName( wxT("cat"), outfile) )
-      return false;
+      return FALSE;
 
   FILE *fp1 = (FILE *) NULL;
   FILE *fp2 = (FILE *) NULL;
@@ -1104,7 +1130,7 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil
         fclose (fp2);
       if (fp3)
         fclose (fp3);
-      return false;
+      return FALSE;
     }
 
   int ch;
@@ -1135,11 +1161,11 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite)
         wxLogSysError(_("Failed to copy the file '%s' to '%s'"),
                       file1.c_str(), file2.c_str());
 
-        return false;
+        return FALSE;
     }
 #elif defined(__WXPM__)
     if ( ::DosCopy(file2, file2, overwrite ? DCPY_EXISTING : 0) != 0 )
-        return false;
+        return FALSE;
 #else // !Win32
 
     wxStructStat fbuf;
@@ -1150,13 +1176,13 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite)
         // from it anyhow
         wxLogSysError(_("Impossible to get permissions for file '%s'"),
                       file1.c_str());
-        return false;
+        return FALSE;
     }
 
     // open file1 for reading
     wxFile fileIn(file1, wxFile::read);
     if ( !fileIn.IsOpened() )
-        return false;
+        return FALSE;
 
     // remove file2, if it exists. This is needed for creating
     // file2 with the correct permissions in the next step
@@ -1164,7 +1190,7 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite)
     {
         wxLogSysError(_("Impossible to overwrite the file '%s'"),
                       file2.c_str());
-        return false;
+        return FALSE;
     }
 
 #ifdef __UNIX__
@@ -1175,10 +1201,10 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite)
 
     // create file2 with the same permissions than file1 and open it for
     // writing
-    
+
     wxFile fileOut;
     if ( !fileOut.Create(file2, overwrite, fbuf.st_mode & 0777) )
-        return false;
+        return FALSE;
 
 #ifdef __UNIX__
     /// restore the old umask
@@ -1192,21 +1218,21 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite)
     {
         count = fileIn.Read(buf, WXSIZEOF(buf));
         if ( fileIn.Error() )
-            return false;
+            return FALSE;
 
         // end of file?
         if ( !count )
             break;
 
         if ( fileOut.Write(buf, count) < count )
-            return false;
+            return FALSE;
     }
 
     // we can expect fileIn to be closed successfully, but we should ensure
     // that fileOut was closed as some write errors (disk full) might not be
     // detected before doing this
     if ( !fileIn.Close() || !fileOut.Close() )
-        return false;
+        return FALSE;
 
 #if !defined(__VISAGECPP__) && !defined(__WXMAC__) || defined(__UNIX__)
     // no chmod in VA.  Should be some permission API for HPFS386 partitions
@@ -1215,12 +1241,12 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite)
     {
         wxLogSysError(_("Impossible to set permissions for the file '%s'"),
                       file2.c_str());
-        return false;
+        return FALSE;
     }
 #endif // OS/2 || Mac
 #endif // __WXMSW__ && __WIN32__
 
-    return true;
+    return TRUE;
 }
 
 bool
@@ -1228,15 +1254,15 @@ wxRenameFile (const wxString& file1, const wxString& file2)
 {
   // Normal system call
   if ( wxRename (file1, file2) == 0 )
-    return true;
+    return TRUE;
 
   // Try to copy
   if (wxCopyFile(file1, file2)) {
     wxRemoveFile(file1);
-    return true;
+    return TRUE;
   }
   // Give up
-  return false;
+  return FALSE;
 }
 
 bool wxRemoveFile(const wxString& file)
@@ -1246,6 +1272,8 @@ bool wxRemoveFile(const wxString& file)
  || defined(__WATCOMC__) \
  || defined(__GNUWIN32__)
   int res = wxRemove(file);
+#elif defined(__WXMAC__)
+  int res = unlink(wxFNCONV(file));
 #else
   int res = unlink(OS_FILENAME(file));
 #endif
@@ -1256,7 +1284,7 @@ bool wxRemoveFile(const wxString& file)
 bool wxMkdir(const wxString& dir, int perm)
 {
 #if defined(__WXMAC__) && !defined(__UNIX__)
-  return (mkdir( dir , 0 ) == 0);
+  return (mkdir( wxFNCONV(dir) , 0 ) == 0);
 #else // !Mac
     const wxChar *dirname = dir.c_str();
 
@@ -1286,23 +1314,23 @@ bool wxMkdir(const wxString& dir, int perm)
     {
         wxLogSysError(_("Directory '%s' couldn't be created"), dirname);
 
-        return false;
+        return FALSE;
     }
 
-    return true;
+    return TRUE;
 #endif // Mac/!Mac
 }
 
 bool wxRmdir(const wxString& dir, int WXUNUSED(flags))
 {
 #ifdef __VMS__
-  return false; //to be changed since rmdir exists in VMS7.x
+  return FALSE; //to be changed since rmdir exists in VMS7.x
 #elif defined(__WXPM__)
   return (::DosDeleteDir((PSZ)dir.c_str()) == 0);
 #else
 
 #ifdef __SALFORDC__
-  return false; // What to do?
+  return FALSE; // What to do?
 #else
   return (wxRmDir(OS_FILENAME(dir)) == 0);
 #endif
@@ -1379,7 +1407,7 @@ wxString wxFindFirstFile(const wxChar *spec, int flags)
     wxSplitPath(spec, &gs_dirPath, NULL, NULL);
     if ( gs_dirPath.IsEmpty() )
         gs_dirPath = wxT(".");
-    if ( gs_dirPath.Last() != wxFILE_SEP_PATH )
+    if ( !wxEndsWithPathSeparator(gs_dirPath ) )
         gs_dirPath << wxFILE_SEP_PATH;
 
     if (gs_dir)
@@ -1438,17 +1466,17 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz)
         buf = new wxChar[sz + 1];
     }
 
-    bool ok = false;
+    bool ok = FALSE;
 
     // for the compilers which have Unicode version of _getcwd(), call it
     // directly, for the others call the ANSI version and do the translation
 #if !wxUSE_UNICODE
     #define cbuf buf
 #else // wxUSE_UNICODE
-    bool needsANSI = true;
+    bool needsANSI = TRUE;
 
     #if !defined(HAVE_WGETCWD) || wxUSE_UNICODE_MSLU
-        // This is not legal code as the compiler 
+        // This is not legal code as the compiler
         // is allowed destroy the wxCharBuffer.
         // wxCharBuffer c_buffer(sz);
         // char *cbuf = (char*)(const char*)c_buffer;
@@ -1459,18 +1487,18 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz)
         #if wxUSE_UNICODE_MSLU
             if ( wxGetOsVersion() != wxWIN95 )
         #else
-            char *cbuf = NULL; // never really used because needsANSI will always be false
+            char *cbuf = NULL; // never really used because needsANSI will always be FALSE
         #endif
             {
                 ok = _wgetcwd(buf, sz) != NULL;
-                needsANSI = false;
+                needsANSI = FALSE;
             }
     #endif
 
     if ( needsANSI )
 #endif // wxUSE_UNICODE
     {
-    #ifdef _MSC_VER
+    #if defined(_MSC_VER) || defined(__MINGW32__)
         ok = _getcwd(cbuf, sz) != NULL;
     #elif defined(__WXMAC__) && !defined(__DARWIN__)
         FSSpec cwdSpec ;
@@ -1488,15 +1516,12 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz)
             cwdSpec.parID = pb.ioFCBParID;
             cwdSpec.name[0] = 0 ;
             wxString res = wxMacFSSpec2MacFilename( &cwdSpec ) ;
-
-            strcpy( cbuf , res ) ;
-            cbuf[res.length()]=0 ;
-
-            ok = true;
+                       wxStrcpy( buf , res ) ;                 
+            ok = TRUE;
         }
         else
         {
-            ok = false;
+            ok = FALSE;
         }
     #elif defined(__VISAGECPP__) || (defined (__OS2__) && defined (__WATCOMC__))
         APIRET rc;
@@ -1509,7 +1534,7 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz)
         ok = getcwd(cbuf, sz) != NULL;
     #endif // platform
 
-    #if wxUSE_UNICODE
+    #if wxUSE_UNICODE && !defined(__WXMAC__)
         // finally convert the result to Unicode if needed
         wxConvFile.MB2WC(buf, cbuf, sz);
     #endif // wxUSE_UNICODE
@@ -1559,7 +1584,7 @@ wxString wxGetCwd()
     wxGetWorkingDirectory(buffer, _MAXPATHLEN);
     wxString str( buffer );
     delete [] buffer;
+
     return str;
 }
 
@@ -1620,11 +1645,11 @@ bool wxEndsWithPathSeparator(const wxChar *pszFileName)
     return len && wxIsPathSeparator(pszFileName[len - 1]);
 }
 
-// find a file in a list of directories, returns false if not found
+// find a file in a list of directories, returns FALSE if not found
 bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFile)
 {
     // we assume that it's not empty
-    wxCHECK_MSG( !wxIsEmpty(pszFile), false,
+    wxCHECK_MSG( !wxIsEmpty(pszFile), FALSE,
                  _T("empty file name in wxFindFileInPath"));
 
     // skip path separator in the beginning of the file name if present
@@ -1659,7 +1684,7 @@ bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFi
 
     delete [] szPath;
 
-    return pc != NULL;  // if true => we breaked from the loop
+    return pc != NULL;  // if TRUE => we breaked from the loop
 }
 
 void WXDLLEXPORT wxSplitPath(const wxChar *pszFileName,
@@ -1677,7 +1702,7 @@ time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename)
 {
     wxStructStat buf;
     wxStat( filename, &buf);
-    
+
     return buf.st_mtime;
 }
 
@@ -1690,18 +1715,18 @@ bool wxIsWild( const wxString& pattern )
 {
     wxString tmp = pattern;
     wxChar *pat = WXSTRINGCAST(tmp);
-    while (*pat) 
+    while (*pat)
     {
-        switch (*pat++) 
+        switch (*pat++)
         {
         case wxT('?'): case wxT('*'): case wxT('['): case wxT('{'):
-            return true;
+            return TRUE;
         case wxT('\\'):
             if (!*pat++)
-                return false;
+                return FALSE;
         }
     }
-    return false;
+    return FALSE;
 }
 
 /*
@@ -1717,7 +1742,7 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
                 /* Match if both are empty. */
                 return pat.empty();
         }
-        
+
         const wxChar *m = pat.c_str(),
         *n = text.c_str(),
         *ma = NULL,
@@ -1731,9 +1756,9 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
 
         if (dot_special && (*n == wxT('.')))
         {
-                /* Never match so that hidden Unix files 
+                /* Never match so that hidden Unix files
                  * are never found. */
-                return false;
+                return FALSE;
         }
 
         for (;;)
@@ -1750,7 +1775,7 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
                 {
                         m++;
                         if (!*n++)
-                        return false;
+                        return FALSE;
                 }
                 else
                 {
@@ -1759,7 +1784,7 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
                                 m++;
                                 /* Quoting "nothing" is a bad thing */
                                 if (!*m)
-                                return false;
+                                return FALSE;
                         }
                         if (!*m)
                         {
@@ -1769,9 +1794,9 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
                                 * match
                                 */
                                 if (!*n)
-                                return true;
+                                return TRUE;
                                 if (just)
-                                return true;
+                                return TRUE;
                                 just = 0;
                                 goto not_matched;
                         }
@@ -1803,7 +1828,7 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
                                 * impossible to match it
                                 */
                                 if (!*n)
-                                return false;
+                                return FALSE;
                                 if (mp)
                                 {
                                         m = mp;
@@ -1825,7 +1850,7 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
                                         count = acount;
                                 }
                                 else
-                                return false;
+                                return FALSE;
                         }
                 }
         }