aboutsummaryrefslogtreecommitdiff
path: root/mod/utility.cxx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2024-08-06 22:03:31 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2024-08-07 19:19:22 +0300
commit443088f6093d3420212be0e1af3b9e802dca9362 (patch)
treeb1ec3b0c62ee0b8d66b0cbf21e21d68ae0d4f806 /mod/utility.cxx
parent7db53790ca2d2c004bfd00b503eca59a8d084870 (diff)
Add support for advanced package search
Diffstat (limited to 'mod/utility.cxx')
-rw-r--r--mod/utility.cxx69
1 files changed, 69 insertions, 0 deletions
diff --git a/mod/utility.cxx b/mod/utility.cxx
new file mode 100644
index 0000000..5ca16a0
--- /dev/null
+++ b/mod/utility.cxx
@@ -0,0 +1,69 @@
+// file : mod/utility.cxx -*- C++ -*-
+// license : MIT; see accompanying LICENSE file
+
+#include <mod/utility.hxx>
+
+#include <libbutl/path-pattern.hxx>
+
+namespace brep
+{
+ string
+ wildcard_to_similar_to_pattern (const string& wildcard)
+ {
+ using namespace butl;
+
+ if (wildcard.empty ())
+ return "%";
+
+ string r;
+ for (const path_pattern_term& pt: path_pattern_iterator (wildcard))
+ {
+ switch (pt.type)
+ {
+ case path_pattern_term_type::question: r += '_'; break;
+ case path_pattern_term_type::star: r += '%'; break;
+ case path_pattern_term_type::bracket:
+ {
+ // Copy the bracket expression translating the inverse character, if
+ // present.
+ //
+ size_t n (r.size ());
+ r.append (pt.begin, pt.end);
+
+ if (r[n + 1] == '!') // ...[!... ?
+ r[n + 1] = '^';
+
+ break;
+ }
+ case path_pattern_term_type::literal:
+ {
+ char c (get_literal (pt));
+
+ // Escape the special characters.
+ //
+ // Note that '.' is not a special character for SIMILAR TO.
+ //
+ switch (c)
+ {
+ case '\\':
+ case '%':
+ case '_':
+ case '|':
+ case '+':
+ case '{':
+ case '}':
+ case '(':
+ case ')':
+ case '[':
+ case ']': r += '\\'; break;
+ }
+
+ r += c;
+ break;
+ }
+ }
+ }
+
+ return r;
+ }
+}