X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1311c7a9bbaefda6b68eee5c32c3309f163a8861..6d5977dfdf3fa1a058653908346685ded9ae60b1:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index b47d856e66..e9f0c9105f 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -26,6 +26,12 @@ #endif #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 @@ -37,8 +43,13 @@ #endif #endif #include +#ifndef __MWERKS__ #include #include +#else +#include +#include +#endif #ifdef __UNIX__ #include @@ -46,7 +57,7 @@ #endif #ifdef __WINDOWS__ -#ifndef __GNUWIN32__ +#if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) #include #include #endif @@ -54,12 +65,6 @@ #ifdef __GNUWIN32__ #include -// #include - -#ifndef __MINGW32__ -#include -#endif - #define stricmp strcasecmp #endif @@ -69,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) { @@ -107,7 +125,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)); } } @@ -135,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 @@ -156,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 ()) { @@ -208,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 @@ -267,10 +300,25 @@ void wxStripExtension(char *buffer) } } +void wxStripExtension(wxString& buffer) +{ + size_t len = buffer.Length(); + size_t i = len-1; + while (i > 0) + { + if (buffer.GetChar(i) == '.') + { + buffer = buffer.Left(i); + break; + } + i --; + } +} + // Destructive removal of /./ and /../ stuff char *wxRealPath (char *path) { -#ifdef __WINDOWS__ +#ifdef __WXMSW__ static const char SEP = '\\'; Unix2DosFilename(path); #else @@ -300,7 +348,7 @@ char *wxRealPath (char *path) path[0] = SEP; path[1] = '\0'; } -#ifdef __WINDOWS__ +#ifdef __WXMSW__ /* Check that path[2] is NULL! */ else if (path[1] == ':' && !path[2]) { @@ -323,14 +371,14 @@ char *wxRealPath (char *path) char *wxCopyAbsolutePath(const wxString& filename) { if (filename == "") - return NULL; + return (char *) NULL; if (! IsAbsolutePath(wxExpandPath(wxBuffer, filename))) { char buf[_MAXPATHLEN]; buf[0] = '\0'; wxGetWorkingDirectory(buf, sizeof(buf)/sizeof(char)); char ch = buf[strlen(buf) - 1]; -#ifdef __WINDOWS__ +#ifdef __WXMSW__ if (ch != '\\' && ch != '/') strcat(buf, "\\"); #else @@ -381,7 +429,7 @@ char *wxExpandPath(char *buf, const char *name) trimchars[2] = '\t'; trimchars[3] = 0; -#ifdef __WINDOWS__ +#ifdef __WXMSW__ const char SEP = '\\'; #else const char SEP = '/'; @@ -402,7 +450,7 @@ char *wxExpandPath(char *buf, const char *name) s = nm; d = lnm; -#ifdef __WINDOWS__ +#ifdef __WXMSW__ q = FALSE; #else q = nm[0] == '\\' && nm[1] == '~'; @@ -410,7 +458,7 @@ char *wxExpandPath(char *buf, const char *name) /* Expand inline environment variables */ while ((*d++ = *s)) { -#ifndef __WINDOWS__ +#ifndef __WXMSW__ if (*s == '\\') { if ((*(d - 1) = *++s)) { s++; @@ -419,14 +467,14 @@ char *wxExpandPath(char *buf, const char *name) break; } else #endif -#ifdef __WINDOWS__ +#ifdef __WXMSW__ if (*s++ == '$' && (*s == '{' || *s == ')')) #else if (*s++ == '$') #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 == '_') ) @@ -507,17 +555,17 @@ 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 __WINDOWS__ +#ifdef __WXMSW__ Unix2DosFilename(dest); #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)); @@ -535,9 +583,9 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin strncmp(dest, val, len) == 0) { strcpy(wxBuffer, "~"); - if (user && *user) - strcat(wxBuffer, user); -#ifdef __WINDOWS__ + if (user != "") + strcat(wxBuffer, (const char*) user); +#ifdef __WXMSW__ // strcat(wxBuffer, "\\"); #else // strcat(wxBuffer, "/"); @@ -568,7 +616,7 @@ char *wxFileNameFromPath (char *path) #endif return tcp + 1; } /* while */ -#ifdef __WINDOWS__ +#ifdef __WXMSW__ if (isalpha (*path) && *(path + 1) == ':') return path + 2; #endif @@ -595,7 +643,7 @@ wxString wxFileNameFromPath (const wxString& path1) #endif return wxString(tcp + 1); } /* while */ -#ifdef __WINDOWS__ +#ifdef __WXMSW__ if (isalpha (*path) && *(path + 1) == ':') return wxString(path + 2); #endif @@ -637,7 +685,7 @@ wxPathOnly (char *path) else i --; } -#ifdef __WINDOWS__ +#ifdef __WXMSW__ // Try Drive specifier if (isalpha (buf[0]) && buf[1] == ':') { @@ -649,7 +697,7 @@ wxPathOnly (char *path) #endif } - return NULL; + return (char *) NULL; } // Return just the directory, or NULL if no directory @@ -685,7 +733,7 @@ wxString wxPathOnly (const wxString& path) else i --; } -#ifdef __WINDOWS__ +#ifdef __WXMSW__ // Try Drive specifier if (isalpha (buf[0]) && buf[1] == ':') { @@ -704,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) { @@ -712,7 +812,7 @@ wxDos2UnixFilename (char *s) { if (*s == '\\') *s = '/'; -#ifdef __WINDOWS__ +#ifdef __WXMSW__ else *s = wxToLower (*s); // Case INDEPENDENT #endif @@ -721,10 +821,14 @@ wxDos2UnixFilename (char *s) } void +#ifdef __WXMSW__ wxUnix2DosFilename (char *s) +#else +wxUnix2DosFilename (char *WXUNUSED(s)) +#endif { // Yes, I really mean this to happen under DOS only! JACS -#ifdef __WINDOWS__ +#ifdef __WXMSW__ if (s) while (*s) { @@ -741,13 +845,26 @@ 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 +#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); @@ -781,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; @@ -800,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); @@ -814,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 @@ -824,9 +966,15 @@ 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(__WINDOWS__) +#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 return (mkdir(WXSTRINGCAST dir) == 0); @@ -837,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 @@ -847,7 +999,7 @@ bool wxDirExists(const wxString& dir) { #ifdef __VMS__ return FALSE; -#elif !defined(__WINDOWS__) +#elif !defined(__WXMSW__) struct stat sbuf; return (stat(dir, &sbuf) != -1) && S_ISDIR(sbuf.st_mode) ? TRUE : FALSE; #else @@ -922,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) { @@ -941,9 +1093,9 @@ 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 NULL; + return (char *) NULL; #endif } @@ -955,8 +1107,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 @@ -984,23 +1136,23 @@ 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) { #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) - return NULL; + return (char *) NULL; // Find path only so we can concatenate // found file onto path @@ -1044,14 +1196,14 @@ char *wxFindNextFile(void) } } closedir(wxDirStream); - wxDirStream = NULL; + wxDirStream = (DIR *) NULL; #endif // ifndef __VMS__ - return NULL; + return (char *) NULL; } -#elif defined(__WINDOWS__) +#elif defined(__WXMSW__) #ifdef __WIN32__ HANDLE wxFileStrucHandle = INVALID_HANDLE_VALUE; @@ -1216,7 +1368,7 @@ char *wxFindNextFile(void) } #endif - // __WINDOWS__ + // __WXMSW__ // Get current working directory. // If buf is NULL, allocates space using new, else @@ -1225,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) { @@ -1238,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__) @@ -1285,7 +1437,7 @@ bool wxFindFileInPath(wxString *pStr, const char *pszPath, const char *pszFile) { // we assume that it's not empty wxCHECK_MSG( !IsEmpty(pszFile), FALSE, - "empty file name in wxFindFileInPath"); + _("empty file name in wxFindFileInPath")); // skip path separator in the beginning of the file name if present if ( wxIsPathSeparator(*pszFile) ) @@ -1297,7 +1449,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) ) @@ -1315,3 +1467,213 @@ bool wxFindFileInPath(wxString *pStr, const char *pszPath, const char *pszFile) return pc != NULL; // if true => we breaked from the loop } +void WXDLLEXPORT wxSplitPath(const char *pszFileName, + wxString *pstrPath, + wxString *pstrName, + wxString *pstrExt) +{ + wxCHECK_RET( pszFileName, _("NULL file name in wxSplitPath") ); + + const char *pDot = strrchr(pszFileName, FILE_SEP_EXT); + const char *pSepUnix = strrchr(pszFileName, FILE_SEP_PATH_UNIX); + const char *pSepDos = strrchr(pszFileName, FILE_SEP_PATH_DOS); + + // take the last of the two + size_t nPosUnix = pSepUnix ? pSepUnix - pszFileName : 0; + size_t nPosDos = pSepDos ? pSepDos - pszFileName : 0; + if ( nPosDos > nPosUnix ) + nPosUnix = nPosDos; +// size_t nLen = Strlen(pszFileName); + + if ( pstrPath ) + *pstrPath = wxString(pszFileName, nPosUnix); + if ( pDot ) { + size_t nPosDot = pDot - pszFileName; + if ( pstrName ) + *pstrName = wxString(pszFileName + nPosUnix + 1, nPosDot - nPosUnix); + if ( pstrExt ) + *pstrExt = wxString(pszFileName + nPosDot + 1); + } + else { + if ( pstrName ) + *pstrName = wxString(pszFileName + nPosUnix + 1); + if ( pstrExt ) + 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; +}; + +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); + 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 + +#ifdef _MSC_VER + #pragma warning(default:4706) // assignment within conditional expression +#endif // VC++