// 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 <process.h>
#include "wx/os2/private.h"
#endif
-#if defined(__WINDOWS__) && !defined(__WXMICROWIN__) && !defined(__WXWINE__)
+#if defined(__WINDOWS__) && !defined(__WXMICROWIN__)
#if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__)
#include <direct.h>
#include <dos.h>
#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__
#endif
#ifdef __WXMAC__
+# ifdef __DARWIN__
+# include "MoreFilesX.h"
+# else
# include "MoreFiles.h"
# include "MoreFilesExtras.h"
# include "FullPath.h"
# include "FSpCompat.h"
+# endif
#endif
// ----------------------------------------------------------------------------
// implementation
// ============================================================================
+#if defined(__WXMAC__) && !defined(__DARWIN__)
+
+WXDLLEXPORT int wxStat( const wxChar *file_name, wxStructStat *buf )
+{
+ return stat( wxMacStringToCString( file_name ), buf );
+}
+
+WXDLLEXPORT int wxAccess( const wxChar *pathname, int mode )
+{
+ return access( wxMacStringToCString( pathname ), mode );
+}
+
+WXDLLEXPORT int wxOpen( const wxChar *pathname, int flags, mode_t mode )
+{
+ return open( wxMacStringToCString( pathname ), flags, mode );
+}
+
+#endif
+
#ifdef wxNEED_WX_UNISTD_H
WXDLLEXPORT int wxStat( const wxChar *file_name, wxStructStat *buf )
IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList)
+static inline wxChar* MYcopystring(const wxString& s)
+{
+ wxChar* copy = new wxChar[s.length() + 1];
+ return wxStrcpy(copy, s.c_str());
+}
+
+static inline wxChar* MYcopystring(const wxChar* s)
+{
+ wxChar* copy = new wxChar[wxStrlen(s) + 1];
+ return wxStrcpy(copy, s);
+}
+
void wxPathList::Add (const wxString& path)
{
wxStringList::Add (WXSTRINGCAST 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 = MYcopystring (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;
}
}
bool wxPathList::Member (const wxString& path)
{
- for (wxNode * node = First (); node != NULL; node = node->Next ())
+ for (wxStringList::Node *node = GetFirst(); node; node = node->GetNext())
{
- wxString path2((wxChar *) node->Data ());
+ wxString path2( node->GetData() );
if (
#if defined(__WINDOWS__) || defined(__VMS__) || defined (__WXMAC__)
// Case INDEPENDENT
wxChar *filename = (wxChar*) NULL; /* shut up buggy egcs warning */
filename = wxIsAbsolutePath (buf) ? wxFileNameFromPath (buf) : (wxChar *)buf;
- for (wxNode * node = First (); node; node = node->Next ())
+ for (wxStringList::Node *node = GetFirst(); node; node = node->GetNext())
{
- wxChar *path = (wxChar *) node->Data ();
+ wxChar *path = node->GetData();
wxStrcpy (wxFileFunctionsBuffer, path);
wxChar ch = wxFileFunctionsBuffer[wxStrlen(wxFileFunctionsBuffer)-1];
if (ch != wxT('\\') && ch != wxT('/'))
}
} // for()
- return wxString(wxT("")); // Not found
+ return wxEmptyString; // Not found
}
wxString wxPathList::FindAbsoluteValidPath (const wxString& file)
wxStrcat(buf, wxT("/"));
#endif
wxStrcat(buf, wxFileFunctionsBuffer);
- return copystring( wxRealPath(buf) );
+ return MYcopystring( wxRealPath(buf) );
}
- return copystring( wxFileFunctionsBuffer );
+ return MYcopystring( wxFileFunctionsBuffer );
}
/*-
buf[0] = wxT('\0');
if (name == NULL || *name == wxT('\0'))
return buf;
- nm = copystring(name); // Make a scratch copy
+ nm = MYcopystring(name); // Make a scratch copy
wxChar *nm_tmp = nm;
/* Skip leading whitespace and cr */
int j;
OSErr theErr;
OSStatus theStatus;
- Boolean isDirectory = false;
- Str255 theParentPath = "\p";
+ Boolean isDirectory = FALSE;
+ Str255 theParentPath = "\p";
FSSpec theParentSpec;
FSRef theParentRef;
char theFileName[FILENAME_MAX];
(*myPath)[length-1] = 0 ;
// create path string for return value
- wxString result( (char*) *myPath ) ;
+ wxString result = wxMacMakeStringFromCString( *myPath ) ;
// free allocated handle
::HUnlock( myPath ) ;
// 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 )
{
- OSStatus err = noErr ;
+ OSStatus err = noErr ;
#ifdef __DARWIN__
FSRef theRef;
// convert the FSRef to an FSSpec
err = FSGetCatalogInfo(&theRef, kFSCatInfoNone, NULL, NULL, spec, NULL);
#else
- if ( strchr( path , ':' ) == NULL )
+ 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 ) ;
+ // try whether it is a volume / or a mounted volume
+ strncpy( scMacFileNameConversion , path , 1000 ) ;
+ scMacFileNameConversion[998] = 0 ;
+ strcat( scMacFileNameConversion , ":" ) ;
+ err = FSpLocationFromFullPath( strlen(scMacFileNameConversion) , scMacFileNameConversion , spec ) ;
}
else
{
- err = FSpLocationFromFullPath( strlen(path) , path , spec ) ;
+ err = FSpLocationFromFullPath( strlen(path) , path , 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
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)
{
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 = ':';
s++ ;
}
}
- return wxString (sMacFileNameConversion) ;
+ return wxString(sMacFileNameConversion) ;
}
wxString wxMacFSSpec2UnixFilename( const FSSpec *spec )
#endif // __WXMAC__
void
-wxDos2UnixFilename (char *s)
+wxDos2UnixFilename (wxChar *s)
{
if (s)
while (*s)
{
- if (*s == '\\')
- *s = '/';
+ if (*s == _T('\\'))
+ *s = _T('/');
#ifdef __WXMSW__
else
*s = wxTolower (*s); // Case INDEPENDENT
// 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;
|| defined(__WATCOMC__) \
|| defined(__GNUWIN32__)
int res = wxRemove(file);
+#elif defined(__WXMAC__)
+ int res = unlink(wxFNCONV(file));
#else
int res = unlink(OS_FILENAME(file));
#endif
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();
// 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(__DOS__))) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) || defined(__WXWINE__) || defined(__WXMICROWIN__)
+#if (!(defined(__WXMSW__) || defined(__WXPM__) || defined(__DOS__))) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) || defined(__WINE__) || defined(__WXMICROWIN__)
+ #ifndef MSVCRT
if ( mkdir(wxFNCONV(dirname), perm) != 0 )
+ #else
+ if ( mkdir(wxFNCONV(dirname)) != 0 )
+ #endif
#elif defined(__WXPM__)
if (::DosCreateDir((PSZ)dirname, NULL) != 0) // enhance for EAB's??
#elif defined(__DOS__)
if ( buf )
wxStrcpy(buf, filename);
else
- buf = copystring(filename);
+ buf = MYcopystring(filename);
return buf;
}
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)
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;
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 ;
cwdSpec.parID = pb.ioFCBParID;
cwdSpec.name[0] = 0 ;
wxString res = wxMacFSSpec2MacFilename( &cwdSpec ) ;
-
- strcpy( cbuf , res ) ;
- cbuf[res.length()]=0 ;
-
+ wxStrcpy( buf , res ) ;
ok = TRUE;
}
else
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
wxGetWorkingDirectory(buffer, _MAXPATHLEN);
wxString str( buffer );
delete [] buffer;
-
+
return str;
}
wxChar buf[256];
GetWindowsDirectory(buf, 256);
return wxString(buf);
+#elif defined(__WXMAC__)
+ return wxMacFindFolder(kOnSystemDisk, 'macs', false);
#else
return wxEmptyString;
#endif
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
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,
{
wxStructStat buf;
wxStat( filename, &buf);
-
+
return buf.st_mtime;
}
{
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;
/* Match if both are empty. */
return pat.empty();
}
-
+
const wxChar *m = pat.c_str(),
*n = text.c_str(),
*ma = NULL,
if (dot_special && (*n == wxT('.')))
{
- /* Never match so that hidden Unix files
+ /* Never match so that hidden Unix files
* are never found. */
return FALSE;
}