en/disable internal send+returns with tracks en/disable.
[ardour.git] / libs / ardour / utils.cc
index ad0823ddaf1947848fc0f3ab1336503716b99af6..d1d2372977c831cc4168240692347bdabc38bd79 100644 (file)
@@ -36,7 +36,9 @@
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <fcntl.h>
+#ifndef COMPILER_MSVC
 #include <dirent.h>
+#endif
 #include <errno.h>
 #include <regex.h>
 
@@ -232,6 +234,41 @@ cmp_nocase (const string& s, const string& s2)
        return (s2.size() == s.size()) ? 0 : (s.size() < s2.size()) ? -1 : 1;
 }
 
+int cmp_nocase_utf8 (const string& s1, const string& s2)
+{
+       const char *cstr1 = s1.c_str();
+       const char *cstr2 = s2.c_str();
+       gchar *cstr1folded = NULL;
+       gchar *cstr2folded = NULL;
+       int retval;
+
+       if (!g_utf8_validate (cstr1, -1, NULL) ||
+               !g_utf8_validate (cstr2, -1, NULL)) {
+               // fall back to comparing ASCII
+               return g_ascii_strcasecmp (cstr1, cstr2);
+       }
+
+       cstr1folded = g_utf8_casefold (cstr1, -1);
+       cstr2folded = g_utf8_casefold (cstr2, -1);
+
+       if (cstr1folded && cstr2folded) {
+               retval = strcmp (cstr1folded, cstr2folded);
+       } else {
+               // this shouldn't happen, make the best of it
+               retval = g_ascii_strcasecmp (cstr1, cstr2);
+       }
+
+       if (cstr1folded) {
+               g_free (cstr1folded);
+       }
+
+       if (cstr2folded) {
+               g_free (cstr2folded);
+       }
+
+       return retval;
+}
+
 int
 touch_file (string path)
 {
@@ -307,112 +344,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)
@@ -501,12 +432,12 @@ string_to_sync_source (string str)
        }
 
        if (str == _("JACK")) {
-               return JACK;
+               return Engine;
        }
 
        fatal << string_compose (_("programming error: unknown sync source string \"%1\""), str) << endmsg;
        /*NOTREACHED*/
-       return JACK;
+       return Engine;
 }
 
 /** @param sh Return a short version of the string */
@@ -514,7 +445,10 @@ const char*
 sync_source_to_string (SyncSource src, bool sh)
 {
        switch (src) {
-       case JACK:
+       case Engine:
+               /* no other backends offer sync for now ... deal with this if we
+                * ever have to.
+                */
                return _("JACK");
 
        case MTC:
@@ -548,8 +482,12 @@ meter_falloff_to_float (MeterFalloff falloff)
                return METER_FALLOFF_SLOWEST;
        case MeterFalloffSlow:
                return METER_FALLOFF_SLOW;
+       case MeterFalloffSlowish:
+               return METER_FALLOFF_SLOWISH;
        case MeterFalloffMedium:
                return METER_FALLOFF_MEDIUM;
+       case MeterFalloffModerate:
+               return METER_FALLOFF_MODERATE;
        case MeterFalloffFast:
                return METER_FALLOFF_FAST;
        case MeterFalloffFaster:
@@ -573,6 +511,12 @@ meter_falloff_from_float (float val)
        else if (val <= METER_FALLOFF_SLOW) {
                return MeterFalloffSlow;
        }
+       else if (val <= METER_FALLOFF_SLOWISH) {
+               return MeterFalloffSlowish;
+       }
+       else if (val <= METER_FALLOFF_MODERATE) {
+               return MeterFalloffModerate;
+       }
        else if (val <= METER_FALLOFF_MEDIUM) {
                return MeterFalloffMedium;
        }