1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-28 09:31:16 +02:00

replace own regex class with std::regex

This commit is contained in:
Alexander Ried 2016-10-18 20:21:21 +02:00
parent ae8884b949
commit b05b98df75
5 changed files with 14 additions and 94 deletions

View file

@ -33,8 +33,8 @@ DrvName::DrvName(const string & s) : hits(0)
bool DrvName::matches(DrvName & n)
{
if (name != "*") {
if (!regex) regex = std::shared_ptr<Regex>(new Regex(name));
if (!regex->matches(n.name)) return false;
if (!regex) regex = std::unique_ptr<std::regex>(new std::regex(name, std::regex::extended));
if (!std::regex_match(n.name, *regex)) return false;
}
if (version != "" && version != n.version) return false;
return true;

View file

@ -3,7 +3,7 @@
#include <memory>
#include "types.hh"
#include "regex.hh"
#include <regex>
namespace nix {
@ -19,7 +19,7 @@ struct DrvName
bool matches(DrvName & n);
private:
std::shared_ptr<Regex> regex;
std::unique_ptr<std::regex> regex;
};
typedef list<DrvName> DrvNames;

View file

@ -18,6 +18,7 @@
#include <algorithm>
#include <cstring>
#include <regex>
#include <dlfcn.h>
@ -1618,25 +1619,23 @@ static void prim_hashString(EvalState & state, const Pos & pos, Value * * args,
null or a list containing substring matches. */
static void prim_match(EvalState & state, const Pos & pos, Value * * args, Value & v)
{
Regex regex(state.forceStringNoCtx(*args[0], pos), true);
std::regex regex(state.forceStringNoCtx(*args[0], pos), std::regex::extended);
PathSet context;
string s = state.forceString(*args[1], context, pos);
const std::string str = state.forceString(*args[1], context, pos);
Regex::Subs subs;
if (!regex.matches(s, subs)) {
std::smatch match;
if (!std::regex_match(str, match, regex)) {
mkNull(v);
return;
}
unsigned int len = subs.empty() ? 0 : subs.rbegin()->first + 1;
// the first match is the whole string
const size_t len = match.size() - 1;
state.mkList(v, len);
for (unsigned int n = 0; n < len; ++n) {
auto i = subs.find(n);
if (i == subs.end())
mkNull(*(v.listElems()[n] = state.allocValue()));
else
mkString(*(v.listElems()[n] = state.allocValue()), i->second);
for (size_t i = 0; i < len; ++i) {
mkString(*(v.listElems()[i] = state.allocValue()), match[i + 1].str().c_str());
}
}