X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7f555861b7e50f335c7b929bb76be38e9ebd69c5..6d5977dfdf3fa1a058653908346685ded9ae60b1:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 52af1f7b4c..e9f0c9105f 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -28,6 +28,11 @@ #include "wx/utils.h" #include +// there are just too many of those... +#ifdef _MSC_VER + #pragma warning(disable:4706) // assignment within conditional expression +#endif // VC++ + #include #include #include @@ -38,8 +43,13 @@ #endif #endif #include +#ifndef __MWERKS__ #include #include +#else +#include +#include +#endif #ifdef __UNIX__ #include @@ -47,7 +57,7 @@ #endif #ifdef __WINDOWS__ -#ifndef __GNUWIN32__ +#if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) #include #include #endif @@ -55,12 +65,6 @@ #ifdef __GNUWIN32__ #include -// #include - -#ifndef __MINGW32__ -#include -#endif - #define stricmp strcasecmp #endif @@ -70,17 +74,30 @@ #include #endif +#include "wx/setup.h" +#include "wx/log.h" + +// No, Cygwin doesn't appear to have fnmatch.h after all. +#if defined(HAVE_FNMATCH_H) +#include "fnmatch.h" +#endif + #ifdef __WINDOWS__ #include "windows.h" #endif #define _MAXPATHLEN 500 -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList) +extern char *wxBuffer; +#ifdef __WXMAC__ +extern char gwxMacFileName[] ; +extern char gwxMacFileName2[] ; +extern char gwxMacFileName3[] ; #endif -extern char *wxBuffer; +#if !USE_SHARED_LIBRARIES +IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList) +#endif void wxPathList::Add (const wxString& path) { @@ -136,7 +153,7 @@ bool wxPathList::Member (const wxString& path) { wxString path2((char *) node->Data ()); if ( -#if defined(__WINDOWS__) || defined(__VMS__) +#if defined(__WINDOWS__) || defined(__VMS__) || defined (__WXMAC__) // Case INDEPENDENT path.CompareTo (path2, wxString::ignoreCase) == 0 #else @@ -157,7 +174,8 @@ wxString wxPathList::FindValidPath (const wxString& file) char buf[_MAXPATHLEN]; strcpy(buf, wxBuffer); - char *filename = IsAbsolutePath (buf) ? wxFileNameFromPath (buf) : (char *)buf; + char *filename = (char*) NULL; /* shut up buggy egcs warning */ + filename = IsAbsolutePath (buf) ? wxFileNameFromPath (buf) : (char *)buf; for (wxNode * node = First (); node; node = node->Next ()) { @@ -209,11 +227,25 @@ wxString wxPathList::FindAbsoluteValidPath (const wxString& file) bool wxFileExists (const wxString& filename) { +#ifdef __GNUWIN32__ // (fix a B20 bug) + if (GetFileAttributes(filename) == 0xFFFFFFFF) + return FALSE; + else + return TRUE; +#elif defined(__WXMAC__) + struct stat stbuf; + strcpy( gwxMacFileName , filename ) ; + wxUnix2MacFilename( gwxMacFileName ) ; + if (gwxMacFileName && stat ((char *)(const char *)gwxMacFileName, &stbuf) == 0) + return TRUE; + return FALSE ; +#else struct stat stbuf; - if (filename && stat ((char *)(const char *)filename, &stbuf) == 0) + if ((filename != "") && stat ((char *)(const char *)filename, &stbuf) == 0) return TRUE; return FALSE; +#endif } /* Vadim's alternative implementation @@ -551,8 +583,8 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin strncmp(dest, val, len) == 0) { strcpy(wxBuffer, "~"); - if (user && *user) - strcat(wxBuffer, user); + if (user != "") + strcat(wxBuffer, (const char*) user); #ifdef __WXMSW__ // strcat(wxBuffer, "\\"); #else @@ -720,6 +752,58 @@ wxString wxPathOnly (const wxString& path) // and back again - or we get nasty problems with delimiters. // Also, convert to lower case, since case is significant in UNIX. +#ifdef __WXMAC__ +void +wxMac2UnixFilename (char *s) +{ + if (s) + { + memmove( s+1 , s ,strlen( s ) + 1) ; + if ( *s == ':' ) + *s = '.' ; + else + *s = '/' ; + + while (*s) + { + if (*s == ':') + *s = '/'; + else + *s = wxToLower (*s); // Case INDEPENDENT + s++; + } + } +} + +void +wxUnix2MacFilename (char *s) +{ + 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 == '/' ) + { + // 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 == '\\') + *s = ':'; + + s++ ; + } + } +} +#endif void wxDos2UnixFilename (char *s) { @@ -765,9 +849,22 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil FILE *fp2 = (FILE *) NULL; FILE *fp3 = (FILE *) NULL; // Open the inputs and outputs +#ifdef __WXMAC__ + strcpy( gwxMacFileName , file1 ) ; + wxUnix2MacFilename( gwxMacFileName ) ; + strcpy( gwxMacFileName2 , file2) ; + wxUnix2MacFilename( gwxMacFileName2 ) ; + strcpy( gwxMacFileName3 , outfile) ; + wxUnix2MacFilename( gwxMacFileName3 ) ; + + if ((fp1 = fopen (gwxMacFileName, "rb")) == NULL || + (fp2 = fopen (gwxMacFileName2, "rb")) == NULL || + (fp3 = fopen (gwxMacFileName3, "wb")) == NULL) +#else if ((fp1 = fopen (WXSTRINGCAST file1, "rb")) == NULL || (fp2 = fopen (WXSTRINGCAST file2, "rb")) == NULL || (fp3 = fopen (outfile, "wb")) == NULL) +#endif { if (fp1) fclose (fp1); @@ -801,9 +898,20 @@ wxCopyFile (const wxString& file1, const wxString& file2) FILE *fd2; int ch; +#ifdef __WXMAC__ + strcpy( gwxMacFileName , file1 ) ; + wxUnix2MacFilename( gwxMacFileName ) ; + strcpy( gwxMacFileName2 , file2) ; + wxUnix2MacFilename( gwxMacFileName2 ) ; + + if ((fd1 = fopen (gwxMacFileName, "rb")) == NULL) + return FALSE; + if ((fd2 = fopen (gwxMacFileName2, "wb")) == NULL) +#else if ((fd1 = fopen (WXSTRINGCAST file1, "rb")) == NULL) return FALSE; if ((fd2 = fopen (WXSTRINGCAST file2, "wb")) == NULL) +#endif { fclose (fd1); return FALSE; @@ -820,9 +928,19 @@ wxCopyFile (const wxString& file1, const wxString& file2) bool wxRenameFile (const wxString& file1, const wxString& file2) { +#ifdef __WXMAC__ + strcpy( gwxMacFileName , file1 ) ; + wxUnix2MacFilename( gwxMacFileName ) ; + strcpy( gwxMacFileName2 , file2) ; + wxUnix2MacFilename( gwxMacFileName2 ) ; + + if (0 == rename (gwxMacFileName, gwxMacFileName2)) + return TRUE; +#else // Normal system call if (0 == rename (WXSTRINGCAST file1, WXSTRINGCAST file2)) return TRUE; +#endif // Try to copy if (wxCopyFile(file1, file2)) { wxRemoveFile(file1); @@ -834,8 +952,12 @@ wxRenameFile (const wxString& file1, const wxString& file2) bool wxRemoveFile(const wxString& file) { -#if defined(_MSC_VER) || defined(__BORLANDC__) +#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__) int flag = remove(WXSTRINGCAST file); +#elif defined( __WXMAC__ ) + strcpy( gwxMacFileName , file ) ; + wxUnix2MacFilename( gwxMacFileName ) ; + int flag = unlink(gwxMacFileName); #else int flag = unlink(WXSTRINGCAST file); #endif @@ -848,6 +970,10 @@ bool wxMkdir(const wxString& dir) return FALSE; #elif defined(__VMS__) 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 @@ -859,6 +985,10 @@ bool wxRmdir(const wxString& dir, int WXUNUSED(flags)) { #ifdef __VMS__ return FALSE; +#elif defined( __WXMAC__ ) + strcpy( gwxMacFileName , dir ) ; + wxUnix2MacFilename( gwxMacFileName ) ; + return (rmdir(WXSTRINGCAST gwxMacFileName) == 0); #else return (rmdir(WXSTRINGCAST dir) == 0); #endif @@ -944,7 +1074,7 @@ char *wxGetTempFileName(const wxString& prefix, char *buf) #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. - char tmp[100]; + char tmp[100]; // FIXME static buffer for (short suffix = last_temp + 1; suffix != last_temp; ++suffix %= 1000) { @@ -963,7 +1093,7 @@ char *wxGetTempFileName(const wxString& prefix, char *buf) return buf; } } - cerr << _("wxWindows: error finding temporary file name.\n"); + wxLogError( _("wxWindows: error finding temporary file name.\n") ); if (buf) buf[0] = 0; return (char *) NULL; #endif @@ -1018,7 +1148,7 @@ char *wxFindFirstFile(const char *spec, int flags) char *wxFindNextFile(void) { #ifndef __VMS__ - static char buf[400]; + static char buf[400]; // FIXME static buffer /* MATTHEW: [2] Don't crash if we read too many times */ if (!wxDirStream) @@ -1247,7 +1377,7 @@ char *wxGetWorkingDirectory(char *buf, int sz) { if (!buf) buf = new char[sz+1]; -#ifdef _MSC_VER +#ifdef _MSC_VER if (_getcwd(buf, sz) == NULL) { #else if (getcwd(buf, sz) == NULL) { @@ -1260,7 +1390,7 @@ char *wxGetWorkingDirectory(char *buf, int sz) bool wxSetWorkingDirectory(const wxString& d) { -#ifdef __UNIX__ +#if defined( __UNIX__ ) || defined( __WXMAC__ ) return (chdir(d) == 0); #elif defined(__WINDOWS__) @@ -1392,8 +1522,22 @@ bool wxIsWild( const wxString& pattern ) return FALSE; }; - bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) + +#if defined(HAVE_FNMATCH_H) +{ + if(dot_special) + return fnmatch(pat.c_str(), text.c_str(), FNM_PERIOD) == 0; + else + return fnmatch(pat.c_str(), text.c_str(), 0) == 0; +} +#else + +// #pragma error Broken implementation of wxMatchWild() -- needs fixing! + + /* + * WARNING: this code is broken! + */ { wxString tmp1 = pat; char *pattern = WXSTRINGCAST(tmp1); @@ -1528,3 +1672,8 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) return ((*str == '\0') && (*pattern == '\0')); }; +#endif + +#ifdef _MSC_VER + #pragma warning(default:4706) // assignment within conditional expression +#endif // VC++