/* Generated by re2c */ #line 1 "repeater.re" #include #include #include #define RET(n) return n int scan(const char *s, int l){ const char *p = s; const char *q; #define YYCTYPE char #define YYCURSOR p #define YYLIMIT (s+l) #define YYMARKER q #define YYFILL(n) #line 19 "repeater.c" { YYCTYPE yych; unsigned int yyaccept = 0; if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7); yych = *YYCURSOR; switch (yych) { case '\n': case 'q': goto yy4; case 'A': goto yy6; case 'a': goto yy7; default: goto yy2; } yy2: ++YYCURSOR; yy3: #line 22 "repeater.re" {RET(5);} #line 37 "repeater.c" yy4: ++YYCURSOR; yy5: #line 23 "repeater.re" {RET(0);} #line 43 "repeater.c" yy6: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { case '\n': goto yy8; case 'A': case 'a': goto yy10; default: goto yy3; } yy7: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { case '\n': goto yy8; case 'A': case 'a': goto yy10; default: goto yy5; } yy8: ++YYCURSOR; #line 18 "repeater.re" {RET(1);} #line 66 "repeater.c" yy10: yych = *++YYCURSOR; switch (yych) { case '\n': goto yy12; case 'A': case 'a': goto yy14; default: goto yy11; } yy11: YYCURSOR = YYMARKER; if (yyaccept == 0) { goto yy3; } else { goto yy5; } yy12: ++YYCURSOR; #line 19 "repeater.re" {RET(2);} #line 86 "repeater.c" yy14: yych = *++YYCURSOR; switch (yych) { case '\n': goto yy12; case 'A': case 'a': goto yy15; default: goto yy11; } yy15: yych = *++YYCURSOR; switch (yych) { case '\n': goto yy16; case 'A': case 'a': goto yy18; default: goto yy11; } yy16: ++YYCURSOR; #line 21 "repeater.re" {RET(4);} #line 107 "repeater.c" yy18: yych = *++YYCURSOR; switch (yych) { case '\n': goto yy16; case 'A': case 'a': goto yy19; default: goto yy11; } yy19: yych = *++YYCURSOR; switch (yych) { case '\n': goto yy20; default: goto yy23; } yy20: ++YYCURSOR; #line 20 "repeater.re" {RET(3);} #line 126 "repeater.c" yy22: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; yy23: switch (yych) { case '\n': goto yy16; case 'A': case 'a': goto yy22; default: goto yy11; } } #line 24 "repeater.re" } void _do_scan(int exp, const char * str, int len) { int ret = scan(str, len); printf("%d %s %d\n", exp, exp == ret ? "==" : "!=", ret); } #define do_scan(exp, str) _do_scan(exp, str, sizeof(str) - 1) main() { do_scan(1, "a\n"); do_scan(2, "aa\n"); do_scan(2, "aaa\n"); do_scan(4, "aaaa\n"); do_scan(0, "q"); do_scan(0, "a"); do_scan(1, "A\n"); do_scan(2, "AA\n"); do_scan(2, "aAa\n"); do_scan(4, "AaaA\n"); do_scan(5, "Q"); do_scan(4, "AaaAa\n"); do_scan(3, "AaaAaA\n"); do_scan(5, "A"); do_scan(0, "\n"); do_scan(5, "0"); do_scan(0, "a"); do_scan(0, "q"); do_scan(5, "x"); }