45{
46
47 std::string activeLine = line.substr(0, line.find('#'));
48
49
50 boost::char_separator<char> sep(" ");
51 boost::tokenizer<boost::char_separator<char>> tokens(activeLine, sep);
52 boost::tokenizer<boost::char_separator<char>>::iterator itToken = tokens.begin();
53
54
55 Item* item = new Item;
56 size_t iToken = 0;
57 for (; itToken != tokens.end(); itToken++) {
58 switch (iToken) {
59 case 0: {
60
61
62 std::string name(*itToken);
63 if (!prefix.empty()) {
64
65 name = prefix + std::string(".") + name;
66 }
67
68 while ((name.size() > 0) && ('.' == name[name.size() - 1])) {
69
70 name.erase(name.size() - 1);
71 }
72
73 if (name.size() == 0) {
74
75 BUException::INVALID_NAME e;
76 e.Append("Empty name");
77 throw e;
78 }
79
80 boost::to_upper(name);
81
82
83 item->
name.assign(name);
84 iToken++;
85 } break;
86 case 1:
87
88
90 iToken++;
91 break;
92 case 2:
93
94
95 if (!isdigit((itToken->c_str()[0]))) {
96
98 itToken++;
99 while (itToken != tokens.end()) {
102 itToken++;
103 }
107 } else {
108 BUException::MAX_INCLUDE_FILE_DEPTH e;
109 e.Append("File: ");
110 e.Append(filename);
111 e.Append(" at prefix ");
112 e.Append(item->
name);
113 e.Append(" is too deep\n");
114 throw e;
115 }
117
118 delete item;
119
120 return;
121 }
122
123
124 item->
mask = strtoul(itToken->c_str(), NULL, 0);
125
126
127 {
128 unsigned int v = item->
mask;
131 if (v) {
133 }
134 if (v & 0x0000FFFF) {
136 }
137 if (v & 0x00FF00FF) {
139 }
140 if (v & 0x0F0F0F0F) {
142 }
143 if (v & 0x33333333) {
145 }
146 if (v & 0x55555555) {
148 }
150 }
151
152 iToken++;
153 break;
154 case 3:
155
157
158
159 if (itToken->find('r') != std::string::npos) {
161 } else if (itToken->find('R') != std::string::npos) {
163 }
164
165
166 if (itToken->find('w') != std::string::npos) {
168 } else if (itToken->find('W') != std::string::npos) {
170 }
171
172
173 if (itToken->find('a') != std::string::npos) {
175 } else if (itToken->find('A') != std::string::npos) {
177 }
178
179 iToken++;
180 break;
181 default:
182
183
184
185
186 if (itToken->find('=') == std::string::npos) {
187
188 item->
user[*itToken];
189 iToken++;
190 } else {
191
192 size_t equalSignPos = itToken->find('=');
193
194 if (itToken->find('"') != std::string::npos) {
195 if (itToken->find('"') < equalSignPos) {
196 BUException::BAD_TOKEN e;
197 e.Append("Malformed token : ");
198 e.Append(itToken->c_str());
199 e.Append(" on line ");
200 char numberBuffer[14] = "\0\0\0\0\0\0\0\0\0\0\0\0";
201 snprintf(numberBuffer, 12, "%zu\n", lineNumber);
202 e.Append(numberBuffer);
203 e.Append("Bad line: ");
204 e.Append(activeLine);
205 e.Append("\n");
206 throw e;
207 }
208 }
209
210 std::string name = itToken->substr(0, equalSignPos);
211
212 if (itToken->size() - 1 == equalSignPos) {
213 BUException::BAD_TOKEN e;
214 e.Append("Malformed token : ");
215 e.Append(itToken->c_str());
216 e.Append(" on line ");
217 char numberBuffer[14] = "\0\0\0\0\0\0\0\0\0\0\0\0";
218 snprintf(numberBuffer, 12, "%zu\n", lineNumber);
219 e.Append(numberBuffer);
220 throw e;
221 }
222
223 std::string val = itToken->substr(equalSignPos + 1);
224 if (val[0] != '"') {
225
226 item->
user[name] = val;
227 iToken++;
228 } else {
229
230 val.erase(0, 1);
231
232
233 if (val.find('"') != std::string::npos) {
234
235 val = val.substr(0, val.find('"'));
236 } else {
237
238 itToken++;
239 while (itToken != tokens.end()) {
240 val.append(" ");
241 val.append(*itToken);
242 if ((*itToken)[itToken->size() - 1] == '"') {
243
244
245 val.erase(val.size() - 1);
246 break;
247 }
248 iToken++;
249 itToken++;
250 }
251 }
252
253 while (val.find("\\n") != std::string::npos) {
254 val.replace(val.find("\\n"), 2, std::string("\n"));
255 }
256 item->
user[name] = val;
257 }
258 }
259 break;
260 }
261 if (itToken == tokens.end()) {
262 break;
263 }
264 }
265
266 if (iToken >= 4) {
268 } else {
269 delete item;
270 }
271}