lib/pcre/UniqueRegex: wrap Compile() options in struct
This commit is contained in:
parent
e5680c712b
commit
bf9dd24536
@ -7,19 +7,8 @@
|
|||||||
#include "lib/fmt/ToBuffer.hxx"
|
#include "lib/fmt/ToBuffer.hxx"
|
||||||
|
|
||||||
void
|
void
|
||||||
UniqueRegex::Compile(const char *pattern, bool anchored, bool capture,
|
UniqueRegex::Compile(const char *pattern, const int options)
|
||||||
bool caseless)
|
|
||||||
{
|
{
|
||||||
constexpr int default_options = PCRE2_DOTALL|PCRE2_NO_AUTO_CAPTURE;
|
|
||||||
|
|
||||||
uint32_t options = default_options;
|
|
||||||
if (anchored)
|
|
||||||
options |= PCRE2_ANCHORED;
|
|
||||||
if (capture)
|
|
||||||
options &= ~PCRE2_NO_AUTO_CAPTURE;
|
|
||||||
if (caseless)
|
|
||||||
options |= PCRE2_CASELESS;
|
|
||||||
|
|
||||||
int error_number;
|
int error_number;
|
||||||
PCRE2_SIZE error_offset;
|
PCRE2_SIZE error_offset;
|
||||||
re = pcre2_compile_8(PCRE2_SPTR8(pattern),
|
re = pcre2_compile_8(PCRE2_SPTR8(pattern),
|
||||||
@ -34,7 +23,7 @@ UniqueRegex::Compile(const char *pattern, bool anchored, bool capture,
|
|||||||
|
|
||||||
pcre2_jit_compile_8(re, PCRE2_JIT_COMPLETE);
|
pcre2_jit_compile_8(re, PCRE2_JIT_COMPLETE);
|
||||||
|
|
||||||
if (int n; capture &&
|
if (int n; (options & PCRE2_NO_AUTO_CAPTURE) == 0 &&
|
||||||
pcre2_pattern_info_8(re, PCRE2_INFO_CAPTURECOUNT, &n) == 0)
|
pcre2_pattern_info_8(re, PCRE2_INFO_CAPTURECOUNT, &n) == 0)
|
||||||
n_capture = n;
|
n_capture = n;
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,37 @@
|
|||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
namespace Pcre {
|
||||||
|
|
||||||
|
struct CompileOptions {
|
||||||
|
bool anchored = false;
|
||||||
|
bool caseless = false;
|
||||||
|
bool capture = false;
|
||||||
|
|
||||||
|
explicit constexpr operator int() const noexcept {
|
||||||
|
int options = PCRE2_DOTALL|PCRE2_NO_AUTO_CAPTURE;
|
||||||
|
|
||||||
|
if (anchored)
|
||||||
|
options |= PCRE2_ANCHORED;
|
||||||
|
|
||||||
|
if (caseless)
|
||||||
|
options |= PCRE2_CASELESS;
|
||||||
|
|
||||||
|
if (capture)
|
||||||
|
options &= ~PCRE2_NO_AUTO_CAPTURE;
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Pcre
|
||||||
|
|
||||||
class UniqueRegex : public RegexPointer {
|
class UniqueRegex : public RegexPointer {
|
||||||
public:
|
public:
|
||||||
UniqueRegex() = default;
|
UniqueRegex() = default;
|
||||||
|
|
||||||
UniqueRegex(const char *pattern, bool anchored, bool capture,
|
UniqueRegex(const char *pattern, Pcre::CompileOptions options) {
|
||||||
bool caseless) {
|
Compile(pattern, options);
|
||||||
Compile(pattern, anchored, capture, caseless);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UniqueRegex(UniqueRegex &&src) noexcept:RegexPointer(src) {
|
UniqueRegex(UniqueRegex &&src) noexcept:RegexPointer(src) {
|
||||||
@ -35,6 +59,9 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Throws Pcre::Error on error.
|
* Throws Pcre::Error on error.
|
||||||
*/
|
*/
|
||||||
void Compile(const char *pattern, bool anchored, bool capture,
|
void Compile(const char *pattern, int options);
|
||||||
bool caseless);
|
|
||||||
|
void Compile(const char *pattern, Pcre::CompileOptions options={}) {
|
||||||
|
Compile(pattern, (int)options);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
@ -247,8 +247,7 @@ ParseStringFilter(const char *&s, bool fold_case)
|
|||||||
negated,
|
negated,
|
||||||
};
|
};
|
||||||
f.SetRegex(std::make_shared<UniqueRegex>(f.GetValue().c_str(),
|
f.SetRegex(std::make_shared<UniqueRegex>(f.GetValue().c_str(),
|
||||||
false, false,
|
Pcre::CompileOptions{.caseless=fold_case}));
|
||||||
fold_case));
|
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user