/*
- 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>
+
+#include <glib.h>
#include <glibmm/miscutils.h>
#include "pbd/tokenizer.h"
using namespace std;
-namespace {
-
-#ifdef PLATFORM_WINDOWS
-const char * const path_delimiter = ";";
-#else
-const char * const path_delimiter = ":";
-#endif
-
-}
-
namespace PBD {
Searchpath::Searchpath ()
{
vector<std::string> tmp;
- if (tokenize (path, string(path_delimiter), std::back_inserter (tmp))) {
+ if (tokenize (path, string(G_SEARCHPATH_SEPARATOR_S), std::back_inserter (tmp))) {
add_directories (tmp);
}
}
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
for (vector<std::string>::const_iterator i = begin(); i != end(); ++i) {
path += *i;
- path += path_delimiter;
+ path += G_SEARCHPATH_SEPARATOR;
}
path = path.substr (0, path.length() - 1); // drop final separator
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
+export_search_path (const string& base_dir, const char* varname, const char* dir)
+{
+ string path;
+ const char * cstr = g_getenv (varname);
+
+ if (cstr) {
+ path = cstr;
+ path += G_SEARCHPATH_SEPARATOR;
+ } else {
+ path = "";
+ }
+ path += base_dir;
+ path += dir;
+
+ g_setenv (varname, path.c_str(), 1);
+}
+
} // namespace PBD