X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1a5a83677555023d476401bab5809a1107222c74..02e8b2f9fbdfcd25080c42082d637da257c20094:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 90b49c111d..64391f01e3 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -46,7 +46,7 @@ #include #endif -#ifdef __WXMSW__ +#ifdef __WINDOWS__ #ifndef __GNUWIN32__ #include #include @@ -70,7 +70,12 @@ #include #endif -#ifdef __WXMSW__ +#include "wx/setup.h" +#ifdef HAVE_FNMATCH_H +#include "fnmatch.h" +#endif + +#ifdef __WINDOWS__ #include "windows.h" #endif @@ -91,7 +96,7 @@ void wxPathList::Add (const wxString& path) void wxPathList::AddEnvList (const wxString& envVariable) { static const char PATH_TOKS[] = -#ifdef __WXMSW__ +#ifdef __WINDOWS__ " ;"; // Don't seperate with colon in DOS (used for drive) #else " :;"; @@ -108,7 +113,7 @@ void wxPathList::AddEnvList (const wxString& envVariable) Add (copystring (token)); while (token) { - if ((token = strtok (NULL, PATH_TOKS)) != NULL) + if ((token = strtok ((char *) NULL, PATH_TOKS)) != NULL) Add (wxString(token)); } } @@ -136,7 +141,7 @@ bool wxPathList::Member (const wxString& path) { wxString path2((char *) node->Data ()); if ( -#if defined(__WXMSW__) || defined(__VMS__) +#if defined(__WINDOWS__) || defined(__VMS__) // Case INDEPENDENT path.CompareTo (path2, wxString::ignoreCase) == 0 #else @@ -167,7 +172,7 @@ wxString wxPathList::FindValidPath (const wxString& file) if (ch != '\\' && ch != '/') strcat (wxBuffer, "/"); strcat (wxBuffer, filename); -#ifdef __WXMSW__ +#ifdef __WINDOWS__ Unix2DosFilename (wxBuffer); #endif if (wxFileExists (wxBuffer)) @@ -194,7 +199,7 @@ wxString wxPathList::FindAbsoluteValidPath (const wxString& file) lastCh = buf[len-1]; if (lastCh != '/' && lastCh != '\\') { -#ifdef __WXMSW__ +#ifdef __WINDOWS__ strcat(buf, "\\"); #else strcat(buf, "/"); @@ -237,7 +242,7 @@ wxIsAbsolutePath (const wxString& filename) #ifdef __VMS__ || (filename[0] == '[' && filename[1] != '.') #endif -#ifdef __WXMSW__ +#ifdef __WINDOWS__ /* MSDOS */ || filename[0] == '\\' || (isalpha (filename[0]) && filename[1] == ':') #endif @@ -339,7 +344,7 @@ char *wxRealPath (char *path) char *wxCopyAbsolutePath(const wxString& filename) { if (filename == "") - return NULL; + return (char *) NULL; if (! IsAbsolutePath(wxExpandPath(wxBuffer, filename))) { char buf[_MAXPATHLEN]; @@ -442,7 +447,7 @@ char *wxExpandPath(char *buf, const char *name) #endif { register char *start = d; - register braces = (*s == '{' || *s == '('); + register int braces = (*s == '{' || *s == '('); register char *value; while ((*d++ = *s)) if (braces ? (*s == '}' || *s == ')') : !(isalnum(*s) || *s == '_') ) @@ -523,7 +528,7 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin static char dest[_MAXPATHLEN]; if (filename == "") - return NULL; + return (char *) NULL; strcpy (dest, WXSTRINGCAST filename); #ifdef __WXMSW__ @@ -531,9 +536,9 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin #endif // Handle environment - char *val = NULL; - char *tcp = NULL; - if (envname != NULL && (val = getenv (WXSTRINGCAST envname)) != NULL && + char *val = (char *) NULL; + char *tcp = (char *) NULL; + if (envname != WXSTRINGCAST NULL && (val = getenv (WXSTRINGCAST envname)) != NULL && (tcp = strstr (dest, val)) != NULL) { strcpy (wxBuffer, tcp + strlen (val)); @@ -665,7 +670,7 @@ wxPathOnly (char *path) #endif } - return NULL; + return (char *) NULL; } // Return just the directory, or NULL if no directory @@ -761,9 +766,9 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil { char *outfile = wxGetTempFileName("cat"); - FILE *fp1 = NULL; - FILE *fp2 = NULL; - FILE *fp3 = NULL; + FILE *fp1 = (FILE *) NULL; + FILE *fp2 = (FILE *) NULL; + FILE *fp3 = (FILE *) NULL; // Open the inputs and outputs if ((fp1 = fopen (WXSTRINGCAST file1, "rb")) == NULL || (fp2 = fopen (WXSTRINGCAST file2, "rb")) == NULL || @@ -844,7 +849,9 @@ bool wxRemoveFile(const wxString& file) bool wxMkdir(const wxString& dir) { -#ifdef __VMS__ +#if defined(__WXSTUBS__) + return FALSE; +#elif defined(__VMS__) return FALSE; #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); @@ -924,7 +931,7 @@ bool wxPathExists(const char *pszPathName) // Get a temporary filename, opening and closing the file. char *wxGetTempFileName(const wxString& prefix, char *buf) { -#ifdef __WXMSW__ +#ifdef __WINDOWS__ #ifndef __WIN32__ char tmp[144]; @@ -963,7 +970,7 @@ char *wxGetTempFileName(const wxString& prefix, char *buf) } cerr << _("wxWindows: error finding temporary file name.\n"); if (buf) buf[0] = 0; - return NULL; + return (char *) NULL; #endif } @@ -975,8 +982,8 @@ char *wxGetTempFileName(const wxString& prefix, char *buf) // Flags are reserved for future use. #ifndef __VMS__ -static DIR *wxDirStream = NULL; -static char *wxFileSpec = NULL; +static DIR *wxDirStream = (DIR *) NULL; +static char *wxFileSpec = (char *) NULL; static int wxFindFileFlags = 0; #endif @@ -1004,13 +1011,13 @@ char *wxFindFirstFile(const char *spec, int flags) p = "."; if ((wxDirStream=opendir(p))==NULL) - return NULL; + return (char *) NULL; /* MATTHEW: [5] wxFindNextFile can do the rest of the work */ return wxFindNextFile(); #endif // ifndef __VMS__ - return NULL; + return (char *) NULL; } char *wxFindNextFile(void) @@ -1020,7 +1027,7 @@ char *wxFindNextFile(void) /* MATTHEW: [2] Don't crash if we read too many times */ if (!wxDirStream) - return NULL; + return (char *) NULL; // Find path only so we can concatenate // found file onto path @@ -1064,11 +1071,11 @@ char *wxFindNextFile(void) } } closedir(wxDirStream); - wxDirStream = NULL; + wxDirStream = (DIR *) NULL; #endif // ifndef __VMS__ - return NULL; + return (char *) NULL; } #elif defined(__WXMSW__) @@ -1260,7 +1267,7 @@ bool wxSetWorkingDirectory(const wxString& d) { #ifdef __UNIX__ return (chdir(d) == 0); -#elif defined(__WXMSW__) +#elif defined(__WINDOWS__) #ifdef __WIN32__ return (bool)(SetCurrentDirectory(d) != 0); @@ -1317,7 +1324,7 @@ bool wxFindFileInPath(wxString *pStr, const char *pszPath, const char *pszFile) wxString strFile; char *pc; - for ( pc = strtok(szPath, PATH_SEP); pc; pc = strtok(NULL, PATH_SEP) ) { + for ( pc = strtok(szPath, PATH_SEP); pc; pc = strtok((char *) NULL, PATH_SEP) ) { // search for the file in this directory strFile = pc; if ( !wxEndsWithPathSeparator(pc) ) @@ -1347,16 +1354,16 @@ void WXDLLEXPORT wxSplitPath(const char *pszFileName, const char *pSepDos = strrchr(pszFileName, FILE_SEP_PATH_DOS); // take the last of the two - uint nPosUnix = pSepUnix ? pSepUnix - pszFileName : 0; - uint nPosDos = pSepDos ? pSepDos - pszFileName : 0; + size_t nPosUnix = pSepUnix ? pSepUnix - pszFileName : 0; + size_t nPosDos = pSepDos ? pSepDos - pszFileName : 0; if ( nPosDos > nPosUnix ) nPosUnix = nPosDos; -// uint nLen = Strlen(pszFileName); +// size_t nLen = Strlen(pszFileName); if ( pstrPath ) *pstrPath = wxString(pszFileName, nPosUnix); if ( pDot ) { - uint nPosDot = pDot - pszFileName; + size_t nPosDot = pDot - pszFileName; if ( pstrName ) *pstrName = wxString(pszFileName + nPosUnix + 1, nPosDot - nPosUnix); if ( pstrExt ) @@ -1369,3 +1376,172 @@ void WXDLLEXPORT wxSplitPath(const char *pszFileName, pstrExt->Empty(); } } + +//------------------------------------------------------------------------ +// wild character routines +//------------------------------------------------------------------------ + +bool wxIsWild( const wxString& pattern ) +{ + wxString tmp = pattern; + char *pat = WXSTRINGCAST(tmp); + while (*pat) { + switch (*pat++) { + case '?': case '*': case '[': case '{': + return TRUE; + case '\\': + if (!*pat++) + return FALSE; + } + } + return FALSE; +}; + + +#ifdef HAVE_FNMATCH_H +{ + // dot_special: what is it supposed to do? + return fnmatch(pat.c_str(), text.c_str(), FNM_PERIOD) == 0; +} +#else + +#pragma error Broken implementation of wxMatchWild() -- needs fixing! + /* + * WARNING: this code is broken! + */ +bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) +{ + wxString tmp1 = pat; + char *pattern = WXSTRINGCAST(tmp1); + wxString tmp2 = text; + char *str = WXSTRINGCAST(tmp2); + char c; + char *cp; + bool done = FALSE, ret_code, ok; + // Below is for vi fans + const char OB = '{', CB = '}'; + + // dot_special means '.' only matches '.' + if (dot_special && *str == '.' && *pattern != *str) + return FALSE; + + while ((*pattern != '\0') && (!done) + && (((*str=='\0')&&((*pattern==OB)||(*pattern=='*')))||(*str!='\0'))) { + switch (*pattern) { + case '\\': + pattern++; + if (*pattern != '\0') + pattern++; + break; + case '*': + pattern++; + ret_code = FALSE; + while ((*str!='\0') + && (!(ret_code=wxMatchWild(pattern, str++, FALSE)))) + /*loop*/; + if (ret_code) { + while (*str != '\0') + str++; + while (*pattern != '\0') + pattern++; + } + break; + case '[': + pattern++; + repeat: + if ((*pattern == '\0') || (*pattern == ']')) { + done = TRUE; + break; + } + if (*pattern == '\\') { + pattern++; + if (*pattern == '\0') { + done = TRUE; + break; + } + } + if (*(pattern + 1) == '-') { + c = *pattern; + pattern += 2; + if (*pattern == ']') { + done = TRUE; + break; + } + if (*pattern == '\\') { + pattern++; + if (*pattern == '\0') { + done = TRUE; + break; + } + } + if ((*str < c) || (*str > *pattern)) { + pattern++; + goto repeat; + } + } else if (*pattern != *str) { + pattern++; + goto repeat; + } + pattern++; + while ((*pattern != ']') && (*pattern != '\0')) { + if ((*pattern == '\\') && (*(pattern + 1) != '\0')) + pattern++; + pattern++; + } + if (*pattern != '\0') { + pattern++, str++; + } + break; + case '?': + pattern++; + str++; + break; + case OB: + pattern++; + while ((*pattern != CB) && (*pattern != '\0')) { + cp = str; + ok = TRUE; + while (ok && (*cp != '\0') && (*pattern != '\0') + && (*pattern != ',') && (*pattern != CB)) { + if (*pattern == '\\') + pattern++; + ok = (*pattern++ == *cp++); + } + if (*pattern == '\0') { + ok = FALSE; + done = TRUE; + break; + } else if (ok) { + str = cp; + while ((*pattern != CB) && (*pattern != '\0')) { + if (*++pattern == '\\') { + if (*++pattern == CB) + pattern++; + } + } + } else { + while (*pattern!=CB && *pattern!=',' && *pattern!='\0') { + if (*++pattern == '\\') { + if (*++pattern == CB || *pattern == ',') + pattern++; + } + } + } + if (*pattern != '\0') + pattern++; + } + break; + default: + if (*str == *pattern) { + str++, pattern++; + } else { + done = TRUE; + } + } + } + while (*pattern == '*') + pattern++; + return ((*str == '\0') && (*pattern == '\0')); +}; +#endif +