wxPathList cleanup by Francesco (patch 1521481)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40298 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2006-07-25 00:16:55 +00:00
parent da87911d65
commit 8daf3c3664
3 changed files with 97 additions and 112 deletions

View File

@@ -34,6 +34,8 @@
#include "wx/filename.h"
#include "wx/dir.h"
#include "wx/tokenzr.h"
// there are just too many of those...
#ifdef __VISUALC__
#pragma warning(disable:4706) // assignment within conditional expression
@@ -144,23 +146,21 @@ WXDLLEXPORT int wxOpen( const wxChar *pathname, int flags, mode_t mode )
// wxPathList
// ----------------------------------------------------------------------------
// IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList)
static inline wxChar* MYcopystring(const wxString& s)
{
wxChar* copy = new wxChar[s.length() + 1];
return wxStrcpy(copy, s.c_str());
}
static inline wxChar* MYcopystring(const wxChar* s)
{
wxChar* copy = new wxChar[wxStrlen(s) + 1];
return wxStrcpy(copy, s);
}
void wxPathList::Add (const wxString& path)
{
wxStringList::Add (WXSTRINGCAST path);
// add only the path part of the given string (not the filename, in case it's present)
wxFileName fn(path + wxFileName::GetPathSeparator());
fn.Normalize(); // add only normalized paths
wxString toadd = fn.GetPath();
if (Index(toadd) == wxNOT_FOUND)
wxArrayString::Add(toadd); // do not add duplicates
}
void wxPathList::Add(const wxArrayString &arr)
{
for (size_t j=0; j < arr.GetCount(); j++)
Add(arr[j]);
}
// Add paths e.g. from the PATH environment variable
@@ -168,43 +168,24 @@ void wxPathList::AddEnvList (const wxString& WXUNUSED_IN_WINCE(envVariable))
{
// No environment variables on WinCE
#ifndef __WXWINCE__
// The space has been removed from the tokenizers, otherwise a
// path such as "C:\Program Files" would be split into 2 paths:
// "C:\Program" and "Files"; this is true for both Windows and Unix.
static const wxChar PATH_TOKS[] =
#if defined(__WINDOWS__) || defined(__OS2__)
/*
The space has been removed from the tokenizers, otherwise a
path such as "C:\Program Files" would be split into 2 paths:
"C:\Program" and "Files"
*/
// wxT(" ;"); // Don't separate with colon in DOS (used for drive)
wxT(";"); // Don't separate with colon in DOS (used for drive)
#else
wxT(" :;");
wxT(":;");
#endif
wxString val ;
if (wxGetEnv (WXSTRINGCAST envVariable, &val))
wxString val;
if ( wxGetEnv(envVariable, &val) )
{
wxChar *s = MYcopystring (val);
wxChar *save_ptr, *token = wxStrtok (s, PATH_TOKS, &save_ptr);
if (token)
{
Add(token);
while (token)
{
if ( (token = wxStrtok ((wxChar *) NULL, PATH_TOKS, &save_ptr))
!= NULL )
{
Add(token);
}
}
}
// suppress warning about unused variable save_ptr when wxStrtok() is a
// macro which throws away its third argument
save_ptr = token;
delete [] s;
// split into an array of string the value of the env var
wxArrayString arr = wxStringTokenize(val, PATH_TOKS);
WX_APPEND_ARRAY(*this, arr);
}
#endif // !__WXWINCE__
}
@@ -217,60 +198,42 @@ void wxPathList::EnsureFileAccessible (const wxString& path)
wxString path_only(wxPathOnly(path));
if ( !path_only.empty() )
{
if ( !Member(path_only) )
if ( Index(path_only) == wxNOT_FOUND )
Add(path_only);
}
}
bool wxPathList::Member (const wxString& path)
// deprecated !
bool wxPathList::Member (const wxString& path) const
{
for (wxStringList::compatibility_iterator node = GetFirst(); node; node = node->GetNext())
{
wxString path2( node->GetData() );
if (
#if defined(__WINDOWS__) || defined(__OS2__) || defined(__VMS__) || defined(__WXMAC__)
// Case INDEPENDENT
path.CompareTo (path2, wxString::ignoreCase) == 0
#else
// Case sensitive File System
path.CompareTo (path2) == 0
#endif
)
return true;
}
return false;
return Index(path) != wxNOT_FOUND;
}
wxString wxPathList::FindValidPath (const wxString& file)
wxString wxPathList::FindValidPath (const wxString& file) const
{
wxExpandPath(wxFileFunctionsBuffer, file);
wxFileName fn(file);
wxString strend;
wxChar buf[_MAXPATHLEN];
wxStrcpy(buf, wxFileFunctionsBuffer);
fn.Normalize();
if (fn.IsAbsolute())
strend = fn.GetFullName();
else
strend = fn.GetFullPath();
wxChar *filename = wxIsAbsolutePath (buf) ? wxFileNameFromPath (buf) : (wxChar *)buf;
for (wxStringList::compatibility_iterator node = GetFirst(); node; node = node->GetNext())
for (size_t i=0; i<GetCount(); i++)
{
const wxString 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__
wxUnix2DosFilename (wxFileFunctionsBuffer);
#endif
if (wxFileExists (wxFileFunctionsBuffer))
{
return wxString(wxFileFunctionsBuffer); // Found!
}
} // for()
wxString strstart = Item(i);
if (!strstart.IsEmpty() && strstart.Last() != wxFileName::GetPathSeparator())
strstart += wxFileName::GetPathSeparator();
return wxEmptyString; // Not found
if (wxFileExists(strstart + strend))
return strstart + strend; // Found!
}
return wxEmptyString; // Not found
}
wxString wxPathList::FindAbsoluteValidPath (const wxString& file)
wxString wxPathList::FindAbsoluteValidPath (const wxString& file) const
{
wxString f = FindValidPath(file);
if ( f.empty() || wxIsAbsolutePath(f) )
@@ -287,6 +250,23 @@ wxString wxPathList::FindAbsoluteValidPath (const wxString& file)
return buf;
}
// ----------------------------------------------------------------------------
// miscellaneous global functions (TOFIX!)
// ----------------------------------------------------------------------------
static inline wxChar* MYcopystring(const wxString& s)
{
wxChar* copy = new wxChar[s.length() + 1];
return wxStrcpy(copy, s.c_str());
}
static inline wxChar* MYcopystring(const wxChar* s)
{
wxChar* copy = new wxChar[wxStrlen(s) + 1];
return wxStrcpy(copy, s);
}
bool
wxFileExists (const wxString& filename)
{