1/*
2 SPDX-FileCopyrightText: 2007 Sebastian Pipping <webmaster@hartwork.org>
3
4 SPDX-License-Identifier: MIT
5*/
6
7#include "wildcardmatcher.h"
8
9using namespace KSyntaxHighlighting;
10
11#include <QChar>
12
13namespace
14{
15bool wildcardMatch(QStringView candidate, QStringView wildcard, int candidatePosFromRight, int wildcardPosFromRight)
16{
17 for (; wildcardPosFromRight >= 0; wildcardPosFromRight--) {
18 const auto ch = wildcard.at(n: wildcardPosFromRight).unicode();
19 switch (ch) {
20 case L'*':
21 if (candidatePosFromRight == -1) {
22 break;
23 }
24
25 if (wildcardPosFromRight == 0) {
26 return true;
27 }
28
29 // Eat all we can and go back as far as we have to
30 for (int j = -1; j <= candidatePosFromRight; j++) {
31 if (wildcardMatch(candidate, wildcard, candidatePosFromRight: j, wildcardPosFromRight: wildcardPosFromRight - 1)) {
32 return true;
33 }
34 }
35 return false;
36
37 case L'?':
38 if (candidatePosFromRight == -1) {
39 return false;
40 }
41
42 candidatePosFromRight--;
43 break;
44
45 default:
46 if (candidatePosFromRight == -1) {
47 return false;
48 }
49
50 const auto candidateCh = candidate.at(n: candidatePosFromRight).unicode();
51 if (candidateCh == ch) {
52 candidatePosFromRight--;
53 } else {
54 return false;
55 }
56 }
57 }
58 return candidatePosFromRight == -1;
59}
60
61} // unnamed namespace
62
63bool WildcardMatcher::exactMatch(QStringView candidate, QStringView wildcard)
64{
65 return ::wildcardMatch(candidate, wildcard, candidatePosFromRight: candidate.length() - 1, wildcardPosFromRight: wildcard.length() - 1);
66}
67

source code of syntax-highlighting/src/lib/wildcardmatcher.cpp