1
2#line 1 "control_verbs.rl"
3/*
4 * Copyright (c) 2017, Intel Corporation
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * * Neither the name of Intel Corporation nor the names of its contributors
15 * may be used to endorse or promote products derived from this software
16 * without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
30
31/**
32 * \file
33 * \brief Parser for control verbs that can occur at the beginning of a pattern.
34 */
35
36#include "parser/control_verbs.h"
37
38#include "parser/Parser.h"
39#include "parser/parse_error.h"
40
41#include <cstring>
42#include <sstream>
43
44using namespace std;
45
46namespace ue2 {
47
48const char *read_control_verbs(const char *ptr, const char *end, size_t start,
49 ParseMode &mode) {
50 const char *p = ptr;
51 const char *pe = end;
52 const char *eof = pe;
53 const char *ts, *te;
54 int cs;
55 UNUSED int act;
56
57
58#line 59 "control_verbs.cpp"
59static const char _ControlVerbs_actions[] = {
60 0, 1, 0, 1, 1, 1, 2, 1,
61 3, 1, 4, 1, 5, 1, 6, 1,
62 7, 1, 8, 1, 9
63};
64
65static const unsigned char _ControlVerbs_key_offsets[] = {
66 0, 7, 8, 10, 12, 14, 16, 18,
67 20, 21, 23, 25, 27, 30, 32, 34,
68 36, 38, 40, 42, 44, 46, 48, 50,
69 52, 55, 57, 59, 61, 63, 66, 68,
70 70, 72, 74, 76, 79, 82, 84, 86,
71 88, 90, 92, 94, 96, 98, 100, 102,
72 105, 107, 109, 111, 113, 115, 117, 119,
73 121, 123, 125, 127, 129, 131, 133, 135,
74 137, 139, 141, 143, 146, 148, 149, 151,
75 155, 157, 159, 160, 161
76};
77
78static const char _ControlVerbs_trans_keys[] = {
79 41, 65, 66, 67, 76, 78, 85, 41,
80 41, 78, 41, 89, 41, 67, 41, 82,
81 41, 76, 41, 70, 41, 41, 83, 41,
82 82, 41, 95, 41, 65, 85, 41, 78,
83 41, 89, 41, 67, 41, 78, 41, 73,
84 41, 67, 41, 79, 41, 68, 41, 69,
85 41, 82, 41, 76, 41, 70, 73, 41,
86 77, 41, 73, 41, 84, 41, 95, 41,
87 77, 82, 41, 65, 41, 84, 41, 67,
88 41, 72, 41, 61, 41, 48, 57, 41,
89 48, 57, 41, 69, 41, 67, 41, 85,
90 41, 82, 41, 83, 41, 73, 41, 79,
91 41, 78, 41, 79, 41, 95, 41, 65,
92 83, 41, 85, 41, 84, 41, 79, 41,
93 95, 41, 80, 41, 79, 41, 83, 41,
94 83, 41, 69, 41, 83, 41, 83, 41,
95 84, 41, 65, 41, 82, 41, 84, 41,
96 95, 41, 79, 41, 80, 41, 84, 41,
97 67, 84, 41, 80, 41, 41, 70, 41,
98 49, 51, 56, 41, 54, 41, 50, 41,
99 40, 42, 0
100};
101
102static const char _ControlVerbs_single_lengths[] = {
103 7, 1, 2, 2, 2, 2, 2, 2,
104 1, 2, 2, 2, 3, 2, 2, 2,
105 2, 2, 2, 2, 2, 2, 2, 2,
106 3, 2, 2, 2, 2, 3, 2, 2,
107 2, 2, 2, 1, 1, 2, 2, 2,
108 2, 2, 2, 2, 2, 2, 2, 3,
109 2, 2, 2, 2, 2, 2, 2, 2,
110 2, 2, 2, 2, 2, 2, 2, 2,
111 2, 2, 2, 3, 2, 1, 2, 4,
112 2, 2, 1, 1, 1
113};
114
115static const char _ControlVerbs_range_lengths[] = {
116 0, 0, 0, 0, 0, 0, 0, 0,
117 0, 0, 0, 0, 0, 0, 0, 0,
118 0, 0, 0, 0, 0, 0, 0, 0,
119 0, 0, 0, 0, 0, 0, 0, 0,
120 0, 0, 0, 1, 1, 0, 0, 0,
121 0, 0, 0, 0, 0, 0, 0, 0,
122 0, 0, 0, 0, 0, 0, 0, 0,
123 0, 0, 0, 0, 0, 0, 0, 0,
124 0, 0, 0, 0, 0, 0, 0, 0,
125 0, 0, 0, 0, 0
126};
127
128static const short _ControlVerbs_index_offsets[] = {
129 0, 8, 10, 13, 16, 19, 22, 25,
130 28, 30, 33, 36, 39, 43, 46, 49,
131 52, 55, 58, 61, 64, 67, 70, 73,
132 76, 80, 83, 86, 89, 92, 96, 99,
133 102, 105, 108, 111, 114, 117, 120, 123,
134 126, 129, 132, 135, 138, 141, 144, 147,
135 151, 154, 157, 160, 163, 166, 169, 172,
136 175, 178, 181, 184, 187, 190, 193, 196,
137 199, 202, 205, 208, 212, 215, 217, 220,
138 225, 228, 231, 233, 235
139};
140
141static const char _ControlVerbs_indicies[] = {
142 0, 2, 3, 4, 5, 6, 7, 1,
143 8, 1, 8, 9, 1, 8, 10, 1,
144 11, 12, 1, 8, 13, 1, 8, 14,
145 1, 8, 15, 1, 11, 1, 8, 16,
146 1, 8, 17, 1, 8, 18, 1, 8,
147 19, 20, 1, 8, 21, 1, 8, 22,
148 1, 8, 12, 1, 8, 23, 1, 8,
149 24, 1, 8, 25, 1, 8, 26, 1,
150 8, 27, 1, 8, 15, 1, 8, 28,
151 1, 11, 14, 1, 8, 15, 29, 1,
152 8, 30, 1, 8, 31, 1, 8, 32,
153 1, 8, 33, 1, 8, 34, 35, 1,
154 8, 36, 1, 8, 37, 1, 8, 38,
155 1, 8, 39, 1, 8, 40, 1, 8,
156 41, 1, 11, 41, 1, 8, 42, 1,
157 8, 43, 1, 8, 44, 1, 8, 45,
158 1, 8, 46, 1, 8, 47, 1, 8,
159 48, 1, 8, 39, 1, 8, 49, 1,
160 8, 50, 1, 8, 51, 52, 1, 8,
161 53, 1, 8, 54, 1, 8, 55, 1,
162 8, 56, 1, 8, 57, 1, 8, 58,
163 1, 8, 59, 1, 8, 60, 1, 8,
164 61, 1, 8, 62, 1, 8, 15, 1,
165 8, 63, 1, 8, 64, 1, 8, 65,
166 1, 8, 66, 1, 8, 67, 1, 8,
167 68, 1, 8, 69, 1, 8, 15, 1,
168 8, 70, 71, 1, 8, 72, 1, 73,
169 1, 8, 74, 1, 75, 76, 77, 78,
170 1, 8, 15, 1, 8, 15, 1, 75,
171 1, 80, 79, 82, 81, 0
172};
173
174static const char _ControlVerbs_trans_targs[] = {
175 75, 1, 2, 9, 22, 24, 45, 67,
176 75, 3, 4, 75, 5, 6, 7, 8,
177 10, 11, 12, 13, 16, 14, 15, 17,
178 18, 19, 20, 21, 23, 25, 26, 27,
179 28, 29, 30, 37, 31, 32, 33, 34,
180 35, 36, 38, 39, 40, 41, 42, 43,
181 44, 46, 47, 48, 59, 49, 50, 51,
182 52, 53, 54, 55, 56, 57, 58, 60,
183 61, 62, 63, 64, 65, 66, 68, 70,
184 69, 75, 71, 75, 72, 73, 74, 75,
185 76, 75, 0
186};
187
188static const char _ControlVerbs_trans_actions[] = {
189 19, 0, 0, 0, 0, 0, 0, 0,
190 13, 0, 0, 11, 0, 0, 0, 0,
191 0, 0, 0, 0, 0, 0, 0, 0,
192 0, 0, 0, 0, 0, 0, 0, 0,
193 0, 0, 0, 0, 0, 0, 0, 0,
194 0, 0, 0, 0, 0, 0, 0, 0,
195 0, 0, 0, 0, 0, 0, 0, 0,
196 0, 0, 0, 0, 0, 0, 0, 0,
197 0, 0, 0, 0, 0, 0, 0, 0,
198 0, 9, 0, 7, 0, 0, 0, 15,
199 5, 17, 0
200};
201
202static const char _ControlVerbs_to_state_actions[] = {
203 0, 0, 0, 0, 0, 0, 0, 0,
204 0, 0, 0, 0, 0, 0, 0, 0,
205 0, 0, 0, 0, 0, 0, 0, 0,
206 0, 0, 0, 0, 0, 0, 0, 0,
207 0, 0, 0, 0, 0, 0, 0, 0,
208 0, 0, 0, 0, 0, 0, 0, 0,
209 0, 0, 0, 0, 0, 0, 0, 0,
210 0, 0, 0, 0, 0, 0, 0, 0,
211 0, 0, 0, 0, 0, 0, 0, 0,
212 0, 0, 0, 1, 0
213};
214
215static const char _ControlVerbs_from_state_actions[] = {
216 0, 0, 0, 0, 0, 0, 0, 0,
217 0, 0, 0, 0, 0, 0, 0, 0,
218 0, 0, 0, 0, 0, 0, 0, 0,
219 0, 0, 0, 0, 0, 0, 0, 0,
220 0, 0, 0, 0, 0, 0, 0, 0,
221 0, 0, 0, 0, 0, 0, 0, 0,
222 0, 0, 0, 0, 0, 0, 0, 0,
223 0, 0, 0, 0, 0, 0, 0, 0,
224 0, 0, 0, 0, 0, 0, 0, 0,
225 0, 0, 0, 3, 0
226};
227
228static const short _ControlVerbs_eof_trans[] = {
229 1, 1, 1, 1, 1, 1, 1, 1,
230 1, 1, 1, 1, 1, 1, 1, 1,
231 1, 1, 1, 1, 1, 1, 1, 1,
232 1, 1, 1, 1, 1, 1, 1, 1,
233 1, 1, 1, 1, 1, 1, 1, 1,
234 1, 1, 1, 1, 1, 1, 1, 1,
235 1, 1, 1, 1, 1, 1, 1, 1,
236 1, 1, 1, 1, 1, 1, 1, 1,
237 1, 1, 1, 1, 1, 1, 1, 1,
238 1, 1, 1, 0, 82
239};
240
241static const int ControlVerbs_start = 75;
242//static const int ControlVerbs_first_final = 75;
243//static const int ControlVerbs_error = -1;
244
245//static const int ControlVerbs_en_main = 75;
246
247
248#line 249 "control_verbs.cpp"
249 {
250 cs = ControlVerbs_start;
251 ts = 0;
252 te = 0;
253 act = 0;
254 }
255
256#line 105 "control_verbs.rl"
257
258
259 try {
260
261#line 262 "control_verbs.cpp"
262 {
263 int _klen;
264 unsigned int _trans;
265 const char *_acts;
266 unsigned int _nacts;
267 const char *_keys;
268
269 if ( p == pe )
270 goto _test_eof;
271_resume:
272 _acts = _ControlVerbs_actions + _ControlVerbs_from_state_actions[cs];
273 _nacts = (unsigned int) *_acts++;
274 while ( _nacts-- > 0 ) {
275 switch ( *_acts++ ) {
276 case 1:
277#line 1 "NONE"
278 {ts = p;}
279 break;
280#line 281 "control_verbs.cpp"
281 }
282 }
283
284 _keys = _ControlVerbs_trans_keys + _ControlVerbs_key_offsets[cs];
285 _trans = _ControlVerbs_index_offsets[cs];
286
287 _klen = _ControlVerbs_single_lengths[cs];
288 if ( _klen > 0 ) {
289 const char *_lower = _keys;
290 const char *_mid;
291 const char *_upper = _keys + _klen - 1;
292 while (1) {
293 if ( _upper < _lower )
294 break;
295
296 _mid = _lower + ((_upper-_lower) >> 1);
297 if ( (*p) < *_mid )
298 _upper = _mid - 1;
299 else if ( (*p) > *_mid )
300 _lower = _mid + 1;
301 else {
302 _trans += (unsigned int)(_mid - _keys);
303 goto _match;
304 }
305 }
306 _keys += _klen;
307 _trans += _klen;
308 }
309
310 _klen = _ControlVerbs_range_lengths[cs];
311 if ( _klen > 0 ) {
312 const char *_lower = _keys;
313 const char *_mid;
314 const char *_upper = _keys + (_klen<<1) - 2;
315 while (1) {
316 if ( _upper < _lower )
317 break;
318
319 _mid = _lower + (((_upper-_lower) >> 1) & ~1);
320 if ( (*p) < _mid[0] )
321 _upper = _mid - 2;
322 else if ( (*p) > _mid[1] )
323 _lower = _mid + 2;
324 else {
325 _trans += (unsigned int)((_mid - _keys)>>1);
326 goto _match;
327 }
328 }
329 _trans += _klen;
330 }
331
332_match:
333 _trans = _ControlVerbs_indicies[_trans];
334_eof_trans:
335 cs = _ControlVerbs_trans_targs[_trans];
336
337 if ( _ControlVerbs_trans_actions[_trans] == 0 )
338 goto _again;
339
340 _acts = _ControlVerbs_actions + _ControlVerbs_trans_actions[_trans];
341 _nacts = (unsigned int) *_acts++;
342 while ( _nacts-- > 0 )
343 {
344 switch ( *_acts++ )
345 {
346 case 2:
347#line 1 "NONE"
348 {te = p+1;}
349 break;
350 case 3:
351#line 76 "control_verbs.rl"
352 {te = p+1;{
353 mode.utf8 = true;
354 }}
355 break;
356 case 4:
357#line 80 "control_verbs.rl"
358 {te = p+1;{
359 mode.ucp = true;
360 }}
361 break;
362 case 5:
363#line 84 "control_verbs.rl"
364 {te = p+1;{
365 ostringstream str;
366 str << "Unsupported control verb " << string(ts, te - ts);
367 throw LocatedParseError(str.str());
368 }}
369 break;
370 case 6:
371#line 90 "control_verbs.rl"
372 {te = p+1;{
373 ostringstream str;
374 str << "Unknown control verb " << string(ts, te - ts);
375 throw LocatedParseError(str.str());
376 }}
377 break;
378 case 7:
379#line 97 "control_verbs.rl"
380 {te = p+1;{
381 p--;
382 {p++; goto _out; }
383 }}
384 break;
385 case 8:
386#line 97 "control_verbs.rl"
387 {te = p;p--;{
388 p--;
389 {p++; goto _out; }
390 }}
391 break;
392 case 9:
393#line 97 "control_verbs.rl"
394 {{p = ((te))-1;}{
395 p--;
396 {p++; goto _out; }
397 }}
398 break;
399#line 400 "control_verbs.cpp"
400 }
401 }
402
403_again:
404 _acts = _ControlVerbs_actions + _ControlVerbs_to_state_actions[cs];
405 _nacts = (unsigned int) *_acts++;
406 while ( _nacts-- > 0 ) {
407 switch ( *_acts++ ) {
408 case 0:
409#line 1 "NONE"
410 {ts = 0;}
411 break;
412#line 413 "control_verbs.cpp"
413 }
414 }
415
416 if ( ++p != pe )
417 goto _resume;
418 _test_eof: {}
419 if ( p == eof )
420 {
421 if ( _ControlVerbs_eof_trans[cs] > 0 ) {
422 _trans = _ControlVerbs_eof_trans[cs] - 1;
423 goto _eof_trans;
424 }
425 }
426
427 _out: {}
428 }
429
430#line 109 "control_verbs.rl"
431 } catch (LocatedParseError &error) {
432 if (ts >= ptr && ts <= pe) {
433 error.locate(ts - ptr + start);
434 } else {
435 error.locate(0);
436 }
437 throw;
438 }
439
440 return p;
441}
442
443} // namespace ue2
444