-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathparsetools.cpp
143 lines (134 loc) · 3.82 KB
/
parsetools.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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/* Tools for scanning data */
using namespace std;
#define NO_ERRORS 0
#define BAD_ATTRIBUTE "(*****@@@*@**@*@*)@*!)@*#!)#*!)*#)@*!)@*#!)*$!^%#&!%(&!@%!(&^!@%(#!&@^)"
inline bool validAttribute(string attribute) {
return attribute.compare(BAD_ATTRIBUTE) != 0;
}
string ParseStringData(string data, string attribute, string default_return=BAD_ATTRIBUTE) {
unsigned int start, end, size;
start = data.find(attribute);
// Check expressions for valid syntax.
if (data.find("\n", start) < data.length()) {
int newline = data.find("\n", start);
string expression = data.substr(start, newline-start);
// check for missing = operator.
if (expression.find("=") == string::npos) {
cerr << MISSING_EQUALS_OPERATOR << "\n" << expression << "\n\n";
}
// Check for missing semicolon.
if (expression.find(";") == string::npos) {
cerr << MISSING_SEMICOLON << "\n" << expression << "\n\n";
}
// Check two missing quotes.
if (expression.find("\"") == string::npos) {
cerr << MISSING_QUOTES << "\n" << expression << "\n\n" << endl;
}
// Check for one missing quote.
if (expression.find("\"") != string::npos && expression.find("\"", (expression.find("\"")+1)) == string::npos) {
cerr << MISSING_QUOTE << "\n" << expression << "\n\n" << endl;
}
}
if (start < data.size()) {
start = data.find("\"", start) + 1;
end = data.find("\"", start);
size = end - start;
return data.substr(start, size);
}
return default_return;
}
string stringTrim(string data) {
unsigned int start, end;
start = 0;
while (start < data.length()) {
if (!isspace(data.at(start))) {
break;
}
data.replace(start, 1, "");
start++;
}
end = data.length() - 1;
while (end > 0) {
if (!isspace(data.at(end))) {
break;
}
data.replace(end, 1, "");
end--;
}
return data;
}
string ParseVariableData(string data, string attribute) {
unsigned int start, end, size;
string ret;
start = data.find(attribute);
// Check expressions for valid syntax.
if (data.find("\n", start) < data.length()) {
int newline = data.find("\n", start);
string expression = data.substr(start, newline-start);
// check for missing = operator.
if (expression.find("=") == string::npos) {
cerr << MISSING_EQUALS_OPERATOR << "\n" << expression << "\n\n";
}
// Check for missing semicolon.
if (expression.find(";") == string::npos) {
cerr << MISSING_SEMICOLON << "\n" << expression << "\n\n";
}
}
if (start < data.size()) {
start = data.find("=", start) + 1;
end = data.find(";", start);
size = end - start;
ret = (data.substr(start, size));
ret = stringTrim(ret);
return ret;
}
return BAD_ATTRIBUTE;
}
unsigned int ParseEndBrace(unsigned int start, string data) {
unsigned int another, end, temp;
int count = 1;
temp = start;
while (count > 0) {
another = data.find("{", temp);
end = data.find("}", temp);
if (another < end && another < data.size()) {
temp = another + 1;
count++;
} else {
temp = end + 1;
count--;
}
}
return end;
}
map<string, string> ParseVerbs(string data) {
map<string, string> rules;
unsigned int start, end, size;
start = data.find("Verb ");
while (start < data.size()) {
// Parse Verb name
start = data.find("\"", start) + 1;
end = data.find("\"", start);
size = end - start;
string name = data.substr(start, size);
// Check for verb string
if (size == 0 || start == 0) {
cerr << BAD_VERB_STRING << endl;
exit (1);
} else if (size == 1 && data.substr(start, size) == " ") {
cerr << BAD_VERB_STRING << endl;
exit (1);
} else if (size > 1 && stringTrim(data.substr(start, size)) == " ") {
cerr << BAD_VERB_STRING << endl;
exit (1);
}
// Parse Verb actions
start = data.find("{", end) + 1;
end = ParseEndBrace(start, data);
size = end - start;
string actions = data.substr(start, size);
rules[name] = actions;
start = data.find("Verb ", end);
}
return rules;
}