1 /* Generated by re2c */
2 #line 1 "bug1454253.re"
3 // re2c $INPUT -o $OUTPUT
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <string.h>
7 
8 #define RET(n) return n
9 
scan(const char * s,int l,char * r)10 size_t scan(const char *s, int l, char *r)
11 {
12 	const char *p = s;
13 	const char *q;
14 	#define YYCTYPE         char
15 	#define YYCURSOR        p
16 	#define YYLIMIT         (s+l)
17 	#define YYMARKER        q
18 	#define YYFILL(n)
19 
20 	while(1)
21 	{
22 
23 #line 24 "bug1454253.c"
24 {
25 	YYCTYPE yych;
26 	if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
27 	yych = *(YYMARKER = YYCURSOR);
28 	switch (yych) {
29 	case 0x00:	goto yy3;
30 	case '?':	goto yy7;
31 	default:	goto yy5;
32 	}
33 yy2:
34 #line 41 "bug1454253.re"
35 	{
36 		*r++ = '0';
37 		*r++ = '\0';
38 		return p - s;
39 	}
40 #line 41 "bug1454253.c"
41 yy3:
42 	++YYCURSOR;
43 #line 35 "bug1454253.re"
44 	{
45 		*r++ = '3';
46 		*r++ = '\0';
47 		return p - s;
48 	}
49 #line 50 "bug1454253.c"
50 yy5:
51 	++YYCURSOR;
52 	if (YYLIMIT <= YYCURSOR) YYFILL(1);
53 	yych = *YYCURSOR;
54 	switch (yych) {
55 	case 0x00:
56 	case '?':	goto yy2;
57 	default:	goto yy5;
58 	}
59 yy7:
60 	yych = *++YYCURSOR;
61 	switch (yych) {
62 	case '!':	goto yy9;
63 	case '0':
64 	case '1':
65 	case '2':
66 	case '3':
67 	case '4':
68 	case '5':
69 	case '6':
70 	case '7':
71 	case '8':
72 	case '9':
73 	case 'A':
74 	case 'B':
75 	case 'C':
76 	case 'D':
77 	case 'E':
78 	case 'F':
79 	case 'G':
80 	case 'H':
81 	case 'I':
82 	case 'J':
83 	case 'K':
84 	case 'L':
85 	case 'M':
86 	case 'N':
87 	case 'O':
88 	case 'P':
89 	case 'Q':
90 	case 'R':
91 	case 'S':
92 	case 'T':
93 	case 'U':
94 	case 'V':
95 	case 'W':
96 	case 'X':
97 	case 'Y':
98 	case 'Z':
99 	case 'a':
100 	case 'b':
101 	case 'c':
102 	case 'd':
103 	case 'e':
104 	case 'f':
105 	case 'g':
106 	case 'h':
107 	case 'i':
108 	case 'j':
109 	case 'k':
110 	case 'l':
111 	case 'm':
112 	case 'n':
113 	case 'o':
114 	case 'p':
115 	case 'q':
116 	case 'r':
117 	case 's':
118 	case 't':
119 	case 'u':
120 	case 'v':
121 	case 'w':
122 	case 'x':
123 	case 'y':
124 	case 'z':	goto yy12;
125 	default:	goto yy8;
126 	}
127 yy8:
128 	YYCURSOR = YYMARKER;
129 	goto yy2;
130 yy9:
131 	++YYCURSOR;
132 	if (YYLIMIT <= YYCURSOR) YYFILL(1);
133 	yych = *YYCURSOR;
134 	switch (yych) {
135 	case '0':
136 	case '1':
137 	case '2':
138 	case '3':
139 	case '4':
140 	case '5':
141 	case '6':
142 	case '7':
143 	case '8':
144 	case '9':
145 	case 'A':
146 	case 'B':
147 	case 'C':
148 	case 'D':
149 	case 'E':
150 	case 'F':
151 	case 'G':
152 	case 'H':
153 	case 'I':
154 	case 'J':
155 	case 'K':
156 	case 'L':
157 	case 'M':
158 	case 'N':
159 	case 'O':
160 	case 'P':
161 	case 'Q':
162 	case 'R':
163 	case 'S':
164 	case 'T':
165 	case 'U':
166 	case 'V':
167 	case 'W':
168 	case 'X':
169 	case 'Y':
170 	case 'Z':
171 	case 'a':
172 	case 'b':
173 	case 'c':
174 	case 'd':
175 	case 'e':
176 	case 'f':
177 	case 'g':
178 	case 'h':
179 	case 'i':
180 	case 'j':
181 	case 'k':
182 	case 'l':
183 	case 'm':
184 	case 'n':
185 	case 'o':
186 	case 'p':
187 	case 'q':
188 	case 'r':
189 	case 's':
190 	case 't':
191 	case 'u':
192 	case 'v':
193 	case 'w':
194 	case 'x':
195 	case 'y':
196 	case 'z':	goto yy9;
197 	default:	goto yy11;
198 	}
199 yy11:
200 #line 25 "bug1454253.re"
201 	{
202 		*r++ = '1';
203 		continue;
204 	}
205 #line 206 "bug1454253.c"
206 yy12:
207 	++YYCURSOR;
208 	if (YYLIMIT <= YYCURSOR) YYFILL(1);
209 	yych = *YYCURSOR;
210 	switch (yych) {
211 	case '0':
212 	case '1':
213 	case '2':
214 	case '3':
215 	case '4':
216 	case '5':
217 	case '6':
218 	case '7':
219 	case '8':
220 	case '9':
221 	case 'A':
222 	case 'B':
223 	case 'C':
224 	case 'D':
225 	case 'E':
226 	case 'F':
227 	case 'G':
228 	case 'H':
229 	case 'I':
230 	case 'J':
231 	case 'K':
232 	case 'L':
233 	case 'M':
234 	case 'N':
235 	case 'O':
236 	case 'P':
237 	case 'Q':
238 	case 'R':
239 	case 'S':
240 	case 'T':
241 	case 'U':
242 	case 'V':
243 	case 'W':
244 	case 'X':
245 	case 'Y':
246 	case 'Z':
247 	case 'a':
248 	case 'b':
249 	case 'c':
250 	case 'd':
251 	case 'e':
252 	case 'f':
253 	case 'g':
254 	case 'h':
255 	case 'i':
256 	case 'j':
257 	case 'k':
258 	case 'l':
259 	case 'm':
260 	case 'n':
261 	case 'o':
262 	case 'p':
263 	case 'q':
264 	case 'r':
265 	case 's':
266 	case 't':
267 	case 'u':
268 	case 'v':
269 	case 'w':
270 	case 'x':
271 	case 'y':
272 	case 'z':	goto yy12;
273 	default:	goto yy14;
274 	}
275 yy14:
276 #line 30 "bug1454253.re"
277 	{
278 		*r++ = '2';
279 		continue;
280 	}
281 #line 282 "bug1454253.c"
282 }
283 #line 46 "bug1454253.re"
284 
285 	}
286 }
287 
_do_scan(const char * str,size_t str_len,size_t scn_len,const char * exp,size_t exp_len)288 void _do_scan(const char * str, size_t str_len, size_t scn_len, const char * exp, size_t exp_len)
289 {
290 	char res[32], sp[32];
291 	size_t res_len, inp_len;
292 
293 	inp_len = scan(str, str_len, res);
294 	res_len = strlen(res);
295 
296 	memset(sp, ' ', sizeof(sp));
297 	sp[15 - str_len] = '\0';
298 
299 	printf("[%s](%2d/%2d)%s: %8s(%d) %s %8s(%d)\n", str, inp_len, scn_len, sp,
300 			res, res_len,
301 			inp_len != scn_len || exp_len != res_len || strncmp(exp, res, exp_len) ? "!=" : "==",
302 			exp, exp_len);
303 }
304 
305 #define do_scan(str, scn_len, exp) _do_scan(str, sizeof(str) - 1, scn_len, exp, sizeof(exp) - 1)
306 
main()307 main()
308 {
309 	do_scan("?1??",         2, "20");
310 	do_scan("#",            1, "0");
311 	do_scan("##",           2, "0");
312 	do_scan("##?",          2, "0");
313 	do_scan("##|",          3, "0");
314 	do_scan("?!|",          3, "10");
315 	do_scan("?!?1|",        5, "120");
316 	do_scan("?!?a+",        5, "120");
317 	do_scan("?2!1?2??",     4, "20");
318 	do_scan("?1?2!1?2??",   6, "220");
319 	do_scan("?1?2?!1?2??",  9, "22120");
320 	do_scan("?1?2?!1?2?!", 12, "221213");
321 	do_scan("?1?123?45??",  9, "2220");
322 	do_scan("?1?123?45?!", 12, "22213");
323 }
324 bug1454253.re:41:6: warning: rule matches empty string [-Wmatch-empty-string]
325