From a2d657721094e31f1f17ae0bd406bbe36bbc9e98 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 20 Mar 2013 07:43:19 -0400 Subject: move path_expand() and search_path_expand() into libpbd, and use them to expand search paths given to pathscanner objects (always) --- libs/ardour/ardour/session_configuration_vars.h | 6 +- libs/ardour/ardour/utils.h | 2 - libs/ardour/session_configuration.cc | 3 +- libs/ardour/utils.cc | 106 ------------------------ libs/pbd/pathscanner.cc | 3 +- libs/pbd/pbd/basename.h | 13 ++- libs/pbd/wscript | 1 + 7 files changed, 13 insertions(+), 121 deletions(-) diff --git a/libs/ardour/ardour/session_configuration_vars.h b/libs/ardour/ardour/session_configuration_vars.h index 1f8b2356d1..cce4bf86d7 100644 --- a/libs/ardour/ardour/session_configuration_vars.h +++ b/libs/ardour/ardour/session_configuration_vars.h @@ -38,9 +38,9 @@ CONFIG_VARIABLE (bool, punch_in, "punch-in", false) CONFIG_VARIABLE (bool, punch_out, "punch-out", false) CONFIG_VARIABLE (uint32_t, subframes_per_frame, "subframes-per-frame", 100) CONFIG_VARIABLE (Timecode::TimecodeFormat, timecode_format, "timecode-format", Timecode::timecode_30) -CONFIG_VARIABLE_SPECIAL(std::string, raid_path, "raid-path", "", path_expand) -CONFIG_VARIABLE_SPECIAL(std::string, audio_search_path, "audio-search-path", "", search_path_expand) -CONFIG_VARIABLE_SPECIAL(std::string, midi_search_path, "midi-search-path", "", search_path_expand) +CONFIG_VARIABLE_SPECIAL(std::string, raid_path, "raid-path", "", PBD::path_expand) +CONFIG_VARIABLE_SPECIAL(std::string, audio_search_path, "audio-search-path", "", PBD::search_path_expand) +CONFIG_VARIABLE_SPECIAL(std::string, midi_search_path, "midi-search-path", "", PBD::search_path_expand) CONFIG_VARIABLE (bool, jack_time_master, "jack-time-master", true) CONFIG_VARIABLE (bool, use_video_sync, "use-video-sync", false) CONFIG_VARIABLE (float, video_pullup, "video-pullup", 0.0f) diff --git a/libs/ardour/ardour/utils.h b/libs/ardour/ardour/utils.h index 7223d1f8ec..0aa4193394 100644 --- a/libs/ardour/ardour/utils.h +++ b/libs/ardour/ardour/utils.h @@ -60,8 +60,6 @@ int cmp_nocase (const std::string& s, const std::string& s2); int touch_file(std::string path); -std::string path_expand (std::string); /* single file path */ -std::string search_path_expand (std::string); /* colon-separated search path */ std::string region_name_from_path (std::string path, bool strip_channels, bool add_channel_suffix = false, uint32_t total = 0, uint32_t this_one = 0); bool path_is_paired (std::string path, std::string& pair_base); diff --git a/libs/ardour/session_configuration.cc b/libs/ardour/session_configuration.cc index cfb6fb8668..0cfdb52872 100644 --- a/libs/ardour/session_configuration.cc +++ b/libs/ardour/session_configuration.cc @@ -17,8 +17,9 @@ */ +#include "pbd/pathexpand.h" + #include "ardour/types.h" -#include "ardour/utils.h" #include "ardour/session_configuration.h" #include "i18n.h" diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc index ad0823ddaf..aedc78988f 100644 --- a/libs/ardour/utils.cc +++ b/libs/ardour/utils.cc @@ -307,112 +307,6 @@ path_is_paired (string path, string& pair_base) return false; } -string -path_expand (string path) -{ - if (path.empty()) { - return path; - } - - /* tilde expansion */ - - if (path[0] == '~') { - if (path.length() == 1) { - return Glib::get_home_dir(); - } - - if (path[1] == '/') { - path.replace (0, 1, Glib::get_home_dir()); - } else { - /* can't handle ~roger, so just leave it */ - } - } - - /* now do $VAR substitution, since wordexp isn't reliable */ - - regex_t compiled_pattern; - const int nmatches = 100; - regmatch_t matches[nmatches]; - - if (regcomp (&compiled_pattern, "\\$([a-zA-Z_][a-zA-Z0-9_]*|\\{[a-zA-Z_][a-zA-Z0-9_]*\\})", REG_EXTENDED)) { - cerr << "bad regcomp\n"; - return path; - } - - while (true) { - - if (regexec (&compiled_pattern, path.c_str(), nmatches, matches, 0)) { - break; - } - - /* matches[0] gives the entire match */ - - string match = path.substr (matches[0].rm_so, matches[0].rm_eo - matches[0].rm_so); - - /* try to get match from the environment */ - - if (match[1] == '{') { - /* ${FOO} form */ - match = match.substr (2, match.length() - 3); - } - - char* matched_value = getenv (match.c_str()); - - if (matched_value) { - path.replace (matches[0].rm_so, matches[0].rm_eo - matches[0].rm_so, matched_value); - } else { - path.replace (matches[0].rm_so, matches[0].rm_eo - matches[0].rm_so, string()); - } - - /* go back and do it again with whatever remains after the - * substitution - */ - } - - regfree (&compiled_pattern); - - /* canonicalize */ - - char buf[PATH_MAX+1]; - - if (realpath (path.c_str(), buf)) { - return buf; - } else { - return string(); - } -} - -string -search_path_expand (string path) -{ - if (path.empty()) { - return path; - } - - vector s; - vector n; - - split (path, s, ':'); - - for (vector::iterator i = s.begin(); i != s.end(); ++i) { - string exp = path_expand (*i); - if (!exp.empty()) { - n.push_back (exp); - } - } - - string r; - - for (vector::iterator i = n.begin(); i != n.end(); ++i) { - if (!r.empty()) { - r += ':'; - } - r += *i; - } - - return r; -} - #if __APPLE__ string CFStringRefToStdString(CFStringRef stringRef) diff --git a/libs/pbd/pathscanner.cc b/libs/pbd/pathscanner.cc index 8f57726c7f..fac2dcfd96 100644 --- a/libs/pbd/pathscanner.cc +++ b/libs/pbd/pathscanner.cc @@ -29,6 +29,7 @@ #include #include "pbd/error.h" +#include "pbd/pathexpand.h" #include "pbd/pathscanner.h" #include "pbd/stl_delete.h" @@ -90,7 +91,7 @@ PathScanner::run_scan_internal (vector *result, { DIR *dir; struct dirent *finfo; - char *pathcopy = strdup (dirpath.c_str()); + char *pathcopy = strdup (search_path_expand (dirpath).c_str()); char *thisdir; string fullpath; string search_str; diff --git a/libs/pbd/pbd/basename.h b/libs/pbd/pbd/basename.h index f13c3840dc..290af2e4bf 100644 --- a/libs/pbd/pbd/basename.h +++ b/libs/pbd/pbd/basename.h @@ -17,16 +17,13 @@ */ -#ifndef __stupid_basename_h__ -#define __stupid_basename_h__ +#ifndef __libpbd_basename_h__ +#define __libdpbd_basename_h__ #include -namespace PBD -{ - -Glib::ustring basename_nosuffix (Glib::ustring); - +namespace PBD { + Glib::ustring basename_nosuffix (Glib::ustring); } -#endif // __stupid_basename_h__ +#endif /* __libdpbd_basename_h__ */ diff --git a/libs/pbd/wscript b/libs/pbd/wscript index eb88809f53..0ec2747cb3 100644 --- a/libs/pbd/wscript +++ b/libs/pbd/wscript @@ -86,6 +86,7 @@ def build(bld): malign.cc mountpoint.cc openuri.cc + pathexpand.cc pathscanner.cc pool.cc property_list.cc -- cgit v1.2.3