1 /* Generated by re2c */
2 #line 1 "bug1454253b.re"
3 // re2c $INPUT -o $OUTPUT -s
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 "bug1454253b.c"
24 {
25 	YYCTYPE yych;
26 	if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
27 	yych = *YYCURSOR;
28 	if (yych == '?') goto yy4;
29 	++YYCURSOR;
30 #line 34 "bug1454253b.re"
31 	{
32 		*r++ = '0';
33 		*r++ = '\0';
34 		return p - s;
35 	}
36 #line 37 "bug1454253b.c"
37 yy4:
38 	yych = *++YYCURSOR;
39 	if (yych <= '9') {
40 		if (yych == '!') goto yy6;
41 		if (yych >= '0') goto yy9;
42 	} else {
43 		if (yych <= 'Z') {
44 			if (yych >= 'A') goto yy9;
45 		} else {
46 			if (yych <= '`') goto yy5;
47 			if (yych <= 'z') goto yy9;
48 		}
49 	}
50 yy5:
51 yy6:
52 	++YYCURSOR;
53 	if (YYLIMIT <= YYCURSOR) YYFILL(1);
54 	yych = *YYCURSOR;
55 	if (yych <= '@') {
56 		if (yych <= '/') goto yy8;
57 		if (yych <= '9') goto yy6;
58 	} else {
59 		if (yych <= 'Z') goto yy6;
60 		if (yych <= '`') goto yy8;
61 		if (yych <= 'z') goto yy6;
62 	}
63 yy8:
64 #line 24 "bug1454253b.re"
65 	{
66 		*r++ = '1';
67 		continue;
68 	}
69 #line 70 "bug1454253b.c"
70 yy9:
71 	++YYCURSOR;
72 	if (YYLIMIT <= YYCURSOR) YYFILL(1);
73 	yych = *YYCURSOR;
74 	if (yych <= '@') {
75 		if (yych <= '/') goto yy11;
76 		if (yych <= '9') goto yy9;
77 	} else {
78 		if (yych <= 'Z') goto yy9;
79 		if (yych <= '`') goto yy11;
80 		if (yych <= 'z') goto yy9;
81 	}
82 yy11:
83 #line 29 "bug1454253b.re"
84 	{
85 		*r++ = '2';
86 		continue;
87 	}
88 #line 89 "bug1454253b.c"
89 }
90 #line 39 "bug1454253b.re"
91 
92 	}
93 }
94 
_do_scan(const char * str,size_t str_len,size_t scn_len,const char * exp,size_t exp_len)95 void _do_scan(const char * str, size_t str_len, size_t scn_len, const char * exp, size_t exp_len)
96 {
97 	char res[32], sp[32];
98 	size_t res_len, inp_len;
99 
100 	inp_len = scan(str, str_len, res);
101 	res_len = strlen(res);
102 
103 	memset(sp, ' ', sizeof(sp));
104 	sp[15 - str_len] = '\0';
105 
106 	printf("[%s](%2d/%2d)%s: %8s(%d) %s %8s(%d)\n", str, inp_len, scn_len, sp,
107 			exp, exp_len,
108 			inp_len != scn_len || exp_len != res_len || strncmp(exp, res, exp_len) ? "!=" : "==",
109 			res, res_len);
110 }
111 
112 #define do_scan(str, scn_len, exp) _do_scan(str, sizeof(str) - 1, scn_len, exp, sizeof(exp) - 1)
113 
main()114 main()
115 {
116 	do_scan("?1??",         4, "20");
117 	do_scan("#",            1, "0");
118 	do_scan("##",           1, "0");
119 	do_scan("##?",          1, "0");
120 	do_scan("##|",          1, "0");
121 	do_scan("?!|",          3, "10");
122 	do_scan("?!?1|",        5, "120");
123 	do_scan("?!?a+",        5, "120");
124 	do_scan("?2!1?2??",     3, "20");
125 	do_scan("?1?2!1?2??",   5, "220");
126 	do_scan("?1?2?!1?2??", 11, "22120");
127 	do_scan("?1?2?!1?2?!", 12, "221210");
128 	do_scan("?1?123?45??", 11, "2220");
129 	do_scan("?1?123?45?!", 12, "22210");
130 }
131 bug1454253b.re:20:0: warning: control flow is undefined for strings that match '\x3F [\x0-\x20\x22-\x2F\x3A-\x40\x5B-\x60\x7B-\xFF]', use default rule '*' [-Wundefined-control-flow]
132