summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/smf_source.h2
-rw-r--r--libs/ardour/smf_source.cc18
2 files changed, 18 insertions, 2 deletions
diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h
index b94ffb250f..26437c6c24 100644
--- a/libs/ardour/ardour/smf_source.h
+++ b/libs/ardour/ardour/smf_source.h
@@ -45,7 +45,7 @@ public:
virtual ~SMFSource ();
- bool safe_file_extension (const std::string& path) const {
+ bool safe_file_extension (const std::string& path) const {
return safe_midi_file_extension(path);
}
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc
index e0462efb08..626676ea83 100644
--- a/libs/ardour/smf_source.cc
+++ b/libs/ardour/smf_source.cc
@@ -24,6 +24,7 @@
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
+#include <regex.h>
#include "pbd/pathscanner.h"
#include "pbd/stl_delete.h"
@@ -449,7 +450,22 @@ SMFSource::mark_midi_streaming_write_completed (Evoral::Sequence<Evoral::Musical
bool
SMFSource::safe_midi_file_extension (const string& file)
{
- return (file.rfind(".mid") != string::npos) || (file.rfind (".MID") != string::npos);
+ static regex_t compiled_pattern;
+ static bool compile = true;
+ const int nmatches = 2;
+ regmatch_t matches[nmatches];
+
+ if (compile && regcomp (&compiled_pattern, "[mM][iI][dD]$", REG_EXTENDED)) {
+ return false;
+ } else {
+ compile = false;
+ }
+
+ if (regexec (&compiled_pattern, file.c_str(), nmatches, matches, 0)) {
+ return false;
+ }
+
+ return true;
}
void