blob: 5ca16a0f01e8ba08f2e7d0987395f502c454174f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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;
}
}
|