split apart ardour_ui.cc into a series of distinct source modules.
[ardour.git] / libs / pbd / search_path.cc
index fe2087f6b151488c6ab3c68a01a4a996ff47bb78..9e19fce5004ba3eb063cc7ac3e651f6bd07b5e6d 100644 (file)
@@ -1,21 +1,24 @@
 /*
-    Copyright (C) 2007 Tim Mayberry 
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
+ * Copyright (C) 2007-2015 Tim Mayberry <mojofunk@gmail.com>
+ * Copyright (C) 2008-2009 David Robillard <d@drobilla.net>
+ * Copyright (C) 2008-2015 Paul Davis <paul@linuxaudiosystems.com>
+ * Copyright (C) 2013-2014 John Emmas <john@creativepost.co.uk>
+ * Copyright (C) 2014-2015 Robin Gareus <robin@gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
 
 #include <string>
 
@@ -49,12 +52,42 @@ Searchpath::Searchpath (const vector<std::string>& paths)
        add_directories (paths);
 }
 
+void
+Searchpath::remove_directory (const std::string& directory_path)
+{
+       if (directory_path.empty()) {
+               return;
+       }
+
+       for (vector<std::string>::iterator i = begin(); i != end();) {
+               if (*i == directory_path) {
+                       i = erase (i);
+               } else {
+                       ++i;
+               }
+       }
+}
+
+void
+Searchpath::remove_directories (const vector<std::string>& paths)
+{
+       for(vector<std::string>::const_iterator i = paths.begin(); i != paths.end(); ++i) {
+               remove_directory (*i);
+       }
+}
+
 void
 Searchpath::add_directory (const std::string& directory_path)
 {
-       if (!directory_path.empty()) {
-               push_back(directory_path);
+       if (directory_path.empty()) {
+               return;
        }
+       for (vector<std::string>::const_iterator i = begin(); i != end(); ++i) {
+               if (*i == directory_path) {
+                       return;
+               }
+       }
+       push_back(directory_path);
 }
 
 void
@@ -94,38 +127,61 @@ Searchpath::operator+= (const std::string& directory_path)
        return *this;
 }
 
-Searchpath&
+const Searchpath
 Searchpath::operator+ (const std::string& directory_path)
 {
-       add_directory (directory_path);
+       return Searchpath (*this) += directory_path;
+}
+
+const Searchpath
+Searchpath::operator+ (const Searchpath& spath)
+{
+       return Searchpath (*this) += spath;
+}
+
+Searchpath&
+Searchpath::operator-= (const Searchpath& spath)
+{
+       remove_directories (spath);
        return *this;
 }
 
 Searchpath&
-Searchpath::operator+ (const Searchpath& spath)
+Searchpath::operator-= (const std::string& directory_path)
 {
-       // concatenate paths into new Searchpath
-       insert(end(), spath.begin(), spath.end());
+       remove_directory (directory_path);
        return *this;
 }
 
+
 Searchpath&
 Searchpath::add_subdirectory_to_paths (const string& subdir)
 {
        for (vector<std::string>::iterator i = begin(); i != end(); ++i) {
-               // should these new paths just be added to the end of 
+               // should these new paths just be added to the end of
                // the search path rather than replace?
                *i = Glib::build_filename (*i, subdir);
        }
-       
+
        return *this;
 }
 
+bool
+Searchpath::contains (const string& path) const
+{
+       std::vector<std::string>::const_iterator i = find(begin(), end(), path);
+
+       if (i == end()) {
+               return false;
+       }
+       return true;
+}
+
 /* This is not part of the Searchpath object, but is closely related to the
  * whole idea, and we put it here for convenience.
  */
 
-void 
+void
 export_search_path (const string& base_dir, const char* varname, const char* dir)
 {
        string path;
@@ -133,7 +189,7 @@ export_search_path (const string& base_dir, const char* varname, const char* dir
 
        if (cstr) {
                path = cstr;
-               path += ':';
+               path += G_SEARCHPATH_SEPARATOR;
        } else {
                path = "";
        }