mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 06:44:57 +01:00
Prefer std::regex over C regex_t
This commit is contained in:
parent
bf154d0239
commit
b3e4deb32f
3 changed files with 42 additions and 85 deletions
|
|
@ -24,6 +24,7 @@
|
||||||
#include <climits>
|
#include <climits>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <regex>
|
||||||
|
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
@ -60,7 +61,6 @@
|
||||||
#include <io.h> // Microsoft's nearest equivalent to <unistd.h>
|
#include <io.h> // Microsoft's nearest equivalent to <unistd.h>
|
||||||
#include <ardourext/misc.h>
|
#include <ardourext/misc.h>
|
||||||
#else
|
#else
|
||||||
#include <regex.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "pbd/compose.h"
|
#include "pbd/compose.h"
|
||||||
|
|
@ -243,8 +243,8 @@ static
|
||||||
bool
|
bool
|
||||||
regexp_filter (const string& str, void *arg)
|
regexp_filter (const string& str, void *arg)
|
||||||
{
|
{
|
||||||
regex_t* pattern = (regex_t*)arg;
|
std::regex* pattern = static_cast<std::regex*>(arg);
|
||||||
return regexec (pattern, str.c_str(), 0, 0, 0) == 0;
|
return std::regex_search(str, *pattern);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -253,21 +253,11 @@ find_files_matching_regex (vector<string>& result,
|
||||||
const std::string& regexp,
|
const std::string& regexp,
|
||||||
bool recurse)
|
bool recurse)
|
||||||
{
|
{
|
||||||
int err;
|
std::regex compiled_pattern;
|
||||||
char msg[256];
|
try {
|
||||||
regex_t compiled_pattern;
|
compiled_pattern = std::regex(regexp);
|
||||||
|
} catch (const std::regex_error& e) {
|
||||||
if ((err = regcomp (&compiled_pattern, regexp.c_str(),
|
error << "Cannot compile soundfile regexp for use (" << e.what() << ")" << endmsg;
|
||||||
REG_EXTENDED|REG_NOSUB))) {
|
|
||||||
|
|
||||||
regerror (err, &compiled_pattern,
|
|
||||||
msg, sizeof (msg));
|
|
||||||
|
|
||||||
error << "Cannot compile soundfile regexp for use ("
|
|
||||||
<< msg
|
|
||||||
<< ")"
|
|
||||||
<< endmsg;
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -277,8 +267,6 @@ find_files_matching_regex (vector<string>& result,
|
||||||
find_files_matching_filter (result, paths,
|
find_files_matching_filter (result, paths,
|
||||||
regexp_filter, &compiled_pattern,
|
regexp_filter, &compiled_pattern,
|
||||||
true, true, recurse);
|
true, true, recurse);
|
||||||
|
|
||||||
regfree (&compiled_pattern);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,7 @@
|
||||||
#include <climits>
|
#include <climits>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <regex>
|
||||||
#include <regex.h>
|
|
||||||
|
|
||||||
#include <glibmm/fileutils.h>
|
#include <glibmm/fileutils.h>
|
||||||
#include <glibmm/miscutils.h>
|
#include <glibmm/miscutils.h>
|
||||||
|
|
@ -42,69 +41,43 @@ using std::vector;
|
||||||
string
|
string
|
||||||
PBD::path_expand (string path)
|
PBD::path_expand (string path)
|
||||||
{
|
{
|
||||||
if (path.empty()) {
|
if (path.empty()) {
|
||||||
return path;
|
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)) {
|
|
||||||
std::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);
|
/* 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 or ${VAR} substitution, since wordexp isn't reliable */
|
||||||
|
|
||||||
|
static const std::regex var_regex (R"(\$([A-Za-z_][A-Za-z0-9_]*|\{[A-Za-z_][A-Za-z0-9_]*\}))");
|
||||||
|
|
||||||
|
std::smatch m;
|
||||||
|
|
||||||
|
while (std::regex_search (path, m, var_regex)) {
|
||||||
|
std::string var = m[1].str(); // "$FOO" or "${FOO}"
|
||||||
|
|
||||||
|
if (var[0] == '{') {
|
||||||
|
var = var.substr(1, var.size() - 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* val = g_getenv (var.c_str());
|
||||||
|
|
||||||
|
path.replace (m.position(0), m.length(0), val ? val : "");
|
||||||
|
}
|
||||||
|
|
||||||
/* canonicalize */
|
/* canonicalize */
|
||||||
|
|
||||||
return canonical_path (path);
|
return canonical_path (path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
4
wscript
4
wscript
|
|
@ -1227,10 +1227,6 @@ int main () { int x = SFC_RF64_AUTO_DOWNGRADE; return 0; }
|
||||||
conf.env.append_value('LIB', 'uuid')
|
conf.env.append_value('LIB', 'uuid')
|
||||||
# needed for mingw64 packages, not harmful on normal mingw build
|
# needed for mingw64 packages, not harmful on normal mingw build
|
||||||
conf.env.append_value('LIB', 'intl')
|
conf.env.append_value('LIB', 'intl')
|
||||||
conf.check_cc(function_name='regcomp', header_name='regex.h',
|
|
||||||
lib='regex', uselib_store="REGEX", define_name='HAVE_REGEX_H')
|
|
||||||
# TODO put this only where it is needed
|
|
||||||
conf.env.append_value('LIB', 'regex')
|
|
||||||
# TODO this should only be necessary for a debug build
|
# TODO this should only be necessary for a debug build
|
||||||
conf.env.append_value('LIB', 'dbghelp')
|
conf.env.append_value('LIB', 'dbghelp')
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue