X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4ea2c29f51d358c9a9bbc37edda1541073c71364..9cb98d899582a69072a51a4c06199cebf625c039:/src/common/filefn.cpp?ds=sidebyside diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 935fa8608c..fe708cb0a4 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -75,7 +75,7 @@ #include #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 #include @@ -105,7 +105,6 @@ #include #endif -#include "wx/setup.h" #include "wx/log.h" // No, Cygwin doesn't appear to have fnmatch.h after all. @@ -124,7 +123,7 @@ #ifdef __CYGWIN__ #include #endif - #include + #ifndef __TWIN32__ #include #endif @@ -145,10 +144,14 @@ #endif #ifdef __WXMAC__ +# ifdef __DARWIN__ +# include "MoreFilesX.h" +# else # include "MoreFiles.h" # include "MoreFilesExtras.h" # include "FullPath.h" # include "FSpCompat.h" +# endif #endif // ---------------------------------------------------------------------------- @@ -257,9 +260,9 @@ void wxPathList::EnsureFileAccessible (const wxString& path) 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 @@ -283,18 +286,18 @@ wxString wxPathList::FindValidPath (const wxString& file) wxStrcpy(buf, wxFileFunctionsBuffer); wxChar *filename = (wxChar*) NULL; /* shut up buggy egcs warning */ - filename = IsAbsolutePath (buf) ? wxFileNameFromPath (buf) : (wxChar *)buf; + 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('/')) wxStrcat (wxFileFunctionsBuffer, wxT("/")); wxStrcat (wxFileFunctionsBuffer, filename); #ifdef __WINDOWS__ - Unix2DosFilename (wxFileFunctionsBuffer); + wxUnix2DosFilename (wxFileFunctionsBuffer); #endif if (wxFileExists (wxFileFunctionsBuffer)) { @@ -302,7 +305,7 @@ wxString wxPathList::FindValidPath (const wxString& file) } } // for() - return wxString(wxT("")); // Not found + return wxEmptyString; // Not found } wxString wxPathList::FindAbsoluteValidPath (const wxString& file) @@ -411,7 +414,7 @@ wxChar *wxRealPath (wxChar *path) { #ifdef __WXMSW__ static const wxChar SEP = wxT('\\'); - Unix2DosFilename(path); + wxUnix2DosFilename(path); #else static const wxChar SEP = wxT('/'); #endif @@ -429,7 +432,11 @@ wxChar *wxRealPath (wxChar *path) if (p[1] == wxT('.') && p[2] == wxT('.') && (p[3] == SEP || p[3] == wxT('\0'))) { wxChar *q; - for (q = p - 1; q >= path && *q != SEP; q--); + for (q = p - 1; q >= path && *q != SEP; q--) + { + // Empty + } + if (q[0] == SEP && (q[1] != wxT('.') || q[2] != wxT('.') || q[3] != SEP) && (q - 1 <= path || q[-1] != SEP)) { @@ -464,7 +471,7 @@ wxChar *wxCopyAbsolutePath(const wxString& filename) if (filename == wxT("")) return (wxChar *) NULL; - if (! IsAbsolutePath(wxExpandPath(wxFileFunctionsBuffer, filename))) { + if (! wxIsAbsolutePath(wxExpandPath(wxFileFunctionsBuffer, filename))) { wxChar buf[_MAXPATHLEN]; buf[0] = wxT('\0'); wxGetWorkingDirectory(buf, WXSIZEOF(buf)); @@ -593,7 +600,11 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) *--d = 0; value = wxGetenv(braces ? start + 1 : start); if (value) { - for ((d = start - 1); (*d++ = *value++) != 0;); + for ((d = start - 1); (*d++ = *value++) != 0;) + { + // Empty + } + d--; if (braces && *s) s++; @@ -617,7 +628,10 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) { /* ~user/filename */ register wxChar *nnm; register wxChar *home; - for (s = nm; *s && *s != SEP; s++); + for (s = nm; *s && *s != SEP; s++) + { + // Empty + } int was_sep; /* MATTHEW: Was there a separator, or NULL? */ was_sep = (*s == SEP); nnm = *s ? s + 1 : s; @@ -644,7 +658,10 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) *(d - 1) = SEP; } s = nm; - while ((*d++ = *s++) != 0); + while ((*d++ = *s++) != 0) + { + // Empty + } delete[] nm_tmp; // clean up alloc /* Now clean up the buffer */ return wxRealPath(buf); @@ -667,7 +684,7 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin wxStrcpy (dest, WXSTRINGCAST filename); #ifdef __WXMSW__ - Unix2DosFilename(dest); + wxUnix2DosFilename(dest); #endif // Handle environment @@ -848,8 +865,8 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) 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]; @@ -927,7 +944,7 @@ static char sMacFileNameConversion[ 1000 ] ; #endif void wxMacFilename2FSSpec( const char *path , FSSpec *spec ) { - OSStatus err = noErr ; + OSStatus err = noErr ; #ifdef __DARWIN__ FSRef theRef; @@ -936,9 +953,9 @@ void wxMacFilename2FSSpec( const char *path , FSSpec *spec ) // 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 + // try whether it is a volume / or a mounted volume strncpy( sMacFileNameConversion , path , 1000 ) ; sMacFileNameConversion[998] = 0 ; strcat( sMacFileNameConversion , ":" ) ; @@ -946,7 +963,7 @@ void wxMacFilename2FSSpec( const char *path , FSSpec *spec ) } else { - err = FSpLocationFromFullPath( strlen(path) , path , spec ) ; + err = FSpLocationFromFullPath( strlen(path) , path , spec ) ; } #endif } @@ -1070,7 +1087,7 @@ bool wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& file3) { wxString outfile; - if ( !wxGetTempFileName("cat", outfile) ) + if ( !wxGetTempFileName( wxT("cat"), outfile) ) return FALSE; FILE *fp1 = (FILE *) NULL; @@ -1158,7 +1175,7 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) // 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; @@ -1245,8 +1262,12 @@ 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 -#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__) @@ -1427,7 +1448,7 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) 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; @@ -1538,7 +1559,7 @@ wxString wxGetCwd() wxGetWorkingDirectory(buffer, _MAXPATHLEN); wxString str( buffer ); delete [] buffer; - + return str; } @@ -1599,7 +1620,7 @@ bool wxEndsWithPathSeparator(const wxChar *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 bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFile) { // we assume that it's not empty @@ -1626,7 +1647,7 @@ bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFi strFile += wxFILE_SEP_PATH; strFile += pszFile; - if ( FileExists(strFile) ) { + if ( wxFileExists(strFile) ) { *pStr = strFile; break; } @@ -1638,7 +1659,7 @@ bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFi 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, @@ -1656,7 +1677,7 @@ time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename) { wxStructStat buf; wxStat( filename, &buf); - + return buf.st_mtime; } @@ -1667,10 +1688,12 @@ time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename) bool wxIsWild( const wxString& pattern ) { - wxString tmp = pattern; - wxChar *pat = WXSTRINGCAST(tmp); - while (*pat) { - switch (*pat++) { + wxString tmp = pattern; + wxChar *pat = WXSTRINGCAST(tmp); + while (*pat) + { + switch (*pat++) + { case wxT('?'): case wxT('*'): case wxT('['): case wxT('{'): return TRUE; case wxT('\\'): @@ -1679,160 +1702,135 @@ bool wxIsWild( const wxString& pattern ) } } return FALSE; -}; - -bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) - -#ifdef HAVE_FNMATCH -{ -// this probably won't work well for multibyte chars in Unicode mode? - if(dot_special) - return fnmatch(pat.fn_str(), text.fn_str(), FNM_PERIOD) == 0; - else - return fnmatch(pat.fn_str(), text.fn_str(), 0) == 0; } -#else // !HAVE_FNMATCH -// #pragma error Broken implementation of wxMatchWild() -- needs fixing! +/* +* Written By Douglas A. Lewis +* +* The match procedure is public domain code (from ircII's reg.c) +*/ - /* - * WARNING: this code is broken! - */ +bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) { - wxString tmp1 = pat; - wxChar *pattern = WXSTRINGCAST(tmp1); - wxString tmp2 = text; - wxChar *str = WXSTRINGCAST(tmp2); - wxChar c; - wxChar *cp; - bool done = FALSE, ret_code, ok; - // Below is for vi fans - const wxChar OB = wxT('{'), CB = wxT('}'); - - // dot_special means '.' only matches '.' - if (dot_special && *str == wxT('.') && *pattern != *str) - return FALSE; + if (text.empty()) + { + /* Match if both are empty. */ + return pat.empty(); + } - while ((*pattern != wxT('\0')) && (!done) - && (((*str==wxT('\0'))&&((*pattern==OB)||(*pattern==wxT('*'))))||(*str!=wxT('\0')))) { - switch (*pattern) { - case wxT('\\'): - pattern++; - if (*pattern != wxT('\0')) - pattern++; - break; - case wxT('*'): - pattern++; - ret_code = FALSE; - while ((*str!=wxT('\0')) - && ((ret_code=wxMatchWild(pattern, str++, FALSE)) == 0)) - /*loop*/; - if (ret_code) { - while (*str != wxT('\0')) - str++; - while (*pattern != wxT('\0')) - pattern++; - } - break; - case wxT('['): - pattern++; - repeat: - if ((*pattern == wxT('\0')) || (*pattern == wxT(']'))) { - done = TRUE; - break; - } - if (*pattern == wxT('\\')) { - pattern++; - if (*pattern == wxT('\0')) { - done = TRUE; - break; - } - } - if (*(pattern + 1) == wxT('-')) { - c = *pattern; - pattern += 2; - if (*pattern == wxT(']')) { - done = TRUE; - break; - } - if (*pattern == wxT('\\')) { - pattern++; - if (*pattern == wxT('\0')) { - done = TRUE; - break; - } - } - if ((*str < c) || (*str > *pattern)) { - pattern++; - goto repeat; + const wxChar *m = pat.c_str(), + *n = text.c_str(), + *ma = NULL, + *na = NULL, + *mp = NULL, + *np = NULL; + int just = 0, + pcount = 0, + acount = 0, + count = 0; + + if (dot_special && (*n == wxT('.'))) + { + /* Never match so that hidden Unix files + * are never found. */ + return FALSE; + } + + for (;;) + { + if (*m == wxT('*')) + { + ma = ++m; + na = n; + just = 1; + mp = NULL; + acount = count; } - } else if (*pattern != *str) { - pattern++; - goto repeat; - } - pattern++; - while ((*pattern != wxT(']')) && (*pattern != wxT('\0'))) { - if ((*pattern == wxT('\\')) && (*(pattern + 1) != wxT('\0'))) - pattern++; - pattern++; - } - if (*pattern != wxT('\0')) { - pattern++, str++; - } - break; - case wxT('?'): - pattern++; - str++; - break; - case OB: - pattern++; - while ((*pattern != CB) && (*pattern != wxT('\0'))) { - cp = str; - ok = TRUE; - while (ok && (*cp != wxT('\0')) && (*pattern != wxT('\0')) - && (*pattern != wxT(',')) && (*pattern != CB)) { - if (*pattern == wxT('\\')) - pattern++; - ok = (*pattern++ == *cp++); + else if (*m == wxT('?')) + { + m++; + if (!*n++) + return FALSE; } - if (*pattern == wxT('\0')) { - ok = FALSE; - done = TRUE; - break; - } else if (ok) { - str = cp; - while ((*pattern != CB) && (*pattern != wxT('\0'))) { - if (*++pattern == wxT('\\')) { - if (*++pattern == CB) - pattern++; + else + { + if (*m == wxT('\\')) + { + m++; + /* Quoting "nothing" is a bad thing */ + if (!*m) + return FALSE; } - } - } else { - while (*pattern!=CB && *pattern!=wxT(',') && *pattern!=wxT('\0')) { - if (*++pattern == wxT('\\')) { - if (*++pattern == CB || *pattern == wxT(',')) - pattern++; + if (!*m) + { + /* + * If we are out of both strings or we just + * saw a wildcard, then we can say we have a + * match + */ + if (!*n) + return TRUE; + if (just) + return TRUE; + just = 0; + goto not_matched; + } + /* + * We could check for *n == NULL at this point, but + * since it's more common to have a character there, + * check to see if they match first (m and n) and + * then if they don't match, THEN we can check for + * the NULL of n + */ + just = 0; + if (*m == *n) + { + m++; + if (*n == wxT(' ')) + mp = NULL; + count++; + n++; + } + else + { + + not_matched: + + /* + * If there are no more characters in the + * string, but we still need to find another + * character (*m != NULL), then it will be + * impossible to match it + */ + if (!*n) + return FALSE; + if (mp) + { + m = mp; + if (*np == wxT(' ')) + { + mp = NULL; + goto check_percent; + } + n = ++np; + count = pcount; + } + else + check_percent: + + if (ma) + { + m = ma; + n = ++na; + count = acount; + } + else + return FALSE; } - } } - if (*pattern != wxT('\0')) - pattern++; - } - break; - default: - if (*str == *pattern) { - str++, pattern++; - } else { - done = TRUE; - } } - } - while (*pattern == wxT('*')) - pattern++; - return ((*str == wxT('\0')) && (*pattern == wxT('\0'))); -}; +} -#endif // HAVE_FNMATCH/!HAVE_FNMATCH #ifdef __VISUALC__ #pragma warning(default:4706) // assignment within conditional expression