-
Notifications
You must be signed in to change notification settings - Fork 0
/
pcre_jit.cpp
68 lines (55 loc) · 3.03 KB
/
pcre_jit.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
#define OVECCOUNT 30
#include <iostream>
#include <pcre.h>
#include <string>
#include <vector>
int main()
{
const std::vector<std::string> lines{
"[05821BE4 | 2019-05-13 12:28:56] (13036) http://test.site/projects/cmd.php [co_project.view] RQST START",
"[05821BE4 | 2019-05-13 12:28:56] (13036) http://test.site/projects/cmd.php [co_project.view] RQST END [normal] 402 ms",
"[05671FA1 | 2019-04-17 14:08:03] (62931) http://test.site/projects/cmd.php [co_project.view] RQST START",
"[05671FA1 | 2019-04-17 14:08:03] (62931) http://test.site/projects/cmd.php [co_project.view] RQST END [normal] 237 ms",
"[05822AE4 | 2019-06-17 06:59:03] (15828) http://test.site/cmd.php [co_project.dialog_doc_details] RQST START",
"[05822AE4 | 2019-06-17 06:59:03] (15828) http://test.site/cmd.php [co_project.dialog_doc_details] RQST END [normal] 318 ms",
"[00180D0F | 2009-09-15 09:34:47] (127.0.0.1:39170, 879) /cmd.php [co_search.browse] RQST START",
"[00180D0F | 2009-09-15 09:34:48] (127.0.0.1:39170, 879) /cmd.php [co_search.browse] RQST END [normal] 799 ms",
"[00180D0D | 2009-09-15 09:34:19] (127.0.0.1:39169, 23727) /browse/ RQST START",
"[00180D0D | 2009-09-15 09:34:19] (127.0.0.1:39169, 23727) /browse/ RQST END [normal] 35 ms",
"[001F86EA | 2009-11-02 16:05:50] (127.0.0.1:1789, 10994) /cmd.php [co_doc.details] RQST START",
"[001F86EA | 2009-11-02 16:05:50] (127.0.0.1:1789, 10994) /cmd.php [co_doc.details] RQST END [normal] 84 ms"};
const char* error;
int erroroffset;
const char* pattern = R"(\[([^ ]{8}) \| ([^\]]{19})\] \((?:[^,]+, )?\d+\) [^ ]+ \[([^\]]+)\] RQST END \[[^\]]+\] *(\d+) ms)";
pcre* re = pcre_compile(pattern, 0, &error, &erroroffset, nullptr);
if (!re) {
std::cout << "PCRE compilation failed at offset " << erroroffset << ": " << error << std::endl;
return 1;
}
pcre_extra* sd = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error);
if (!sd && error) {
std::cout << "PCRE study error: " << error << std::endl;
return 2;
}
pcre_jit_stack* jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024);
if (!jit_stack) {
std::cout << "PCRE JIT stack alloc error" << std::endl;
return 3;
}
pcre_assign_jit_stack(sd, nullptr, jit_stack);
for (auto line : lines) {
int ovector[OVECCOUNT];
const int rc = pcre_jit_exec(re, sd, line.c_str(), static_cast<int>(line.size()), 0, 0, ovector, OVECCOUNT, jit_stack);
if (rc > 1) {
for (int i = 1; i < rc; ++i) {
const char* substring_start = line.c_str() + ovector[2*i];
const int substring_length = ovector[2*i + 1] - ovector[2*i];
const std::string_view s{substring_start, static_cast<std::string_view::size_type>(substring_length)};
std::cout << "MATCH " << i << ": \"" << s << "\"" << std::endl;
}
}
}
pcre_jit_stack_free(jit_stack);
pcre_free_study(sd);
pcre_free(re);
}