-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrule.cpp
124 lines (102 loc) · 2.54 KB
/
rule.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <common.h>
#include <iostream>
#include "rule.h"
#include "grammar.h"
using std::cout;
using std::endl;
typedef std::string::const_iterator iterator_t;
typedef RuleRouteGrammar<iterator_t> RuleRouteGrammar_t;
Rule::Rule()
{
}
bool Rule::parse_rule(const string &line)
{
string::const_iterator begin = line.begin();
string::const_iterator end = line.end();
RuleSpirit rule_spirit;
static RuleRouteGrammar_t route_grammar;
if (!phrase_parse(begin, end, route_grammar, qi::ascii::space, rule_spirit))
return false;
init_from_rule_spirit(rule_spirit);
rule_str = line;
return true;
}
void Rule::init_from_rule_spirit(const RuleSpirit &rule)
{
action = rule.action;
route = rule.route;
for (vector<RuleOption>::const_iterator it = rule.options.begin(); it != rule.options.end(); ++it) {
switch ((*it).type) {
case CONTENT:
content.push_back((*it).sequence_value);
break;
case PCRE:
// rule can contain only 1 pcre
if (pcre.size() <= 0)
pcre = (*it).sequence_value;
break;
case MESSAGE:
message.assign((*it).sequence_value.begin(), (*it).sequence_value.end());
break;
case OFFSET:
offset = (*it).value;
break;
case LENGTH:
length = (*it).value;
break;
}
}
}
Rule *Rule::create_rule(const string &rule)
{
Rule *new_rule = new Rule();
if (new_rule->parse_rule(rule))
return new_rule;
else
delete new_rule;
return NULL;
}
Action Rule::get_action()
{
return action;
}
const sequence32 &Rule::get_route()
{
return route;
}
const vector<sequence8> &Rule::get_content()
{
return content;
}
const sequence8 &Rule::get_pcre() const
{
return pcre;
}
const string &Rule::get_message() const
{
return message;
}
const string &Rule::get_rule_str() const
{
return rule_str;
}
ostream &operator<<(ostream &stream, Rule &rule) {
const sequence32 &route = rule.get_route();
// for (int i = 0; i < 4; ++i) {
// print_sequence_val32(stream, route[i]);
// if (i < 3)
// stream << '.';
// }
// stream << ' ';
// print_sequence_val32(stream, route[4]);
// stream << " -> ";
// for (int i = 5; i < 9; ++i) {
// print_sequence_val32(stream, route[i]);
// if (i < 8)
// stream << '.';
// }
// stream << ' ';
// print_sequence_val32(stream, route[9]);
cout << route << endl;
return stream;
}