From 8daf3c366409ae9b9f657370c43cc15896704b14 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Tue, 25 Jul 2006 00:16:55 +0000
Subject: [PATCH] wxPathList cleanup by Francesco (patch 1521481)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40298 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/pathlist.tex |  35 +++++----
 include/wx/filefn.h        |  24 ++++---
 src/common/filefn.cpp      | 144 ++++++++++++++++---------------------
 3 files changed, 94 insertions(+), 109 deletions(-)

diff --git a/docs/latex/wx/pathlist.tex b/docs/latex/wx/pathlist.tex
index 594043820d..b74547fea1 100644
--- a/docs/latex/wx/pathlist.tex
+++ b/docs/latex/wx/pathlist.tex
@@ -6,13 +6,12 @@ in those directories.  Storing the filename only in an application's files and
 using a locally-defined list of directories makes the application and its files more
 portable.
 
-Use the {\it wxFileNameFromPath} global function to extract the filename
-from the path.
+Use the \helpref{wxFileName::SplitPath}{wxfilenamesplitpath} global function 
+to extract the filename from the path.
 
 \wxheading{Derived from}
 
-\helpref{wxList}{wxlist}\\
-\helpref{wxObject}{wxobject}
+\helpref{wxArrayString}{wxarraystring}
 
 \wxheading{Include files}
 
@@ -20,7 +19,7 @@ from the path.
 
 \wxheading{See also}
 
-\helpref{wxList}{wxlist}
+\helpref{wxArrayString}{wxarraystring}
 
 \latexignore{\rtfignore{\wxheading{Members}}}
 
@@ -29,7 +28,11 @@ from the path.
 
 \func{}{wxPathList}{\void}
 
-Constructor.
+Empty constructor.
+
+\func{}{wxPathList}{\param{const wxArrayString\& }{arr}}
+
+Constructs the object calling the \helpref{Add}{wxpathlistadd} function.
 
 
 \membersection{wxPathList::AddEnvList}\label{wxpathlistaddenvlist}
@@ -45,9 +48,12 @@ example.
 
 \func{void}{Add}{\param{const wxString\& }{path}}
 
-Adds the given directory to the path list, but does not
-check if the path was already on the list (use 
-\helpref{wxPathList::Member()}{wxpathlistmember} for this).
+\func{void}{Add}{\param{const wxArrayString\& }{arr}}
+
+The first form adds the given directory (the filename if present is removed)
+to the path list, if the path is not already in the list.
+
+The second form just calls the first form on all elements of the given array.
 
 
 \membersection{wxPathList::EnsureFileAccessible}\label{wxpathlistensurefileaccessible}
@@ -61,7 +67,7 @@ filename and adding the path to the list if not already there.
 
 \membersection{wxPathList::FindAbsoluteValidPath}\label{wxpathlistfindabsolutepath}
 
-\func{wxString}{FindAbsoluteValidPath}{\param{const wxString\& }{file}}
+\constfunc{wxString}{FindAbsoluteValidPath}{\param{const wxString\& }{file}}
 
 Searches for a full path for an existing file by appending {\it file} to
 successive members of the path list.  If the file wasn't found, an empty
@@ -70,16 +76,9 @@ string is returned.
 
 \membersection{wxPathList::FindValidPath}\label{wxpathlistfindvalidpath}
 
-\func{wxString}{FindValidPath}{\param{const wxString\& }{file}}
+\constfunc{wxString}{FindValidPath}{\param{const wxString\& }{file}}
 
 Searches for a full path for an existing file by appending {\it file} to
 successive members of the path list.  If the file wasn't found, an empty string
 is returned. This path may be relative to the current working directory.
 
-
-\membersection{wxPathList::Member}\label{wxpathlistmember}
-
-\func{bool}{Member}{\param{const wxString\& }{file}}
-
-true if the path is in the path list (ignoring case).
-
diff --git a/include/wx/filefn.h b/include/wx/filefn.h
index 3351115ba7..0db4c1e6bb 100644
--- a/include/wx/filefn.h
+++ b/include/wx/filefn.h
@@ -595,29 +595,35 @@ private:
 
 
 // Path searching
-class WXDLLIMPEXP_BASE wxPathList : public wxStringList
+class WXDLLIMPEXP_BASE wxPathList : public wxArrayString
 {
 public:
+    wxPathList() {}
+    wxPathList(const wxArrayString &arr)
+        { Add(arr); }
+
     // avoid GCC warning about virtual functions w/o virtual dtor
     virtual ~wxPathList() {}
 
     // Adds all paths in environment variable
     void AddEnvList(const wxString& envVariable);
 
+    // Adds given path to this list
     void Add(const wxString& path);
+    void Add(const wxArrayString &paths);
+
     // Find the first full path for which the file exists
-    wxString FindValidPath(const wxString& filename);
+    wxString FindValidPath(const wxString& filename) const;
+
     // Find the first full path for which the file exists; ensure it's an
     // absolute path that gets returned.
-    wxString FindAbsoluteValidPath(const wxString& filename);
+    wxString FindAbsoluteValidPath(const wxString& filename) const;
+
     // Given full path and filename, add path to list
     void EnsureFileAccessible(const wxString& path);
-    // Returns true if the path is in the list
-    bool Member(const wxString& path);
 
-private:
-    // DECLARE_DYNAMIC_CLASS(wxPathList)
+    // Returns true if the path is in the list
+    wxDEPRECATED( bool Member(const wxString& path) const );
 };
 
-#endif
-  // _WX_FILEFN_H_
+#endif // _WX_FILEFN_H_
diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp
index 16ca60250d..451ec6d421 100644
--- a/src/common/filefn.cpp
+++ b/src/common/filefn.cpp
@@ -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)
+void wxPathList::Add (const wxString& path)
 {
-    wxChar* copy = new wxChar[s.length() + 1];
-    return wxStrcpy(copy, s.c_str());
-}
+    // 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
 
-static inline wxChar* MYcopystring(const wxChar* s)
-{
-    wxChar* copy = new wxChar[wxStrlen(s) + 1];
-    return wxStrcpy(copy, s);
+    wxString toadd = fn.GetPath();
+    if (Index(toadd) == wxNOT_FOUND)
+        wxArrayString::Add(toadd);      // do not add duplicates
 }
 
-void wxPathList::Add (const wxString& path)
+void wxPathList::Add(const wxArrayString &arr)
 {
-    wxStringList::Add (WXSTRINGCAST path);
+    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);
-
-  wxChar *filename = wxIsAbsolutePath (buf) ? wxFileNameFromPath (buf) : (wxChar *)buf;
+    fn.Normalize();
+    if (fn.IsAbsolute())
+        strend = fn.GetFullName();
+    else
+        strend = fn.GetFullPath();
 
-  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();
+
+        if (wxFileExists(strstart + strend))
+            return strstart + strend;        // Found!
+    }
 
-  return wxEmptyString;                    // Not 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)
 {
-- 
2.50.0

