1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
/* Generated by re2c */
#line 1 "bug1454253_s.re"
// re2c $INPUT -o $OUTPUT -s
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define RET(n) return n
size_t scan(const char *s, int l, char *r)
{
const char *p = s;
const char *q;
#define YYCTYPE char
#define YYCURSOR p
#define YYLIMIT (s+l)
#define YYMARKER q
#define YYFILL(n)
while(1)
{
#line 24 "bug1454253_s.c"
{
YYCTYPE yych;
YYMARKER = YYCURSOR;
if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if (yych <= 0x00) goto yy2;
if (yych == '?') goto yy4;
goto yy3;
yy1:
#line 41 "bug1454253_s.re"
{
*r++ = '0';
*r++ = '\0';
return p - s;
}
#line 40 "bug1454253_s.c"
yy2:
++YYCURSOR;
#line 35 "bug1454253_s.re"
{
*r++ = '3';
*r++ = '\0';
return p - s;
}
#line 49 "bug1454253_s.c"
yy3:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if (yych <= 0x00) goto yy1;
if (yych == '?') goto yy1;
goto yy3;
yy4:
yych = *++YYCURSOR;
if (yych <= '9') {
if (yych == '!') goto yy6;
if (yych >= '0') goto yy8;
} else {
if (yych <= 'Z') {
if (yych >= 'A') goto yy8;
} else {
if (yych <= '`') goto yy5;
if (yych <= 'z') goto yy8;
}
}
yy5:
YYCURSOR = YYMARKER;
goto yy1;
yy6:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if (yych <= '@') {
if (yych <= '/') goto yy7;
if (yych <= '9') goto yy6;
} else {
if (yych <= 'Z') goto yy6;
if (yych <= '`') goto yy7;
if (yych <= 'z') goto yy6;
}
yy7:
#line 25 "bug1454253_s.re"
{
*r++ = '1';
continue;
}
#line 91 "bug1454253_s.c"
yy8:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if (yych <= '@') {
if (yych <= '/') goto yy9;
if (yych <= '9') goto yy8;
} else {
if (yych <= 'Z') goto yy8;
if (yych <= '`') goto yy9;
if (yych <= 'z') goto yy8;
}
yy9:
#line 30 "bug1454253_s.re"
{
*r++ = '2';
continue;
}
#line 110 "bug1454253_s.c"
}
#line 46 "bug1454253_s.re"
}
}
void _do_scan(const char * str, size_t str_len, size_t scn_len, const char * exp, size_t exp_len)
{
char res[32], sp[32];
size_t res_len, inp_len;
inp_len = scan(str, str_len, res);
res_len = strlen(res);
memset(sp, ' ', sizeof(sp));
sp[15 - str_len] = '\0';
printf("[%s](%2d/%2d)%s: %8s(%d) %s %8s(%d)\n", str, inp_len, scn_len, sp,
res, res_len,
inp_len != scn_len || exp_len != res_len || strncmp(exp, res, exp_len) ? "!=" : "==",
exp, exp_len);
}
#define do_scan(str, scn_len, exp) _do_scan(str, sizeof(str) - 1, scn_len, exp, sizeof(exp) - 1)
main()
{
do_scan("?1??", 2, "20");
do_scan("#", 1, "0");
do_scan("##", 2, "0");
do_scan("##?", 2, "0");
do_scan("##|", 3, "0");
do_scan("?!|", 3, "10");
do_scan("?!?1|", 5, "120");
do_scan("?!?a+", 5, "120");
do_scan("?2!1?2??", 4, "20");
do_scan("?1?2!1?2??", 6, "220");
do_scan("?1?2?!1?2??", 9, "22120");
do_scan("?1?2?!1?2?!", 12, "221213");
do_scan("?1?123?45??", 9, "2220");
do_scan("?1?123?45?!", 12, "22213");
}
bug1454253_s.re:41:6: warning: rule matches empty string [-Wmatch-empty-string]
|