aboutsummaryrefslogtreecommitdiff
path: root/mod/utility.cxx
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;
  }
}