summaryrefslogtreecommitdiff
path: root/libs/ardour/utils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/utils.cc')
-rw-r--r--libs/ardour/utils.cc72
1 files changed, 58 insertions, 14 deletions
diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc
index 269a78bf4b..fbea468682 100644
--- a/libs/ardour/utils.cc
+++ b/libs/ardour/utils.cc
@@ -37,6 +37,7 @@
#include <pbd/error.h>
#include <pbd/stacktrace.h>
#include <pbd/xml++.h>
+#include <pbd/basename.h>
#include <ardour/utils.h>
#include "i18n.h"
@@ -44,6 +45,7 @@
using namespace ARDOUR;
using namespace std;
using namespace PBD;
+using Glib::ustring;
void
elapsed_time_to_str (char *buf, uint32_t seconds)
@@ -87,6 +89,24 @@ elapsed_time_to_str (char *buf, uint32_t seconds)
}
}
+ustring
+legalize_for_path (ustring str)
+{
+ ustring::size_type pos;
+ ustring legal_chars = "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+=: ";
+ ustring legal;
+
+ legal = str;
+ pos = 0;
+
+ while ((pos = legal.find_first_not_of (legal_chars, pos)) != string::npos) {
+ legal.replace (pos, 1, "_");
+ pos += 1;
+ }
+
+ return legal;
+}
+#if 0
string
legalize_for_path (string str)
{
@@ -104,6 +124,7 @@ legalize_for_path (string str)
return legal;
}
+#endif
ostream&
operator<< (ostream& o, const BBT_Time& bbt)
@@ -177,7 +198,7 @@ tokenize_fullpath (string fullpath, string& path, string& name)
}
int
-touch_file (string path)
+touch_file (ustring path)
{
int fd = open (path.c_str(), O_RDWR|O_CREAT, 0660);
if (fd >= 0) {
@@ -199,10 +220,31 @@ placement_as_string (Placement p)
}
}
-string
-region_name_from_path (string path)
+ustring
+region_name_from_path (ustring path, bool strip_channels)
{
- string::size_type pos;
+ path = PBD::basename_nosuffix (path);
+
+ if (strip_channels) {
+
+ /* remove any "?R", "?L" or "?[a-z]" channel identifier */
+
+ ustring::size_type len = path.length();
+
+ if (len > 3 && (path[len-2] == '%' || path[len-2] == '?' || path[len-2] == '.') &&
+ (path[len-1] == 'R' || path[len-1] == 'L' || (islower (path[len-1])))) {
+
+ path = path.substr (0, path.length() - 2);
+ }
+ }
+
+ return path;
+}
+
+bool
+path_is_paired (ustring path, ustring& pair_base)
+{
+ ustring::size_type pos;
/* remove filename suffixes etc. */
@@ -210,21 +252,23 @@ region_name_from_path (string path)
path = path.substr (0, pos);
}
- /* remove any "?R", "?L" or "?[a-z]" channel identifier */
-
- string::size_type len = path.length();
+ ustring::size_type len = path.length();
+
+ /* look for possible channel identifier: "?R", "%R", ".L" etc. */
- if (len > 3 && (path[len-2] == '%' || path[len-2] == '?') &&
+ if (len > 3 && (path[len-2] == '%' || path[len-2] == '?' || path[len-2] == '.') &&
(path[len-1] == 'R' || path[len-1] == 'L' || (islower (path[len-1])))) {
- path = path.substr (0, path.length() - 2);
- }
+ pair_base = path.substr (0, len-2);
+ return true;
- return path;
-}
+ }
-string
-path_expand (string path)
+ return false;
+}
+
+ustring
+path_expand (ustring path)
{
#ifdef HAVE_WORDEXP
/* Handle tilde and environment variable expansion in session path */