X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7a893a3152a6ac676b0409320daef188a7be1b7b..db6d3918916e601fe06b9fbffc2969d57e5e68f2:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index fc1dc7dc95..d1d0efe243 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: filefn.cpp +// Name: src/common/filefn.cpp // Purpose: File- and directory-related functions // Author: Julian Smart // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "filefn.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #include "wx/defs.h" @@ -44,7 +40,7 @@ #include #include #include -#if !defined(__WATCOMC__) +#if !wxONLY_WATCOM_EARLIER_THAN(1,4) #if !(defined(_MSC_VER) && (_MSC_VER > 800)) #include #endif @@ -246,8 +242,7 @@ bool wxPathList::Member (const wxString& path) wxString wxPathList::FindValidPath (const wxString& file) { - if (wxFileExists (wxExpandPath(wxFileFunctionsBuffer, file))) - return wxString(wxFileFunctionsBuffer); + wxExpandPath(wxFileFunctionsBuffer, file); wxChar buf[_MAXPATHLEN]; wxStrcpy(buf, wxFileFunctionsBuffer); @@ -280,8 +275,7 @@ wxString wxPathList::FindAbsoluteValidPath (const wxString& file) if ( f.empty() || wxIsAbsolutePath(f) ) return f; - wxString buf; - wxGetWorkingDirectory(wxStringBuffer(buf, _MAXPATHLEN), _MAXPATHLEN); + wxString buf = ::wxGetCwd(); if ( !wxEndsWithPathSeparator(buf) ) { @@ -306,7 +300,12 @@ wxFileExists (const wxString& filename) #else // !__WIN32__ wxStructStat st; #ifndef wxNEED_WX_UNISTD_H - return wxStat( filename.fn_str() , &st) == 0 && (st.st_mode & S_IFREG); + return (wxStat( filename.fn_str() , &st) == 0 && (st.st_mode & S_IFREG)) +#ifdef __OS2__ + || (errno == EACCES) // if access is denied something with that name + // exists and is opened in exclusive mode. +#endif + ; #else return wxStat( filename , &st) == 0 && (st.st_mode & S_IFREG); #endif @@ -369,8 +368,8 @@ void wxStripExtension(wxChar *buffer) void wxStripExtension(wxString& buffer) { //RN: Be careful about the handling the case where - //buffer.Length() == 0 - for(size_t i = buffer.Length() - 1; i != wxString::npos; --i) + //buffer.length() == 0 + for(size_t i = buffer.length() - 1; i != wxString::npos; --i) { if (buffer.GetChar(i) == wxT('.')) { @@ -436,28 +435,38 @@ wxChar *wxRealPath (wxChar *path) return path; } +wxString wxRealPath(const wxString& path) +{ + wxChar *buf1=MYcopystring(path); + wxChar *buf2=wxRealPath(buf1); + wxString buf(buf2); + delete [] buf1; + return buf; +} + + // Must be destroyed wxChar *wxCopyAbsolutePath(const wxString& filename) { - if (filename.empty()) - return (wxChar *) NULL; + if (filename.empty()) + return (wxChar *) NULL; - if (! wxIsAbsolutePath(wxExpandPath(wxFileFunctionsBuffer, filename))) { - wxChar buf[_MAXPATHLEN]; - buf[0] = wxT('\0'); - wxGetWorkingDirectory(buf, WXSIZEOF(buf)); - wxChar ch = buf[wxStrlen(buf) - 1]; + if (! wxIsAbsolutePath(wxExpandPath(wxFileFunctionsBuffer, filename))) + { + wxString buf = ::wxGetCwd(); + wxChar ch = buf.Last(); #ifdef __WXMSW__ - if (ch != wxT('\\') && ch != wxT('/')) - wxStrcat(buf, wxT("\\")); + if (ch != wxT('\\') && ch != wxT('/')) + buf << wxT("\\"); #else - if (ch != wxT('/')) - wxStrcat(buf, wxT("/")); + if (ch != wxT('/')) + buf << wxT("/"); #endif - wxStrcat(buf, wxFileFunctionsBuffer); - return MYcopystring( wxRealPath(buf) ); - } - return MYcopystring( wxFileFunctionsBuffer ); + buf << wxFileFunctionsBuffer; + buf = wxRealPath( buf ); + return MYcopystring( buf ); + } + return MYcopystring( wxFileFunctionsBuffer ); } /*- @@ -546,7 +555,7 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) while ((*d++ = *s) != 0) { # ifndef __WXMSW__ if (*s == wxT('\\')) { - if ((*(d - 1) = *++s)) { + if ((*(d - 1) = *++s)!=0) { s++; continue; } else @@ -612,11 +621,14 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) nnm = *s ? s + 1 : s; *s = 0; // FIXME: wxGetUserHome could return temporary storage in Unicode mode - if ((home = WXSTRINGCAST wxGetUserHome(wxString(nm + 1))) == NULL) { - if (was_sep) /* replace only if it was there: */ - *s = SEP; + if ((home = WXSTRINGCAST wxGetUserHome(wxString(nm + 1))) == NULL) + { + if (was_sep) /* replace only if it was there: */ + *s = SEP; s = NULL; - } else { + } + else + { nm = nnm; s = home; } @@ -791,7 +803,7 @@ wxString wxPathOnly (const wxString& path) // Local copy wxStrcpy (buf, WXSTRINGCAST path); - int l = path.Length(); + int l = path.length(); int i = l - 1; // Search backward for a backward or forward slash @@ -1229,7 +1241,13 @@ bool wxDirExists(const wxChar *pszPathName) return (ret != (DWORD)-1) && (ret & FILE_ATTRIBUTE_DIRECTORY); #elif defined(__OS2__) - return (bool)(::DosSetCurrentDir((PSZ)(WXSTRINGCAST strPath))); + FILESTATUS3 Info = {{0}}; + APIRET rc = ::DosQueryPathInfo((PSZ)(WXSTRINGCAST strPath), FIL_STANDARD, + (void*) &Info, sizeof(FILESTATUS3)); + + return ((rc == NO_ERROR) && (Info.attrFile & FILE_DIRECTORY)) || + (rc == ERROR_SHARING_VIOLATION); + // If we got a sharing violation, there must be something with this name. #else // !__WIN32__ wxStructStat st; @@ -1332,18 +1350,22 @@ wxString wxFindNextFile() // Get current working directory. -// If buf is NULL, allocates space using new, else -// copies into buf. -wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) +// If buf is NULL, allocates space using new, else copies into buf. +// wxGetWorkingDirectory() is obsolete, use wxGetCwd() +// wxDoGetCwd() is their common core to be moved +// to wxGetCwd() once wxGetWorkingDirectory() will be removed. +// Do not expose wxDoGetCwd in headers! + +wxChar *wxDoGetCwd(wxChar *buf, int sz) { #if defined(__WXPALMOS__) - // TODO ? - return NULL; + // TODO + if(buf && sz>0) buf[0] = _T('\0'); + return buf; #elif defined(__WXWINCE__) // TODO - wxUnusedVar(buf); - wxUnusedVar(sz); - return NULL; + if(buf && sz>0) buf[0] = _T('\0'); + return buf; #else if ( !buf ) { @@ -1360,10 +1382,6 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) bool needsANSI = true; #if !defined(HAVE_WGETCWD) || wxUSE_UNICODE_MSLU - // This is not legal code as the compiler - // is allowed destroy the wxCharBuffer. - // wxCharBuffer c_buffer(sz); - // char *cbuf = (char*)(const char*)c_buffer; char cbuf[_MAXPATHLEN]; #endif @@ -1449,7 +1467,13 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) #if defined( __CYGWIN__ ) && defined( __WINDOWS__ ) // another example of DOS/Unix mix (Cygwin) wxString pathUnix = buf; +#if wxUSE_UNICODE + char bufA[_MAXPATHLEN]; + cygwin_conv_to_full_win32_path(pathUnix.mb_str(wxConvFile), bufA); + wxConvFile.MB2WC(buf, bufA, sz); +#else cygwin_conv_to_full_win32_path(pathUnix, buf); +#endif // wxUSE_UNICODE #endif // __CYGWIN__ } @@ -1463,13 +1487,17 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) // __WXWINCE__ } -wxString wxGetCwd() +#if WXWIN_COMPATIBILITY_2_6 +wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) { - wxChar *buffer = new wxChar[_MAXPATHLEN]; - wxGetWorkingDirectory(buffer, _MAXPATHLEN); - wxString str( buffer ); - delete [] buffer; + return wxDoGetCwd(buf,sz); +} +#endif // WXWIN_COMPATIBILITY_2_6 +wxString wxGetCwd() +{ + wxString str; + wxDoGetCwd(wxStringBuffer(str, _MAXPATHLEN), _MAXPATHLEN); return str; } @@ -1778,123 +1806,123 @@ bool wxIsWild( const wxString& pattern ) bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) { - if (text.empty()) + if (text.empty()) + { + /* Match if both are empty. */ + return pat.empty(); + } + + 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('*')) { - /* Match if both are empty. */ - return pat.empty(); + ma = ++m; + na = n; + just = 1; + mp = NULL; + acount = count; } - - 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('.'))) + else if (*m == wxT('?')) { - /* Never match so that hidden Unix files - * are never found. */ + m++; + if (!*n++) return false; } - - for (;;) + else { - if (*m == wxT('*')) + if (*m == wxT('\\')) + { + m++; + /* Quoting "nothing" is a bad thing */ + if (!*m) + return false; + } + 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) { - ma = ++m; - na = n; - just = 1; + m = mp; + if (*np == wxT(' ')) + { mp = NULL; - acount = count; - } - else if (*m == wxT('?')) - { - m++; - if (!*n++) - return false; + goto check_percent; + } + n = ++np; + count = pcount; } else - { - if (*m == wxT('\\')) - { - m++; - /* Quoting "nothing" is a bad thing */ - if (!*m) - return false; - } - 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 - { + check_percent: - 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 (ma) + { + m = ma; + n = ++na; + count = acount; } + else + return false; + } } + } } // Return the type of an open file @@ -1960,12 +1988,11 @@ wxFileKind wxGetFileKind(FILE *fp) { // Note: The watcom rtl dll doesn't have fileno (the static lib does). // Should be fixed in version 1.4. -#if defined(wxFILEKIND_STUB) || \ - (defined(__WATCOMC__) && __WATCOMC__ <= 1230 && defined(__SW_BR)) +#if defined(wxFILEKIND_STUB) || wxONLY_WATCOM_EARLIER_THAN(1,4) (void)fp; return wxFILE_KIND_DISK; #else - return wxGetFileKind(fileno(fp)); + return fp ? wxGetFileKind(fileno(fp)) : wxFILE_KIND_UNKNOWN; #endif }