]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filefn.cpp
Fixes for GNUPro 00r1
[wxWidgets.git] / src / common / filefn.cpp
index e1222863f6986c37c9226486e70f1657bc38ef66..79c63f4bade52bbc06c08b246cde8471097c3137 100644 (file)
     #endif
 #endif
 
     #endif
 #endif
 
+#if defined(__WXMAC__)
+  #include  "wx/mac/private.h"  // includes mac headers
+#endif
+
 #include <time.h>
 
 #ifndef __MWERKS__
 #include <time.h>
 
 #ifndef __MWERKS__
 #endif // __WINDOWS__
 #endif // native Win compiler
 
 #endif // __WINDOWS__
 #endif // native Win compiler
 
-#if defined(__DOS__) && defined(__WATCOMC__)
-    #include <direct.h>
-    #include <dos.h>
-    #include <io.h>
+#if defined(__DOS__)
+    #ifdef __WATCOMC__
+        #include <direct.h>
+        #include <dos.h>
+        #include <io.h>
+    #endif
+    #ifdef __DJGPP__
+        #include <unistd.h>
+    #endif
 #endif
 
 #ifdef __GNUWIN32__
 #endif
 
 #ifdef __GNUWIN32__
@@ -1197,7 +1206,16 @@ bool wxMkdir(const wxString& dir, int perm)
     if ( mkdir(wxFNCONV(dirname), perm) != 0 )
 #elif defined(__WXPM__)
     if (::DosCreateDir((PSZ)dirname, NULL) != 0) // enhance for EAB's??
     if ( mkdir(wxFNCONV(dirname), perm) != 0 )
 #elif defined(__WXPM__)
     if (::DosCreateDir((PSZ)dirname, NULL) != 0) // enhance for EAB's??
-#else  // !MSW and !OS/2 VAC++
+#elif defined(__DOS__)
+  #if defined(__WATCOMC__)
+    (void)perm;
+    if ( wxMkDir(wxFNSTRINGCAST wxFNCONV(dirname)) != 0 )
+  #elif defined(__DJGPP__)
+    if ( mkdir(wxFNCONV(dirname), perm) != 0 )
+  #else
+    #error "Unsupported DOS compiler!"
+  #endif
+#else  // !MSW, !DOS and !OS/2 VAC++
     (void)perm;
     if ( wxMkDir(wxFNSTRINGCAST wxFNCONV(dirname)) != 0 )
 #endif // !MSW/MSW
     (void)perm;
     if ( wxMkDir(wxFNSTRINGCAST wxFNCONV(dirname)) != 0 )
 #endif // !MSW/MSW
@@ -1290,436 +1308,6 @@ bool wxGetTempFileName(const wxString& prefix, wxString& buf)
 
 // Get first file name matching given wild card.
 
 
 // Get first file name matching given wild card.
 
-#if defined(__UNIX__)
-
-// Get first file name matching given wild card.
-// Flags are reserved for future use.
-
-#if !defined( __VMS__ ) || ( __VMS_VER >= 70000000 )
-    static DIR *gs_dirStream = (DIR *) NULL;
-    static wxString gs_strFileSpec;
-    static int gs_findFlags = 0;
-#endif
-
-wxString wxFindFirstFile(const wxChar *spec, int flags)
-{
-    wxString result;
-#ifdef __VMS
-   wxChar *specvms = NULL;
-#endif
-
-#if !defined( __VMS__ ) || ( __VMS_VER >= 70000000 )
-    if (gs_dirStream)
-        closedir(gs_dirStream); // edz 941103: better housekeping
-
-    gs_findFlags = flags;
-
-    gs_strFileSpec = spec;
-
-    // Find path only so we can concatenate
-    // found file onto path
-    wxString path(wxPathOnly(gs_strFileSpec));
-
-    // special case: path is really "/"
-    if ( !path && gs_strFileSpec[0u] == wxT('/') )
-#ifdef __VMS
-     {
-        wxStrcpy( specvms , wxT( "[000000]" ) );
-        gs_strFileSpec = specvms;
-        wxString path_vms(wxPathOnly(gs_strFileSpec));
-        path = path_vms;
-     }
-#else
-     path = wxT('/');
-#endif
-   // path is empty => Local directory
-    if ( !path )
-#ifdef __VMS
-     {
-        wxStrcpy( specvms , wxT( "[]" ) );
-        gs_strFileSpec = specvms;
-        wxString path_vms1(wxPathOnly(gs_strFileSpec));
-        path = path_vms1;
-     }
-#else
-     path = wxT('.');
-#endif
-
-    gs_dirStream = opendir(path.fn_str());
-    if ( !gs_dirStream )
-    {
-        wxLogSysError(_("Can not enumerate files in directory '%s'"),
-                      path.c_str());
-    }
-    else
-    {
-        result = wxFindNextFile();
-    }
-#endif // !VMS6.x or earlier
-
-    return result;
-}
-
-wxString wxFindNextFile()
-{
-    wxString result;
-
-#if !defined( __VMS__ ) || ( __VMS_VER >= 70000000 )
-    wxCHECK_MSG( gs_dirStream, result, wxT("must call wxFindFirstFile first") );
-
-    // Find path only so we can concatenate
-    // found file onto path
-    wxString path(wxPathOnly(gs_strFileSpec));
-    wxString name(wxFileNameFromPath(gs_strFileSpec));
-
-    /* MATTHEW: special case: path is really "/" */
-    if ( !path && gs_strFileSpec[0u] == wxT('/'))
-        path = wxT('/');
-
-    // Do the reading
-    struct dirent *nextDir;
-    for ( nextDir = readdir(gs_dirStream);
-          nextDir != NULL;
-          nextDir = readdir(gs_dirStream) )
-    {
-        if (wxMatchWild(name, nextDir->d_name, FALSE) &&   // RR: added FALSE to find hidden files
-        strcmp(nextDir->d_name, ".") &&
-        strcmp(nextDir->d_name, "..") )
-        {
-            result.Empty();
-            if ( !path.IsEmpty() )
-            {
-                result = path;
-                if ( path != wxT('/') )
-                    result += wxT('/');
-            }
-
-            result += nextDir->d_name;
-
-            // Only return "." and ".." when they match
-            bool isdir;
-            if ( (strcmp(nextDir->d_name, ".") == 0) ||
-                 (strcmp(nextDir->d_name, "..") == 0))
-            {
-                if ( (gs_findFlags & wxDIR) != 0 )
-                    isdir = TRUE;
-                else
-                    continue;
-            }
-            else
-                isdir = wxDirExists(result);
-
-            // and only return directories when flags & wxDIR
-            if ( !gs_findFlags ||
-                 ((gs_findFlags & wxDIR) && isdir) ||
-                 ((gs_findFlags & wxFILE) && !isdir) )
-            {
-                return result;
-            }
-        }
-    }
-
-    result.Empty(); // not found
-
-    closedir(gs_dirStream);
-    gs_dirStream = (DIR *) NULL;
-#endif // !VMS6.2 or earlier
-
-    return result;
-}
-
-#elif defined(__WXMAC__)
-
-struct MacDirectoryIterator
-{
-    CInfoPBRec            m_CPB ;
-    wxInt16                m_index ;
-    long                m_dirId ;
-    Str255                m_name ;
-} ;
-
-static int g_iter_flags ;
-
-static MacDirectoryIterator g_iter ;
-wxString g_iter_spec ;
-
-wxString wxFindFirstFile(const wxChar *spec, int flags)
-{
-    wxString result;
-
-    g_iter_spec = spec ;
-    g_iter_spec.MakeUpper() ;
-    g_iter_flags = flags; /* MATTHEW: [5] Remember flags */
-
-    // Find path only so we can concatenate found file onto path
-    wxString path(wxPathOnly(spec));
-    FSSpec fsspec ;
-
-    wxMacFilename2FSSpec( path , &fsspec ) ;
-    g_iter.m_CPB.hFileInfo.ioVRefNum = fsspec.vRefNum ;
-    g_iter.m_CPB.hFileInfo.ioNamePtr = g_iter.m_name ;
-    g_iter.m_index = 0 ;
-
-    Boolean isDir ;
-    FSpGetDirectoryID( &fsspec , &g_iter.m_dirId , &isDir ) ;
-    if ( !isDir )
-        return wxEmptyString ;
-
-    return wxFindNextFile( ) ;
-}
-
-wxString wxFindNextFile()
-{
-    wxString result;
-
-    short err = noErr ;
-    wxString name ;
-    
-    while(1)
-    {
-      while ( err == noErr )
-      {
-          g_iter.m_index++ ;
-          g_iter.m_CPB.dirInfo.ioFDirIndex = g_iter.m_index;
-          g_iter.m_CPB.dirInfo.ioDrDirID = g_iter.m_dirId;    /* we need to do this every time */
-          err = PBGetCatInfoSync((CInfoPBPtr)&g_iter.m_CPB);
-          if ( err != noErr )
-              break ;
-
-          if ( ( g_iter.m_CPB.dirInfo.ioFlAttrib & ioDirMask) != 0 && (g_iter_flags & wxDIR) ) //  we have a directory
-              break ;
-
-          if ( ( g_iter.m_CPB.dirInfo.ioFlAttrib & ioDirMask) == 0 && !(g_iter_flags & wxFILE ) )
-              continue ;
-
-          // hit !
-          break ;
-      }
-      if ( err != noErr )
-      {
-          return wxEmptyString ;
-      }
-      FSSpec spec ;
-
-      FSMakeFSSpecCompat(g_iter.m_CPB.hFileInfo.ioVRefNum,
-                                     g_iter.m_dirId,
-                                     g_iter.m_name,
-                                     &spec) ;
-
-      wxString name = wxMacFSSpec2MacFilename( &spec ) ;
-      if ( g_iter_spec.Right(4)==(":*.*") || g_iter_spec.Right(2)==(":*") || name.Upper().Matches(g_iter_spec) )
-        return name ;
-    }
-    return wxEmptyString ;
-}
-
-#elif defined(__WXMSW__)
-
-#ifdef __WIN32__
-    static HANDLE gs_hFileStruct = INVALID_HANDLE_VALUE;
-    static WIN32_FIND_DATA gs_findDataStruct;
-#else // Win16
-    #ifdef __BORLANDC__
-        static struct ffblk gs_findDataStruct;
-    #else
-        static struct _find_t gs_findDataStruct;
-    #endif // Borland
-#endif // Win32/16
-
-static wxString gs_strFileSpec;
-static int gs_findFlags = 0;
-
-wxString wxFindFirstFile(const wxChar *spec, int flags)
-{
-    wxString result;
-
-    gs_strFileSpec = spec;
-    gs_findFlags = flags; /* MATTHEW: [5] Remember flags */
-
-    // Find path only so we can concatenate found file onto path
-    wxString path(wxPathOnly(gs_strFileSpec));
-    if ( !path.IsEmpty() )
-        result << path << wxT('\\');
-
-#ifdef __WIN32__
-    if ( gs_hFileStruct != INVALID_HANDLE_VALUE )
-        FindClose(gs_hFileStruct);
-
-    gs_hFileStruct = ::FindFirstFile(WXSTRINGCAST spec, &gs_findDataStruct);
-
-    if ( gs_hFileStruct == INVALID_HANDLE_VALUE )
-    {
-        result.Empty();
-
-        return result;
-    }
-
-    bool isdir = !!(gs_findDataStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
-
-    if (isdir && !(flags & wxDIR))
-        return wxFindNextFile();
-    else if (!isdir && flags && !(flags & wxFILE))
-        return wxFindNextFile();
-
-    result += gs_findDataStruct.cFileName;
-
-    return result;
-#else // !Win32
-    int flag = _A_NORMAL;
-    if (flags & wxDIR)
-        flag = _A_SUBDIR;
-
-#ifdef __BORLANDC__
-    if (findfirst(WXSTRINGCAST spec, &gs_findDataStruct, flag) == 0)
-#else
-        if (_dos_findfirst(WXSTRINGCAST spec, flag, &gs_findDataStruct) == 0)
-#endif
-        {
-            char attrib;
-
-#ifdef __BORLANDC__
-            attrib = gs_findDataStruct.ff_attrib;
-#else
-            attrib = gs_findDataStruct.attrib;
-#endif
-
-            if (attrib & _A_SUBDIR) {
-                if (!(gs_findFlags & wxDIR))
-                    return wxFindNextFile();
-            } else if (gs_findFlags && !(gs_findFlags & wxFILE))
-                return wxFindNextFile();
-
-            result +=
-#ifdef __BORLANDC__
-                    gs_findDataStruct.ff_name
-#else
-                    gs_findDataStruct.name
-#endif
-                    ;
-        }
-
-    return result;
-#endif // __WIN32__
-}
-
-
-wxString wxFindNextFile()
-{
-    wxString result;
-
-    // Find path only so we can concatenate found file onto path
-    wxString path(wxPathOnly(gs_strFileSpec));
-
-try_again:
-
-#ifdef __WIN32__
-    if (gs_hFileStruct == INVALID_HANDLE_VALUE)
-        return result;
-
-    bool success = (FindNextFile(gs_hFileStruct, &gs_findDataStruct) != 0);
-    if (!success)
-    {
-        FindClose(gs_hFileStruct);
-        gs_hFileStruct = INVALID_HANDLE_VALUE;
-    }
-    else
-    {
-        bool isdir = !!(gs_findDataStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
-
-        if (isdir && !(gs_findFlags & wxDIR))
-            goto try_again;
-        else if (!isdir && gs_findFlags && !(gs_findFlags & wxFILE))
-            goto try_again;
-
-        if ( !path.IsEmpty() )
-            result << path << wxT('\\');
-        result << gs_findDataStruct.cFileName;
-    }
-
-    return result;
-#else // Win16
-
-#ifdef __BORLANDC__
-    if (findnext(&gs_findDataStruct) == 0)
-#else
-        if (_dos_findnext(&gs_findDataStruct) == 0)
-#endif
-        {
-            /* MATTHEW: [5] Check directory flag */
-            char attrib;
-
-#ifdef __BORLANDC__
-            attrib = gs_findDataStruct.ff_attrib;
-#else
-            attrib = gs_findDataStruct.attrib;
-#endif
-
-            if (attrib & _A_SUBDIR) {
-                if (!(gs_findFlags & wxDIR))
-                    goto try_again;
-            } else if (gs_findFlags && !(gs_findFlags & wxFILE))
-                goto try_again;
-
-
-            result +=
-#ifdef __BORLANDC__
-                      gs_findDataStruct.ff_name
-#else
-                      gs_findDataStruct.name
-#endif
-                      ;
-        }
-
-    return result;
-#endif // Win32/16
-}
-
-#elif defined(__WXPM__)
-
-wxString wxFindFirstFile(const wxChar *spec, int flags)
-{
-    wxString result;
-
-    /*
-    // TODO: figure something out here for OS/2
-    gs_strFileSpec = spec;
-    gs_findFlags = flags;
-
-    // Find path only so we can concatenate found file onto path
-    wxString path(wxPathOnly(gs_strFileSpec));
-    if ( !path.IsEmpty() )
-        result << path << wxT('\\');
-
-    int flag = _A_NORMAL;
-    if (flags & wxDIR)
-        flag = _A_SUBDIR;
-
-    if (_dos_findfirst(WXSTRINGCAST spec, flag, &gs_findDataStruct) == 0)
-    {
-        char attrib;
-        attrib = gs_findDataStruct.attrib;
-
-        if (attrib & _A_SUBDIR) {
-            if (!(gs_findFlags & wxDIR))
-                return wxFindNextFile();
-        } else if (gs_findFlags && !(gs_findFlags & wxFILE))
-            return wxFindNextFile();
-
-        result += gs_findDataStruct.name;
-    }
-    */
-    return result;
-}
-
-wxString wxFindNextFile()
-{
-    wxString result;
-    // TODO:
-    return result;
-}
-
-#else // generic implementation:
-
 static wxDir *gs_dir = NULL;
 static wxString gs_dirPath;
 
 static wxDir *gs_dir = NULL;
 static wxString gs_dirPath;
 
@@ -1752,7 +1340,10 @@ wxString wxFindFirstFile(const wxChar *spec, int flags)
     wxString result;
     gs_dir->GetFirst(&result, wxFileNameFromPath(spec), dirFlags);
     if ( result.IsEmpty() )
     wxString result;
     gs_dir->GetFirst(&result, wxFileNameFromPath(spec), dirFlags);
     if ( result.IsEmpty() )
+    {
         wxDELETE(gs_dir);
         wxDELETE(gs_dir);
+        return result;
+    }
 
     return gs_dirPath + result;
 }
 
     return gs_dirPath + result;
 }
@@ -1765,12 +1356,14 @@ wxString wxFindNextFile()
     gs_dir->GetNext(&result);
     
     if ( result.IsEmpty() )
     gs_dir->GetNext(&result);
     
     if ( result.IsEmpty() )
+    {
         wxDELETE(gs_dir);
         wxDELETE(gs_dir);
+        return result;
+    }
     
     return gs_dirPath + result;
 }
 
     
     return gs_dirPath + result;
 }
 
-#endif // Unix/Windows/OS/2
 
 // Get current working directory.
 // If buf is NULL, allocates space using new, else
 
 // Get current working directory.
 // If buf is NULL, allocates space using new, else
@@ -1856,6 +1449,14 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz)
     delete [] cbuf;
   }
 #endif
     delete [] cbuf;
   }
 #endif
+
+#ifdef __DJGPP__
+  // VS: DJGPP is a strange mix of DOS and UNIX API and returns paths with 
+  //     / deliminers. We don't like that.
+  for (wxChar *ch = buf; *ch; ch++)
+    if (*ch == wxT('/')) *ch = wxT('\\');
+#endif
+
   return buf;
 }
 
   return buf;
 }
 
@@ -1922,11 +1523,9 @@ wxString wxGetOSDirectory()
 
 bool wxEndsWithPathSeparator(const wxChar *pszFileName)
 {
 
 bool wxEndsWithPathSeparator(const wxChar *pszFileName)
 {
-  size_t len = wxStrlen(pszFileName);
-  if ( len == 0 )
-    return FALSE;
-  else
-    return wxIsPathSeparator(pszFileName[len - 1]);
+    size_t len = wxStrlen(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
@@ -2167,3 +1766,28 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
 #ifdef __VISUALC__
     #pragma warning(default:4706)   // assignment within conditional expression
 #endif // VC++
 #ifdef __VISUALC__
     #pragma warning(default:4706)   // assignment within conditional expression
 #endif // VC++
+
+//------------------------------------------------------------------------
+// Missing functions in Unicode for Win9x
+//------------------------------------------------------------------------
+
+// NB: MSLU only covers Win32 API, it doesn't provide Unicode implementation of
+//     libc functions. Unfortunately, some of MSVCRT wchar_t functions
+//     (e.g. _wopen) don't work on Windows 9x, so we have to workaround it
+//     by calling the char version. We still want to use wchar_t version on
+//     NT/2000/XP, though, because they allow for Unicode file names.
+#if wxUSE_UNICODE_MSLU
+
+    #if defined( __VISUALC__ ) \
+        || ( defined(__MINGW32__) && wxCHECK_W32API_VERSION( 0, 5 ) ) \
+        || ( defined(__MWERKS__) && defined(__WXMSW__) )
+    WXDLLEXPORT int wxOpen(const wxChar *name, int flags, int mode)
+    {
+        if ( wxGetOsVersion() == wxWINDOWS_NT )
+            return _wopen(name, flags, mode);
+        else
+            return _open(wxConvFile.cWX2MB(name), flags, mode);
+    }
+    #endif
+
+#endif // wxUSE_UNICODE_MSLU