*/
+#include <string>
+
+#include <glib.h>
+#include <glibmm/miscutils.h>
+
#include "pbd/tokenizer.h"
#include "pbd/search_path.h"
#include "pbd/error.h"
-namespace {
-
-#ifdef WIN32
-const char * const path_delimiter = ";";
-#else
-const char * const path_delimiter = ":";
-#endif
-
-}
+using namespace std;
namespace PBD {
-SearchPath::SearchPath ()
+Searchpath::Searchpath ()
{
}
-SearchPath::SearchPath (const string& path)
+Searchpath::Searchpath (const string& path)
{
- vector<sys::path> tmp;
+ 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);
}
}
-SearchPath::SearchPath (const sys::path& directory_path)
-{
- add_directory (directory_path);
-}
-
-SearchPath::SearchPath (const vector<sys::path>& paths)
+Searchpath::Searchpath (const vector<std::string>& paths)
{
add_directories (paths);
}
void
-SearchPath::add_directory (const sys::path& directory_path)
+Searchpath::add_directory (const std::string& directory_path)
{
- // test for existance and warn etc?
- push_back(directory_path);
+ if (!directory_path.empty()) {
+ push_back(directory_path);
+ }
}
void
-SearchPath::add_directories (const vector<sys::path>& paths)
+Searchpath::add_directories (const vector<std::string>& paths)
{
- for(vector<sys::path>::const_iterator i = paths.begin(); i != paths.end(); ++i) {
+ for(vector<std::string>::const_iterator i = paths.begin(); i != paths.end(); ++i) {
add_directory (*i);
}
}
const string
-SearchPath::to_string () const
+Searchpath::to_string () const
{
string path;
- for (vector<sys::path>::const_iterator i = begin(); i != end(); ++i) {
- path += (*i).to_string();
- path += path_delimiter;
+ for (vector<std::string>::const_iterator i = begin(); i != end(); ++i) {
+ path += *i;
+ path += G_SEARCHPATH_SEPARATOR;
}
path = path.substr (0, path.length() - 1); // drop final separator
return path;
}
-SearchPath&
-SearchPath::operator+= (const SearchPath& spath)
+Searchpath&
+Searchpath::operator+= (const Searchpath& spath)
{
insert(end(), spath.begin(), spath.end());
return *this;
}
-SearchPath&
-SearchPath::operator+= (const sys::path& directory_path)
+Searchpath&
+Searchpath::operator+= (const std::string& directory_path)
{
add_directory (directory_path);
return *this;
}
-SearchPath&
-SearchPath::operator+ (const sys::path& directory_path)
+Searchpath&
+Searchpath::operator+ (const std::string& directory_path)
{
add_directory (directory_path);
return *this;
}
-SearchPath&
-SearchPath::operator+ (const SearchPath& spath)
+Searchpath&
+Searchpath::operator+ (const Searchpath& spath)
{
- // concatenate paths into new SearchPath
+ // concatenate paths into new Searchpath
insert(end(), spath.begin(), spath.end());
return *this;
}
-SearchPath&
-SearchPath::add_subdirectory_to_paths (const string& subdir)
+Searchpath&
+Searchpath::add_subdirectory_to_paths (const string& subdir)
{
- for (vector<sys::path>::iterator i = begin(); i != end(); ++i) {
+ for (vector<std::string>::iterator i = begin(); i != end(); ++i) {
// should these new paths just be added to the end of
// the search path rather than replace?
- *i /= subdir;
+ *i = Glib::build_filename (*i, subdir);
}
return *this;
}
+/* 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 += ':';
+ } else {
+ path = "";
+ }
+ path += base_dir;
+ path += dir;
+
+ g_setenv (varname, path.c_str(), 1);
+}
+
} // namespace PBD