#include <sys/stat.h>
#include <sys/time.h>
#include <fcntl.h>
+#ifndef COMPILER_MSVC
#include <dirent.h>
+#endif
#include <errno.h>
#include <regex.h>
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)
{
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)
}
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 */
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:
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:
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;
}