1 /* Generated by re2c */
2 #line 1 "repeater.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)10 int scan(const char *s, int l){
11 const char *p = s;
12 const char *q;
13 #define YYCTYPE char
14 #define YYCURSOR p
15 #define YYLIMIT (s+l)
16 #define YYMARKER q
17 #define YYFILL(n)
18
19 #line 20 "repeater.c"
20 {
21 YYCTYPE yych;
22 unsigned int yyaccept = 0;
23 if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7);
24 yych = *YYCURSOR;
25 switch (yych) {
26 case '\n':
27 case 'q': goto yy4;
28 case 'A': goto yy6;
29 case 'a': goto yy7;
30 default: goto yy2;
31 }
32 yy2:
33 ++YYCURSOR;
34 yy3:
35 #line 23 "repeater.re"
36 {RET(5);}
37 #line 38 "repeater.c"
38 yy4:
39 ++YYCURSOR;
40 yy5:
41 #line 24 "repeater.re"
42 {RET(0);}
43 #line 44 "repeater.c"
44 yy6:
45 yyaccept = 0;
46 yych = *(YYMARKER = ++YYCURSOR);
47 switch (yych) {
48 case '\n': goto yy8;
49 case 'A':
50 case 'a': goto yy10;
51 default: goto yy3;
52 }
53 yy7:
54 yyaccept = 1;
55 yych = *(YYMARKER = ++YYCURSOR);
56 switch (yych) {
57 case '\n': goto yy8;
58 case 'A':
59 case 'a': goto yy10;
60 default: goto yy5;
61 }
62 yy8:
63 ++YYCURSOR;
64 #line 19 "repeater.re"
65 {RET(1);}
66 #line 67 "repeater.c"
67 yy10:
68 yych = *++YYCURSOR;
69 switch (yych) {
70 case '\n': goto yy12;
71 case 'A':
72 case 'a': goto yy14;
73 default: goto yy11;
74 }
75 yy11:
76 YYCURSOR = YYMARKER;
77 if (yyaccept == 0) {
78 goto yy3;
79 } else {
80 goto yy5;
81 }
82 yy12:
83 ++YYCURSOR;
84 #line 20 "repeater.re"
85 {RET(2);}
86 #line 87 "repeater.c"
87 yy14:
88 yych = *++YYCURSOR;
89 switch (yych) {
90 case '\n': goto yy12;
91 case 'A':
92 case 'a': goto yy15;
93 default: goto yy11;
94 }
95 yy15:
96 yych = *++YYCURSOR;
97 switch (yych) {
98 case '\n': goto yy16;
99 case 'A':
100 case 'a': goto yy18;
101 default: goto yy11;
102 }
103 yy16:
104 ++YYCURSOR;
105 #line 22 "repeater.re"
106 {RET(4);}
107 #line 108 "repeater.c"
108 yy18:
109 yych = *++YYCURSOR;
110 switch (yych) {
111 case '\n': goto yy16;
112 case 'A':
113 case 'a': goto yy19;
114 default: goto yy11;
115 }
116 yy19:
117 yych = *++YYCURSOR;
118 switch (yych) {
119 case '\n': goto yy20;
120 default: goto yy23;
121 }
122 yy20:
123 ++YYCURSOR;
124 #line 21 "repeater.re"
125 {RET(3);}
126 #line 127 "repeater.c"
127 yy22:
128 ++YYCURSOR;
129 if (YYLIMIT <= YYCURSOR) YYFILL(1);
130 yych = *YYCURSOR;
131 yy23:
132 switch (yych) {
133 case '\n': goto yy16;
134 case 'A':
135 case 'a': goto yy22;
136 default: goto yy11;
137 }
138 }
139 #line 25 "repeater.re"
140
141 }
142
_do_scan(int exp,const char * str,int len)143 void _do_scan(int exp, const char * str, int len)
144 {
145 int ret = scan(str, len);
146
147 printf("%d %s %d\n", exp, exp == ret ? "==" : "!=", ret);
148 }
149
150 #define do_scan(exp, str) _do_scan(exp, str, sizeof(str) - 1)
151
main()152 main()
153 {
154 do_scan(1, "a\n");
155 do_scan(2, "aa\n");
156 do_scan(2, "aaa\n");
157 do_scan(4, "aaaa\n");
158 do_scan(0, "q");
159 do_scan(0, "a");
160 do_scan(1, "A\n");
161 do_scan(2, "AA\n");
162 do_scan(2, "aAa\n");
163 do_scan(4, "AaaA\n");
164 do_scan(5, "Q");
165 do_scan(4, "AaaAa\n");
166 do_scan(3, "AaaAaA\n");
167 do_scan(5, "A");
168 do_scan(0, "\n");
169 do_scan(5, "0");
170 do_scan(0, "a");
171 do_scan(0, "q");
172 do_scan(5, "x");
173 }
174