-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.cpp
98 lines (92 loc) · 2.57 KB
/
util.cpp
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "util.h"
#include <dirent.h>
#include <libgen.h>
#include <cstring>
#include <iostream>
bool is_with_symbol(const std::string &str, char sym) {
//TODO: Add check for escape symbol (\", \' \=)
for (size_t i = 0; i < str.size(); i++)
if (str[i] == sym && (i == 0 || str[i - 1] != '\\'))
return true;
return false;
}
bool matches(char *text, char *pattern) {
int n = strlen(text);
int m = strlen(pattern);
bool found = false;
if (m == 0)
return (n == 0);
int i = 0, j = 0, textPointer = -1, pattPointer = -1;
while (i < n) {
if (text[i] == pattern[j]) {
i++;
j++;
} else if (j < m and pattern[j] == '?') {
i++;
j++;
} else if (j < m and pattern[j] == '*') {
textPointer = i;
pattPointer = j;
j++;
} else if (j < m && pattern[j] == '[') {
j++;
while (pattern[j] != ']') {
if (pattern[j] == text[i] && !found) {
i++;
found = true;
}
j++;
}
if (!found)
return false;
found = false;
j++;
} else if (pattPointer != -1) {
j = pattPointer + 1;
i = textPointer + 1;
textPointer++;
} else
return false;
}
while (j < m && pattern[j] == '*') {
j++;
}
return j == m;
}
std::string join(const std::vector<std::string> &array, const char separator) {
std::string result;
size_t size = array.size();
for (size_t i = 0; i < size; i++) {
if (i != size - 1)
result += array[i] + separator;
else
result += array[i];
}
return result;
}
std::vector<Token> replace_wildcards(const std::string &data) {
char *path, *pattern;
char *str = strdup(data.c_str());
if (data.find_last_of('/') != std::string::npos) {
path = strdup(data.substr(0, data.find_last_of('/') + 1).c_str());
pattern = strdup(data.substr(data.find_last_of('/') + 1, std::string::npos).c_str());
} else {
path = strdup("");
pattern = strdup(str);
}
std::vector<Token> files;
DIR *dp;
struct dirent *ep;
dp = opendir(path);
if (dp != nullptr) {
while ((ep = readdir(dp))) {
if (matches(ep->d_name, pattern)) {
files.emplace_back(ep->d_name, TokenType::CmdWord);
}
}
}
free(str);
free(path);
free(pattern);
return files;
}