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