mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 06:44:57 +01:00
Prefer std::regex, and modern C++ string search
This commit is contained in:
parent
7eb92253c6
commit
f6a2ee0103
10 changed files with 59 additions and 114 deletions
|
|
@ -18,7 +18,7 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <regex.h>
|
||||
#include <regex>
|
||||
|
||||
#include "pbd/error.h"
|
||||
|
||||
|
|
@ -289,11 +289,14 @@ PortEngineSharedImpl::get_ports (
|
|||
std::vector<std::string>& port_names) const
|
||||
{
|
||||
int rv = 0;
|
||||
regex_t port_regex;
|
||||
std::regex port_regex;
|
||||
bool use_regexp = false;
|
||||
if (port_name_pattern.size () > 0) {
|
||||
if (!regcomp (&port_regex, port_name_pattern.c_str (), REG_EXTENDED|REG_NOSUB)) {
|
||||
if (!port_name_pattern.empty()) {
|
||||
try {
|
||||
port_regex.assign (port_name_pattern, std::regex::extended);
|
||||
use_regexp = true;
|
||||
} catch (const std::regex_error&) {
|
||||
use_regexp = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -301,15 +304,12 @@ PortEngineSharedImpl::get_ports (
|
|||
|
||||
for (auto const& port : *p) {
|
||||
if ((port->type () == type) && flags == (port->flags () & flags)) {
|
||||
if (!use_regexp || !regexec (&port_regex, port->name ().c_str (), 0, NULL, 0)) {
|
||||
if (!use_regexp || std::regex_search (port->name(), port_regex)) {
|
||||
port_names.push_back (port->name ());
|
||||
++rv;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (use_regexp) {
|
||||
regfree (&port_regex);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -24,8 +24,6 @@
|
|||
#ifdef COMPILER_MSVC
|
||||
#include <ardourext/misc.h>
|
||||
#include <io.h> // Microsoft's nearest equivalent to <unistd.h>
|
||||
#else
|
||||
#include <regex.h>
|
||||
#endif
|
||||
|
||||
#include <glibmm/fileutils.h>
|
||||
|
|
@ -1493,40 +1491,29 @@ PortManager::port_engine ()
|
|||
bool
|
||||
PortManager::port_is_control_only (std::string const& name)
|
||||
{
|
||||
static regex_t compiled_pattern;
|
||||
static string pattern;
|
||||
|
||||
if (pattern.empty ()) {
|
||||
/* This is a list of regular expressions that match ports
|
||||
* related to physical MIDI devices that we do not want to
|
||||
* expose as normal physical ports.
|
||||
/* This is a list of substrings that identify ports related
|
||||
* to physical MIDI devices that we do not want to expose as
|
||||
* normal physical ports.
|
||||
*/
|
||||
|
||||
const char* const control_only_ports[] = {
|
||||
X_(".*Ableton Push.*"),
|
||||
X_(".*FaderPort .*"),
|
||||
X_(".*FaderPort8 .*"),
|
||||
X_(".*FaderPort16 .*"),
|
||||
X_(".*FaderPort2 .*"),
|
||||
X_(".*US-2400 .*"),
|
||||
X_(".*Mackie .*"),
|
||||
X_(".*MIDI Control .*"),
|
||||
X_(".*Console1 .*"),
|
||||
static const char* const control_only_ports[] = {
|
||||
X_("Ableton Push"),
|
||||
X_("FaderPort "),
|
||||
X_("FaderPort8 "),
|
||||
X_("FaderPort16 "),
|
||||
X_("FaderPort2 "),
|
||||
X_("US-2400 "),
|
||||
X_("Mackie "),
|
||||
X_("MIDI Control "),
|
||||
X_("Console1 "),
|
||||
};
|
||||
|
||||
pattern = "(";
|
||||
for (size_t n = 0; n < sizeof (control_only_ports) / sizeof (control_only_ports[0]); ++n) {
|
||||
if (n > 0) {
|
||||
pattern += '|';
|
||||
if (name.find (control_only_ports[n]) != string::npos) {
|
||||
return true;
|
||||
}
|
||||
pattern += control_only_ports[n];
|
||||
}
|
||||
pattern += ')';
|
||||
|
||||
regcomp (&compiled_pattern, pattern.c_str (), REG_EXTENDED | REG_NOSUB);
|
||||
}
|
||||
|
||||
return regexec (&compiled_pattern, name.c_str (), 0, 0, 0) == 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
|
||||
#include <sys/time.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <regex.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "pbd/file_utils.h"
|
||||
#include "pbd/stl_delete.h"
|
||||
|
|
@ -688,11 +690,6 @@ SMFSource::valid_midi_file (const string& file)
|
|||
bool
|
||||
SMFSource::safe_midi_file_extension (const string& file)
|
||||
{
|
||||
static regex_t compiled_pattern;
|
||||
static bool compile = true;
|
||||
const int nmatches = 2;
|
||||
regmatch_t matches[nmatches];
|
||||
|
||||
if (Glib::file_test (file, Glib::FILE_TEST_EXISTS)) {
|
||||
if (!Glib::file_test (file, Glib::FILE_TEST_IS_REGULAR)) {
|
||||
/* exists but is not a regular file */
|
||||
|
|
@ -700,17 +697,14 @@ SMFSource::safe_midi_file_extension (const string& file)
|
|||
}
|
||||
}
|
||||
|
||||
if (compile && regcomp (&compiled_pattern, "\\.[mM][iI][dD][iI]?$", REG_EXTENDED)) {
|
||||
return false;
|
||||
} else {
|
||||
compile = false;
|
||||
}
|
||||
|
||||
if (regexec (&compiled_pattern, file.c_str(), nmatches, matches, 0)) {
|
||||
const size_t dot_pos = file.rfind ('.');
|
||||
if (dot_pos == string::npos) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
std::string const ext = PBD::downcase (file.substr(dot_pos + 1));
|
||||
|
||||
return ext == "mid" || ext == "midi";
|
||||
}
|
||||
|
||||
static bool compare_eventlist (
|
||||
|
|
|
|||
|
|
@ -37,14 +37,9 @@
|
|||
#include <cstring>
|
||||
#include <cerrno>
|
||||
#include <iostream>
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
#include <fcntl.h>
|
||||
#ifndef COMPILER_MSVC
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
#include <errno.h>
|
||||
#include <regex.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "pbd/gstdio_compat.h"
|
||||
|
||||
|
|
@ -673,45 +668,30 @@ bool
|
|||
ARDOUR::matching_unsuffixed_filename_exists_in (const string& dir, const string& path)
|
||||
{
|
||||
string bws = basename_nosuffix (path);
|
||||
struct dirent* dentry;
|
||||
GStatBuf statbuf;
|
||||
DIR* dead;
|
||||
bool ret = false;
|
||||
|
||||
if ((dead = ::opendir (dir.c_str())) == 0) {
|
||||
error << string_compose (_("cannot open directory %1 (%2)"), dir, strerror (errno)) << endl;
|
||||
try {
|
||||
Glib::Dir directory (dir);
|
||||
|
||||
for (const auto& name : directory) {
|
||||
if (name == "." || name == "..") {
|
||||
continue;
|
||||
}
|
||||
|
||||
string fullpath = Glib::build_filename (dir, name);
|
||||
if (!Glib::file_test (fullpath, Glib::FILE_TEST_IS_REGULAR)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (basename_nosuffix (name) == bws) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} catch (const Glib::Error& e) {
|
||||
error << string_compose (_("cannot open directory %1 (%2)"), dir, e.what()) << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
while ((dentry = ::readdir (dead)) != 0) {
|
||||
|
||||
/* avoid '.' and '..' */
|
||||
|
||||
if ((dentry->d_name[0] == '.' && dentry->d_name[1] == '\0') ||
|
||||
(dentry->d_name[2] == '\0' && dentry->d_name[0] == '.' && dentry->d_name[1] == '.')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
string fullpath = Glib::build_filename (dir, dentry->d_name);
|
||||
|
||||
if (g_stat (fullpath.c_str(), &statbuf)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!S_ISREG (statbuf.st_mode)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
string bws2 = basename_nosuffix (dentry->d_name);
|
||||
|
||||
if (bws2 == bws) {
|
||||
ret = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
::closedir (dead);
|
||||
return ret;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <regex.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <regex.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@
|
|||
|
||||
#include <math.h>
|
||||
#include <sys/time.h>
|
||||
#include <regex.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <glibmm.h>
|
||||
|
|
|
|||
|
|
@ -18,8 +18,6 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <regex.h>
|
||||
|
||||
#ifndef PLATFORM_WINDOWS
|
||||
#include <sys/mman.h>
|
||||
#include <sys/time.h>
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include <regex.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/time.h>
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
#include <sstream>
|
||||
#include <algorithm>
|
||||
#include <regex>
|
||||
|
||||
#ifdef COMPILER_MSVC
|
||||
#include <io.h> // Microsoft's nearest equivalent to <unistd.h>
|
||||
|
|
@ -1029,24 +1030,13 @@ GenericMidiControlProtocol::lookup_controllable (const string & str, MIDIControl
|
|||
int id = 1;
|
||||
string name;
|
||||
|
||||
static regex_t compiled_pattern;
|
||||
static bool compiled = false;
|
||||
|
||||
if (!compiled) {
|
||||
const char * const pattern = "^[BS]?[0-9]+";
|
||||
/* this pattern compilation is not going to fail */
|
||||
regcomp (&compiled_pattern, pattern, REG_EXTENDED|REG_NOSUB);
|
||||
/* leak compiled pattern */
|
||||
compiled = true;
|
||||
}
|
||||
|
||||
/* Step 3: identify what "rest" looks like - name, or simple nueric, or
|
||||
* banked/selection specifier
|
||||
*/
|
||||
|
||||
bool matched = (regexec (&compiled_pattern, rest[0].c_str(), 0, 0, 0) == 0);
|
||||
static const std::regex pattern ("^[BS]?[0-9]+", std::regex::extended);
|
||||
|
||||
if (matched) {
|
||||
if (std::regex_search (rest[0], pattern)) {
|
||||
bool banked = false;
|
||||
|
||||
if (rest[0][0] == 'B') {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue