mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-04 12:45:45 +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,8 +24,7 @@
|
|||
#include <climits>
|
||||
#include <cerrno>
|
||||
#include <cstdlib>
|
||||
|
||||
#include <regex.h>
|
||||
#include <regex>
|
||||
|
||||
#include <glibmm/fileutils.h>
|
||||
#include <glibmm/miscutils.h>
|
||||
|
|
@ -42,69 +41,43 @@ using std::vector;
|
|||
string
|
||||
PBD::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)) {
|
||||
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
|
||||
*/
|
||||
if (path.empty()) {
|
||||
return path;
|
||||
}
|
||||
|
||||
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 */
|
||||
|
||||
return canonical_path (path);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue