]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filefn.cpp
added wxMGL+DOS+Watcom makefiles
[wxWidgets.git] / src / common / filefn.cpp
index fa8481d84eecb058ac0385ca77d20797b1e7aa7a..6c359eba15ad33243606c31b080f0f232b21d1f3 100644 (file)
@@ -69,7 +69,7 @@
     #include <process.h>
     #include "wx/os2/private.h"
 #endif
     #include <process.h>
     #include "wx/os2/private.h"
 #endif
-#ifdef __WINDOWS__
+#if defined(__WINDOWS__) && !defined(__WXMICROWIN__)
 #if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__)
     #include <direct.h>
     #include <dos.h>
 #if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__)
     #include <direct.h>
     #include <dos.h>
 #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>
+#endif
+
 #ifdef __GNUWIN32__
     #include <wchar.h>
     #ifndef __TWIN32__
 #ifdef __GNUWIN32__
     #include <wchar.h>
     #ifndef __TWIN32__
@@ -272,7 +278,7 @@ wxString wxPathList::FindAbsoluteValidPath (const wxString& file)
 bool
 wxFileExists (const wxString& filename)
 {
 bool
 wxFileExists (const wxString& filename)
 {
-#ifdef __WINDOWS__
+#if defined(__WINDOWS__) && !defined(__WXMICROWIN__)
     // GetFileAttributes can copy with network paths
     DWORD ret = GetFileAttributes(filename);
     DWORD isDir = (ret & FILE_ATTRIBUTE_DIRECTORY);
     // GetFileAttributes can copy with network paths
     DWORD ret = GetFileAttributes(filename);
     DWORD isDir = (ret & FILE_ATTRIBUTE_DIRECTORY);
@@ -845,100 +851,121 @@ wxString wxPathOnly (const wxString& path)
 #if defined(__WXMAC__)
 wxString wxMacFSSpec2MacFilename( const FSSpec *spec )
 {
 #if defined(__WXMAC__)
 wxString wxMacFSSpec2MacFilename( const FSSpec *spec )
 {
+#ifdef __DARWIN__
+    FSRef theRef;
+    char  thePath[FILENAME_MAX];
+
+    // convert the FSSpec to an FSRef
+    (void) FSpMakeFSRef( spec, &theRef );
+    // get the POSIX path associated with the FSRef
+    (void) FSRefMakePath( &theRef, (UInt8 *)thePath, sizeof(thePath) );
+    
+    // create path string for return value
+    wxString result( thePath ) ;
+#else
     Handle    myPath ;
     short     length ;
 
     Handle    myPath ;
     short     length ;
 
+    // get length of path and allocate handle
     FSpGetFullPath( spec , &length , &myPath ) ;
     ::SetHandleSize( myPath , length + 1 ) ;
     ::HLock( myPath ) ;
     (*myPath)[length] = 0 ;
     FSpGetFullPath( spec , &length , &myPath ) ;
     ::SetHandleSize( myPath , length + 1 ) ;
     ::HLock( myPath ) ;
     (*myPath)[length] = 0 ;
-    if ( length > 0 && (*myPath)[length-1] ==':' )
+    if ((length > 0) && ((*myPath)[length-1] == ':'))
         (*myPath)[length-1] = 0 ;
         (*myPath)[length-1] = 0 ;
-
-#ifdef __DARWIN__
-    wxString result( wxMac2UnixFilename((char*) *myPath) ) ;
-#else
+    
+    // create path string for return value
     wxString result( (char*) *myPath ) ;
     wxString result( (char*) *myPath ) ;
-#endif
+
+    // free allocated handle
     ::HUnlock( myPath ) ;
     ::DisposeHandle( myPath ) ;
     ::HUnlock( myPath ) ;
     ::DisposeHandle( myPath ) ;
+#endif
+
     return result ;
 }
 
 void wxMacFilename2FSSpec( const char *path , FSSpec *spec )
 {
 #ifdef __DARWIN__
     return result ;
 }
 
 void wxMacFilename2FSSpec( const char *path , FSSpec *spec )
 {
 #ifdef __DARWIN__
-    const char *s = wxUnix2MacFilename(path);
-    FSpLocationFromFullPath( strlen(s) , s , spec ) ;
+    FSRef theRef;
+
+    // get the FSRef associated with the POSIX path
+    (void) FSPathMakeRef((const UInt8 *) path, &theRef, NULL);
+    // convert the FSRef to an FSSpec
+    (void) FSGetCatalogInfo(&theRef, kFSCatInfoNone, NULL, NULL, spec, NULL);
 #else
     FSpLocationFromFullPath( strlen(path) , path , spec ) ;
 #endif
 }
 
 #else
     FSpLocationFromFullPath( strlen(path) , path , spec ) ;
 #endif
 }
 
+#ifndef __DARWIN__
+// Mac file names are POSIX (Unix style) under Darwin
+// therefore the conversion functions below are not needed
+
 static char sMacFileNameConversion[ 1000 ] ;
 
 wxString wxMac2UnixFilename (const char *str)
 {
     char *s = sMacFileNameConversion ;
     strcpy( s , str ) ;
 static char sMacFileNameConversion[ 1000 ] ;
 
 wxString wxMac2UnixFilename (const char *str)
 {
     char *s = sMacFileNameConversion ;
     strcpy( s , str ) ;
-  if (s)
-  {
-    memmove( s+1 , s ,strlen( s ) + 1) ;
-    if ( *s == ':' )
+    if (s)
+    {
+        memmove( s+1 , s ,strlen( s ) + 1) ;
+        if ( *s == ':' )
             *s = '.' ;
             *s = '.' ;
-    else
+        else
             *s = '/' ;
             *s = '/' ;
-
-    while (*s)
-    {
+        
+        while (*s)
+        {
             if (*s == ':')
             if (*s == ':')
-              *s = '/';
+                *s = '/';
             else
             else
-              *s = wxTolower (*s);        // Case INDEPENDENT
+                *s = wxTolower(*s);        // Case INDEPENDENT
             s++;
             s++;
+        }
     }
     }
-  }
-  return wxString (sMacFileNameConversion) ;
+    return wxString(sMacFileNameConversion) ;
 }
 
 wxString wxUnix2MacFilename (const char *str)
 {
     char *s = sMacFileNameConversion ;
     strcpy( s , str ) ;
 }
 
 wxString wxUnix2MacFilename (const char *str)
 {
     char *s = sMacFileNameConversion ;
     strcpy( 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 ) ) ;
-    }
-    else if ( *s == '/' )
+    if (s)
     {
     {
-      // absolute path -> on mac just start with the drive name
-      memmove( s , s+1 ,strlen( s ) ) ;
-    }
-    else
-    {
-      wxASSERT_MSG( 1 , "unkown path beginning" ) ;
-    }
-    while (*s)
-    {
-      if (*s == '/' || *s == '\\')
-      {
-          // convert any back-directory situations
-          if ( *(s+1) == '.' && *(s+2) == '.' && ( (*(s+3) == '/' || *(s+3) == '\\') ) )
-          {
-          *s = ':';
-                memmove( s+1 , s+3 ,strlen( s+3 ) + 1 ) ;
-          }
-          else
-          *s = ':';
-      }
-
-      s++ ;
+        if ( *s == '.' )
+        {
+            // relative path , since it goes on with slash which is translated to a :
+            memmove( s , s+1 ,strlen( s ) ) ;
+        }
+        else if ( *s == '/' )
+        {
+            // absolute path -> on mac just start with the drive name
+            memmove( s , s+1 ,strlen( s ) ) ;
+        }
+        else
+        {
+            wxASSERT_MSG( 1 , "unkown path beginning" ) ;
+        }
+        while (*s)
+        {
+            if (*s == '/' || *s == '\\')
+            {
+                // convert any back-directory situations
+                if ( *(s+1) == '.' && *(s+2) == '.' && ( (*(s+3) == '/' || *(s+3) == '\\') ) )
+                {
+                    *s = ':';
+                    memmove( s+1 , s+3 ,strlen( s+3 ) + 1 ) ;
+                }
+                else
+                    *s = ':';
+            }
+            s++ ;
+        }
     }
     }
-  }
-  return wxString (sMacFileNameConversion) ;
+    return wxString (sMacFileNameConversion) ;
 }
 
 wxString wxMacFSSpec2UnixFilename( const FSSpec *spec )
 }
 
 wxString wxMacFSSpec2UnixFilename( const FSSpec *spec )
@@ -951,6 +978,7 @@ void wxUnixFilename2FSSpec( const char *path , FSSpec *spec )
     wxString var = wxUnix2MacFilename( path ) ;
     wxMacFilename2FSSpec( var , spec ) ;
 }
     wxString var = wxUnix2MacFilename( path ) ;
     wxMacFilename2FSSpec( var , spec ) ;
 }
+#endif // ! __DARWIN__
 
 #endif // __WXMAC__
 
 
 #endif // __WXMAC__
 
@@ -1164,7 +1192,7 @@ bool wxMkdir(const wxString& dir, int perm)
 
     // assume mkdir() has 2 args on non Windows-OS/2 platforms and on Windows too
     // for the GNU compiler
 
     // assume mkdir() has 2 args on non Windows-OS/2 platforms and on Windows too
     // for the GNU compiler
-#if (!(defined(__WXMSW__) || defined(__WXPM__))) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) || defined(__WXWINE__) || defined(__WXMICROWIN__)
+#if (!(defined(__WXMSW__) || defined(__WXPM__) || defined(__DOS__))) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) || defined(__WXWINE__) || defined(__WXMICROWIN__)
     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??
@@ -1217,7 +1245,7 @@ bool wxPathExists(const wxChar *pszPathName)
     }
 #endif // __WINDOWS__
 
     }
 #endif // __WINDOWS__
 
-#ifdef __WINDOWS__
+#if defined(__WINDOWS__) && !defined(__WXMICROWIN__)
     // Stat can't cope with network paths
     DWORD ret = GetFileAttributes(strPath.c_str());
     DWORD isDir = (ret & FILE_ATTRIBUTE_DIRECTORY);
     // Stat can't cope with network paths
     DWORD ret = GetFileAttributes(strPath.c_str());
     DWORD isDir = (ret & FILE_ATTRIBUTE_DIRECTORY);
@@ -1240,64 +1268,28 @@ bool wxPathExists(const wxChar *pszPathName)
 // Get a temporary filename, opening and closing the file.
 wxChar *wxGetTempFileName(const wxString& prefix, wxChar *buf)
 {
 // Get a temporary filename, opening and closing the file.
 wxChar *wxGetTempFileName(const wxString& prefix, wxChar *buf)
 {
-#if defined(__WINDOWS__) && !defined(__WXMICROWIN__)
-
-#ifndef        __WIN32__
-  wxChar tmp[144];
-  ::GetTempFileName(0, WXSTRINGCAST prefix, 0, tmp);
-#else
-  wxChar tmp[MAX_PATH];
-  wxChar tmpPath[MAX_PATH];
-  ::GetTempPath(MAX_PATH, tmpPath);
-  ::GetTempFileName(tmpPath, WXSTRINGCAST prefix, 0, tmp);
-#endif
-  if (buf) wxStrcpy(buf, tmp);
-  else buf = copystring(tmp);
-  return buf;
+    wxString filename = wxFileName::CreateTempFileName(prefix);
+    if ( filename.empty() )
+        return NULL;
 
 
-#else
-  static short last_temp = 0;        // cache last to speed things a bit
-  // At most 1000 temp files to a process! We use a ring count.
-  wxChar tmp[100]; // FIXME static buffer
+    if ( buf )
+        wxStrcpy(buf, filename);
+    else
+        buf = copystring(filename);
 
 
-  for (short suffix = last_temp + 1; suffix != last_temp; ++suffix %= 1000)
-    {
-      wxSprintf (tmp, wxT("/tmp/%s%d.%03x"), WXSTRINGCAST prefix, (int) getpid (), (int) suffix);
-      if (!wxFileExists( tmp ))
-        {
-          // Touch the file to create it (reserve name)
-          FILE *fd = fopen (wxFNCONV(tmp), "w");
-          if (fd)
-            fclose (fd);
-          last_temp = suffix;
-          if (buf)
-            wxStrcpy( buf, tmp);
-          else
-            buf = copystring( tmp );
-          return buf;
-        }
-    }
-  wxLogError( _("wxWindows: error finding temporary file name.\n") );
-  if (buf) buf[0] = 0;
-  return (wxChar *) NULL;
-#endif
+    return buf;
 }
 
 bool wxGetTempFileName(const wxString& prefix, wxString& buf)
 {
 }
 
 bool wxGetTempFileName(const wxString& prefix, wxString& buf)
 {
-    wxChar buf2[512];
-    if (wxGetTempFileName(prefix, buf2) != (wxChar*) NULL)
-    {
-        buf = buf2;
-        return TRUE;
-    }
-    else
-        return FALSE;
+    buf = wxFileName::CreateTempFileName(prefix);
+
+    return !buf.empty();
 }
 
 // Get first file name matching given wild card.
 
 }
 
 // Get first file name matching given wild card.
 
-#if defined(__UNIX__) && !defined(__WXMAC__)
+#if defined(__UNIX__)
 
 // Get first file name matching given wild card.
 // Flags are reserved for future use.
 
 // Get first file name matching given wild card.
 // Flags are reserved for future use.
@@ -1448,21 +1440,21 @@ struct MacDirectoryIterator
 static int g_iter_flags ;
 
 static MacDirectoryIterator g_iter ;
 static int g_iter_flags ;
 
 static MacDirectoryIterator g_iter ;
+wxString g_iter_spec ;
 
 wxString wxFindFirstFile(const wxChar *spec, int flags)
 {
     wxString result;
 
 
 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));
     g_iter_flags = flags; /* MATTHEW: [5] Remember flags */
 
     // Find path only so we can concatenate found file onto path
     wxString path(wxPathOnly(spec));
-    if ( !path.IsEmpty() )
-        result << path << wxT('\\');
-
     FSSpec fsspec ;
 
     FSSpec fsspec ;
 
-    wxMacFilename2FSSpec( result , &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 ;
     g_iter.m_CPB.hFileInfo.ioVRefNum = fsspec.vRefNum ;
     g_iter.m_CPB.hFileInfo.ioNamePtr = g_iter.m_name ;
     g_iter.m_index = 0 ;
@@ -1480,37 +1472,44 @@ wxString wxFindNextFile()
     wxString result;
 
     short err = noErr ;
     wxString result;
 
     short err = noErr ;
-
-    while ( err == noErr )
+    wxString name ;
+    
+    while(1)
     {
     {
-        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 ;
+      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 & wxDIR) ) //  we have a directory
+              break ;
 
 
-        if ( ( g_iter.m_CPB.dirInfo.ioFlAttrib & ioDirMask) == 0 && !(g_iter_flags & wxFILE ) )
-            continue ;
+          if ( ( g_iter.m_CPB.dirInfo.ioFlAttrib & ioDirMask) == 0 && !(g_iter_flags & wxFILE ) )
+              continue ;
 
 
-        // hit !
-        break ;
-    }
-    if ( err != noErr )
-    {
-        return wxEmptyString ;
-    }
-    FSSpec spec ;
+          // 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) ;
+      FSMakeFSSpecCompat(g_iter.m_CPB.hFileInfo.ioVRefNum,
+                                     g_iter.m_dirId,
+                                     g_iter.m_name,
+                                     &spec) ;
 
 
-    return wxMacFSSpec2MacFilename( &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__)
 }
 
 #elif defined(__WXMSW__)
@@ -1820,7 +1819,7 @@ wxString wxGetCwd()
 
 bool wxSetWorkingDirectory(const wxString& d)
 {
 
 bool wxSetWorkingDirectory(const wxString& d)
 {
-#if defined( __UNIX__ ) || defined( __WXMAC__ )
+#if defined(__UNIX__) || defined(__WXMAC__) || defined(__DOS__)
   return (chdir(wxFNSTRINGCAST d.fn_str()) == 0);
 #elif defined(__WXPM__)
   return (::DosSetCurrentDir((PSZ)d.c_str()) == 0);
   return (chdir(wxFNSTRINGCAST d.fn_str()) == 0);
 #elif defined(__WXPM__)
   return (::DosSetCurrentDir((PSZ)d.c_str()) == 0);