]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filefn.cpp
MIME support
[wxWidgets.git] / src / common / filefn.cpp
index c36a08b281125e9dd3af78ee35a3db7cfbcfc94d..e90945a6766794d2bc56a3a2f538c521b817bb84 100644 (file)
@@ -785,7 +785,7 @@ wxMac2UnixFilename (char *s)
                         if (*s == ':')
                           *s = '/';
                         else
-                          *s = wxToLower (*s);        // Case INDEPENDENT
+                          *s = tolower(*s);        // Case INDEPENDENT
                         s++;
                 }
         }
@@ -830,7 +830,7 @@ wxDos2UnixFilename (char *s)
           *s = '/';
 #ifdef __WXMSW__
         else
-          *s = wxToLower (*s);        // Case INDEPENDENT
+          *s = tolower(*s);        // Case INDEPENDENT
 #endif
         s++;
       }
@@ -980,21 +980,30 @@ bool wxRemoveFile(const wxString& file)
   return (flag == 0) ;
 }
 
-bool wxMkdir(const wxString& dir)
+bool wxMkdir(const wxString& dir, int perm)
 {
-#if defined(__WXSTUBS__)
-  return FALSE;
-#elif defined(__VMS__)
+#if defined( __WXMAC__ )
+    strcpy( gwxMacFileName , dir ) ;
+    wxUnix2MacFilename( gwxMacFileName ) ;
+    const char *dirname = gwxMacFileName;
+#else // !Mac
+    const char *dirname = dir.c_str();
+#endif // Mac/!Mac
+
+    // assume mkdir() has 2 args on non Windows platforms and on Windows too
+    // for the GNU compiler
+#if !defined(__WXMSW__) || (defined(__GNUWIN32__) && !defined(__MINGW32__))
+    if ( mkdir(dirname, perm) != 0 )
+#else  // MSW
+    if ( mkdir(dirname) != 0 )
+#endif // !MSW/MSW
+    {
+        wxLogSysError(_("Directory '%s' couldn't be created"), dirname);
+
         return FALSE;
-#elif defined( __WXMAC__ )
-  strcpy( gwxMacFileName , dir ) ;
-  wxUnix2MacFilename( gwxMacFileName ) ;
-  return (mkdir(gwxMacFileName , 0 ) == 0);
-#elif (defined(__GNUWIN32__) && !defined(__MINGW32__)) || !defined(__WXMSW__)
-  return (mkdir (WXSTRINGCAST dir, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == 0);
-#else
-  return (mkdir(WXSTRINGCAST dir) == 0);
-#endif
+    }
+
+    return TRUE;
 }
 
 bool wxRmdir(const wxString& dir, int WXUNUSED(flags))
@@ -1279,9 +1288,6 @@ wxString wxFindFirstFile(const char *spec, int flags)
 
     if ( gs_hFileStruct == INVALID_HANDLE_VALUE )
     {
-        wxLogSysError(_("Can not enumerate files in directory '%s'"),
-                      path.c_str());
-
         result.Empty();
 
         return result;
@@ -1532,40 +1538,55 @@ void WXDLLEXPORT wxSplitPath(const char *pszFileName,
                              wxString *pstrName,
                              wxString *pstrExt)
 {
-  wxCHECK_RET( pszFileName, "NULL file name in wxSplitPath" );
+    // it can be empty, but it shouldn't be NULL
+    wxCHECK_RET( pszFileName, "NULL file name in wxSplitPath" );
 
-  const char *pDot = strrchr(pszFileName, wxFILE_SEP_EXT);
-  const char *pSepUnix = strrchr(pszFileName, wxFILE_SEP_PATH_UNIX);
-  const char *pSepDos = strrchr(pszFileName, wxFILE_SEP_PATH_DOS);
+    const char *pDot = strrchr(pszFileName, wxFILE_SEP_EXT);
 
-  // take the last of the two: nPosUnix containts the last slash in the
-  // filename
-  size_t nPosUnix = pSepUnix ? pSepUnix - pszFileName : 0;
-  size_t nPosDos = pSepDos ? pSepDos - pszFileName : 0;
-  if ( nPosDos > nPosUnix )
-    nPosUnix = nPosDos;
-
-  if ( pstrPath )
-    *pstrPath = wxString(pszFileName, nPosUnix);
+#ifdef __WXMSW__
+    // under Windows we understand both separators
+    const char *pSepUnix = strrchr(pszFileName, wxFILE_SEP_PATH_UNIX);
+    const char *pSepDos = strrchr(pszFileName, wxFILE_SEP_PATH_DOS);
+    const char *pLastSeparator = pSepUnix > pSepDos ? pSepUnix : pSepDos;
+#else // assume Unix
+    const char *pLastSeparator = strrchr(pszFileName, wxFILE_SEP_PATH_UNIX);
+
+    if ( pDot == pszFileName )
+    {
+        // under Unix files like .profile are treated in a special way
+        pDot = NULL;
+    }
+#endif // MSW/Unix
+    
+    if ( pDot < pLastSeparator )
+    {
+        // the dot is part of the path, not the start of the extension
+        pDot = NULL;
+    }
 
-  size_t nPosDot = 0;
-  if ( pDot )
-    nPosDot = pDot - pszFileName;
+    if ( pstrPath )
+    {
+        if ( pLastSeparator )    
+            *pstrPath = wxString(pszFileName, pLastSeparator - pszFileName);
+        else
+            pstrPath->Empty();
+    }
 
-  if ( nPosDot > nPosUnix ) {
-    // the file name looks like "path/name.ext"
-    if ( pstrName )
-      *pstrName = wxString(pszFileName + nPosUnix + 1, nPosDot - nPosUnix - 1);
-    if ( pstrExt )
-      *pstrExt = wxString(pszFileName + nPosDot + 1);
-  }
-  else {
-    // there is either no dot at all or there is a '/' after it
     if ( pstrName )
-      *pstrName = wxString(pszFileName + nPosUnix + 1);
+    {
+        const char *start = pLastSeparator ? pLastSeparator + 1 : pszFileName;
+        const char *end = pDot ? pDot : pszFileName + strlen(pszFileName);
+
+        *pstrName = wxString(start, end - start);
+    }
+
     if ( pstrExt )
-      pstrExt->Empty();
-  }
+    {
+        if ( pDot )
+            *pstrExt = wxString(pDot + 1);
+        else
+            pstrExt->Empty();
+    }
 }
 
 //------------------------------------------------------------------------