move path_expand() and search_path_expand() into libpbd, and use them to expand search paths given to pathscanner objects (always)

This commit is contained in:
Paul Davis 2013-03-20 07:43:19 -04:00
parent b2a667266b
commit a2d6577210
7 changed files with 13 additions and 121 deletions

View file

@ -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)

View file

@ -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);

View file

@ -17,8 +17,9 @@
*/
#include "pbd/pathexpand.h"
#include "ardour/types.h"
#include "ardour/utils.h"
#include "ardour/session_configuration.h"
#include "i18n.h"

View file

@ -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<string> s;
vector<string> n;
split (path, s, ':');
for (vector<string>::iterator i = s.begin(); i != s.end(); ++i) {
string exp = path_expand (*i);
if (!exp.empty()) {
n.push_back (exp);
}
}
string r;
for (vector<string>::iterator i = n.begin(); i != n.end(); ++i) {
if (!r.empty()) {
r += ':';
}
r += *i;
}
return r;
}
#if __APPLE__
string
CFStringRefToStdString(CFStringRef stringRef)

View file

@ -29,6 +29,7 @@
#include <glibmm/miscutils.h>
#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<string *> *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;

View file

@ -17,16 +17,13 @@
*/
#ifndef __stupid_basename_h__
#define __stupid_basename_h__
#ifndef __libpbd_basename_h__
#define __libdpbd_basename_h__
#include <glibmm/ustring.h>
namespace PBD
{
Glib::ustring basename_nosuffix (Glib::ustring);
namespace PBD {
Glib::ustring basename_nosuffix (Glib::ustring);
}
#endif // __stupid_basename_h__
#endif /* __libdpbd_basename_h__ */

View file

@ -86,6 +86,7 @@ def build(bld):
malign.cc
mountpoint.cc
openuri.cc
pathexpand.cc
pathscanner.cc
pool.cc
property_list.cc