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