blob: 034c935bd9067b3cdea31cacd62e24d4fd98d6d4 [file] [log] [blame]
/* Generated by re2c 0.9.1-C on Sun Oct 9 22:15:58 2005
*/
#line 1 "scanner.re"
#include <stdlib.h>
#include <string.h>
#include "tools/re2c/scanner.h"
#include "tools/re2c/parse.h"
#include "tools/re2c/globals.h"
#include "tools/re2c/parser.h"
#ifndef MAX
#define MAX(a,b) (((a)>(b))?(a):(b))
#endif
#define BSIZE 8192
#define YYCTYPE unsigned char
#define YYCURSOR cursor
#define YYLIMIT s->lim
#define YYMARKER s->ptr
#define YYFILL(n) {cursor = fill(s, cursor);}
#define RETURN(i) {s->cur = cursor; return i;}
static unsigned char *fill(Scanner*, unsigned char*);
void
Scanner_init(Scanner *s, FILE *i)
{
s->in = i;
s->bot = s->tok = s->ptr = s->cur = s->pos = s->lim = s->top =
s->eof = NULL;
s->tchar = s->tline = 0;
s->cline = 1;
}
static unsigned char *
fill(Scanner *s, unsigned char *cursor)
{
if(!s->eof){
unsigned int cnt = s->tok - s->bot;
if(cnt){
memcpy(s->bot, s->tok, s->lim - s->tok);
s->tok = s->bot;
s->ptr -= cnt;
cursor -= cnt;
s->pos -= cnt;
s->lim -= cnt;
}
if((s->top - s->lim) < BSIZE){
unsigned char *buf = malloc(((s->lim - s->bot) + BSIZE) + 1);
memcpy(buf, s->tok, s->lim - s->tok);
s->tok = buf;
s->ptr = &buf[s->ptr - s->bot];
cursor = &buf[cursor - s->bot];
s->pos = &buf[s->pos - s->bot];
s->lim = &buf[s->lim - s->bot];
s->top = &s->lim[BSIZE];
if (s->bot)
free(s->bot);
s->bot = buf;
}
if((cnt = fread(s->lim, 1, BSIZE, s->in)) != BSIZE){
s->eof = &s->lim[cnt]; *s->eof++ = '\0';
}
s->lim += cnt;
}
return cursor;
}
#line 79 "scanner.re"
int
Scanner_echo(Scanner *s, FILE *out)
{
unsigned char *cursor = s->cur;
int ignore_eoc = 0;
/* Catch EOF */
if (s->eof && cursor == s->eof)
return 0;
s->tok = cursor;
echo:
#line 87 "scanner.c"
{
YYCTYPE yych;
unsigned int yyaccept;
goto yy0;
++YYCURSOR;
yy0:
if((YYLIMIT - YYCURSOR) < 11) YYFILL(11);
yych = *YYCURSOR;
if(yych <= ')'){
if(yych <= '\000') goto yy7;
if(yych == '\n') goto yy5;
goto yy9;
} else {
if(yych <= '*') goto yy4;
if(yych != '/') goto yy9;
goto yy2;
}
yy2: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
if(yych == '*') goto yy12;
goto yy3;
yy3:
#line 117 "scanner.re"
{ goto echo; }
#line 112 "scanner.c"
yy4: yych = *++YYCURSOR;
if(yych == '/') goto yy10;
goto yy3;
yy5: yych = *++YYCURSOR;
goto yy6;
yy6:
#line 112 "scanner.re"
{ fwrite(s->tok, 1, cursor - s->tok, out);
s->tok = s->pos = cursor; s->cline++; oline++;
goto echo; }
#line 123 "scanner.c"
yy7: yych = *++YYCURSOR;
goto yy8;
yy8:
#line 115 "scanner.re"
{ fwrite(s->tok, 1, cursor - s->tok - 1, out); /* -1 so we don't write out the \0 */
if(cursor == s->eof) { RETURN(0); } }
#line 130 "scanner.c"
yy9: yych = *++YYCURSOR;
goto yy3;
yy10: yych = *++YYCURSOR;
goto yy11;
yy11:
#line 103 "scanner.re"
{
if (ignore_eoc) {
ignore_eoc = 0;
} else {
fwrite(s->tok, 1, cursor - s->tok, out);
}
s->tok = s->pos = cursor;
goto echo;
}
#line 146 "scanner.c"
yy12: yych = *++YYCURSOR;
if(yych == '!') goto yy14;
goto yy13;
yy13: YYCURSOR = YYMARKER;
switch(yyaccept){
case 0: goto yy3;
}
yy14: yych = *++YYCURSOR;
if(yych == 'm') goto yy15;
if(yych == 'r') goto yy16;
goto yy13;
yy15: yych = *++YYCURSOR;
if(yych == 'a') goto yy21;
goto yy13;
yy16: yych = *++YYCURSOR;
if(yych != 'e') goto yy13;
goto yy17;
yy17: yych = *++YYCURSOR;
if(yych != '2') goto yy13;
goto yy18;
yy18: yych = *++YYCURSOR;
if(yych != 'c') goto yy13;
goto yy19;
yy19: yych = *++YYCURSOR;
goto yy20;
yy20:
#line 94 "scanner.re"
{ fwrite(s->tok, 1, &cursor[-7] - s->tok, out);
s->tok = cursor;
RETURN(1); }
#line 177 "scanner.c"
yy21: yych = *++YYCURSOR;
if(yych != 'x') goto yy13;
goto yy22;
yy22: yych = *++YYCURSOR;
if(yych != ':') goto yy13;
goto yy23;
yy23: yych = *++YYCURSOR;
if(yych != 'r') goto yy13;
goto yy24;
yy24: yych = *++YYCURSOR;
if(yych != 'e') goto yy13;
goto yy25;
yy25: yych = *++YYCURSOR;
if(yych != '2') goto yy13;
goto yy26;
yy26: yych = *++YYCURSOR;
if(yych != 'c') goto yy13;
goto yy27;
yy27: yych = *++YYCURSOR;
goto yy28;
yy28:
#line 97 "scanner.re"
{
fprintf(out, "#define YYMAXFILL %u\n", maxFill);
s->tok = s->pos = cursor;
ignore_eoc = 1;
goto echo;
}
#line 206 "scanner.c"
}
#line 118 "scanner.re"
}
int
Scanner_scan(Scanner *s)
{
unsigned char *cursor = s->cur;
unsigned int depth;
scan:
s->tchar = cursor - s->pos;
s->tline = s->cline;
s->tok = cursor;
#line 224 "scanner.c"
{
YYCTYPE yych;
unsigned int yyaccept;
goto yy29;
++YYCURSOR;
yy29:
if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if(yych <= '/'){
if(yych <= '"'){
if(yych <= '\n'){
if(yych <= '\b') goto yy53;
if(yych <= '\t') goto yy47;
goto yy49;
} else {
if(yych == ' ') goto yy47;
if(yych <= '!') goto yy53;
goto yy37;
}
} else {
if(yych <= '*'){
if(yych <= '&') goto yy53;
if(yych <= '\'') goto yy39;
if(yych <= ')') goto yy43;
goto yy35;
} else {
if(yych <= '+') goto yy44;
if(yych <= '-') goto yy53;
if(yych <= '.') goto yy51;
goto yy33;
}
}
} else {
if(yych <= '@'){
if(yych <= '<'){
if(yych == ';') goto yy43;
goto yy53;
} else {
if(yych <= '=') goto yy43;
if(yych == '?') goto yy44;
goto yy53;
}
} else {
if(yych <= '`'){
if(yych <= 'Z') goto yy45;
if(yych <= '[') goto yy41;
if(yych <= '\\') goto yy43;
goto yy53;
} else {
if(yych <= 'z') goto yy45;
if(yych <= '{') goto yy31;
if(yych <= '|') goto yy43;
goto yy53;
}
}
}
yy31: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
if(yych <= '/') goto yy32;
if(yych <= '9') goto yy84;
goto yy32;
yy32:
#line 133 "scanner.re"
{ depth = 1;
goto code;
}
#line 291 "scanner.c"
yy33: yych = *++YYCURSOR;
if(yych == '*') goto yy82;
goto yy34;
yy34:
#line 163 "scanner.re"
{ RETURN(*s->tok); }
#line 298 "scanner.c"
yy35: yych = *++YYCURSOR;
if(yych == '/') goto yy80;
goto yy36;
yy36:
#line 165 "scanner.re"
{ yylval.op = *s->tok;
RETURN(CLOSE); }
#line 306 "scanner.c"
yy37: yyaccept = 1;
yych = *(YYMARKER = ++YYCURSOR);
if(yych != '\n') goto yy76;
goto yy38;
yy38:
#line 150 "scanner.re"
{ Scanner_fatal(s, "unterminated string constant (missing \")"); }
#line 314 "scanner.c"
yy39: yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if(yych != '\n') goto yy71;
goto yy40;
yy40:
#line 151 "scanner.re"
{ Scanner_fatal(s, "unterminated string constant (missing ')"); }
#line 322 "scanner.c"
yy41: yyaccept = 3;
yych = *(YYMARKER = ++YYCURSOR);
if(yych == '\n') goto yy42;
if(yych == '^') goto yy62;
goto yy60;
yy42:
#line 161 "scanner.re"
{ Scanner_fatal(s, "unterminated range (missing ])"); }
#line 331 "scanner.c"
yy43: yych = *++YYCURSOR;
goto yy34;
yy44: yych = *++YYCURSOR;
goto yy36;
yy45: yych = *++YYCURSOR;
goto yy58;
yy46:
#line 180 "scanner.re"
{ SubStr substr;
s->cur = cursor;
substr = Scanner_token(s);
yylval.symbol = Symbol_find(&substr);
return ID; }
#line 345 "scanner.c"
yy47: yych = *++YYCURSOR;
goto yy56;
yy48:
#line 186 "scanner.re"
{ goto scan; }
#line 351 "scanner.c"
yy49: yych = *++YYCURSOR;
goto yy50;
yy50:
#line 188 "scanner.re"
{ if(cursor == s->eof) RETURN(0);
s->pos = cursor; s->cline++;
goto scan;
}
#line 360 "scanner.c"
yy51: yych = *++YYCURSOR;
goto yy52;
yy52:
#line 193 "scanner.re"
{ s->cur = cursor;
yylval.regexp = mkDot();
return RANGE;
}
#line 369 "scanner.c"
yy53: yych = *++YYCURSOR;
goto yy54;
yy54:
#line 198 "scanner.re"
{ fprintf(stderr, "unexpected character: '%c'\n", *s->tok);
goto scan;
}
#line 377 "scanner.c"
yy55: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
goto yy56;
yy56: if(yych == '\t') goto yy55;
if(yych == ' ') goto yy55;
goto yy48;
yy57: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
goto yy58;
yy58: if(yych <= '@'){
if(yych <= '/') goto yy46;
if(yych <= '9') goto yy57;
goto yy46;
} else {
if(yych <= 'Z') goto yy57;
if(yych <= '`') goto yy46;
if(yych <= 'z') goto yy57;
goto yy46;
}
yy59: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
goto yy60;
yy60: if(yych <= '['){
if(yych != '\n') goto yy59;
goto yy61;
} else {
if(yych <= '\\') goto yy64;
if(yych <= ']') goto yy65;
goto yy59;
}
yy61: YYCURSOR = YYMARKER;
switch(yyaccept){
case 0: goto yy32;
case 1: goto yy38;
case 2: goto yy40;
case 3: goto yy42;
}
yy62: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
goto yy63;
yy63: if(yych <= '['){
if(yych == '\n') goto yy61;
goto yy62;
} else {
if(yych <= '\\') goto yy67;
if(yych <= ']') goto yy68;
goto yy62;
}
yy64: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if(yych == '\n') goto yy61;
goto yy59;
yy65: yych = *++YYCURSOR;
goto yy66;
yy66:
#line 157 "scanner.re"
{ s->cur = cursor;
yylval.regexp = ranToRE(Scanner_token(s));
return RANGE; }
#line 442 "scanner.c"
yy67: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if(yych == '\n') goto yy61;
goto yy62;
yy68: yych = *++YYCURSOR;
goto yy69;
yy69:
#line 153 "scanner.re"
{ s->cur = cursor;
yylval.regexp = invToRE(Scanner_token(s));
return RANGE; }
#line 455 "scanner.c"
yy70: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
goto yy71;
yy71: if(yych <= '&'){
if(yych == '\n') goto yy61;
goto yy70;
} else {
if(yych <= '\'') goto yy73;
if(yych != '\\') goto yy70;
goto yy72;
}
yy72: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if(yych == '\n') goto yy61;
goto yy70;
yy73: yych = *++YYCURSOR;
goto yy74;
yy74:
#line 146 "scanner.re"
{ s->cur = cursor;
yylval.regexp = strToCaseInsensitiveRE(Scanner_token(s));
return STRING; }
#line 480 "scanner.c"
yy75: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
goto yy76;
yy76: if(yych <= '!'){
if(yych == '\n') goto yy61;
goto yy75;
} else {
if(yych <= '"') goto yy78;
if(yych != '\\') goto yy75;
goto yy77;
}
yy77: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if(yych == '\n') goto yy61;
goto yy75;
yy78: yych = *++YYCURSOR;
goto yy79;
yy79:
#line 142 "scanner.re"
{ s->cur = cursor;
yylval.regexp = strToRE(Scanner_token(s));
return STRING; }
#line 505 "scanner.c"
yy80: yych = *++YYCURSOR;
goto yy81;
yy81:
#line 139 "scanner.re"
{ s->tok = cursor;
RETURN(0); }
#line 512 "scanner.c"
yy82: yych = *++YYCURSOR;
goto yy83;
yy83:
#line 136 "scanner.re"
{ depth = 1;
goto comment; }
#line 519 "scanner.c"
yy84: ++YYCURSOR;
if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
goto yy85;
yy85: if(yych <= '/'){
if(yych == ',') goto yy88;
goto yy61;
} else {
if(yych <= '9') goto yy84;
if(yych != '}') goto yy61;
goto yy86;
}
yy86: yych = *++YYCURSOR;
goto yy87;
yy87:
#line 168 "scanner.re"
{ yylval.extop.minsize = atoi((char *)s->tok+1);
yylval.extop.maxsize = atoi((char *)s->tok+1);
RETURN(CLOSESIZE); }
#line 539 "scanner.c"
yy88: yych = *++YYCURSOR;
if(yych != '}') goto yy92;
goto yy89;
yy89: yych = *++YYCURSOR;
goto yy90;
yy90:
#line 176 "scanner.re"
{ yylval.extop.minsize = atoi((char *)s->tok+1);
yylval.extop.maxsize = -1;
RETURN(CLOSESIZE); }
#line 550 "scanner.c"
yy91: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
goto yy92;
yy92: if(yych <= '/') goto yy61;
if(yych <= '9') goto yy91;
if(yych != '}') goto yy61;
goto yy93;
yy93: yych = *++YYCURSOR;
goto yy94;
yy94:
#line 172 "scanner.re"
{ yylval.extop.minsize = atoi((char *)s->tok+1);
yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)s->tok, ',')+1));
RETURN(CLOSESIZE); }
#line 566 "scanner.c"
}
#line 201 "scanner.re"
code:
#line 573 "scanner.c"
{
YYCTYPE yych;
unsigned int yyaccept;
goto yy95;
++YYCURSOR;
yy95:
if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if(yych <= '&'){
if(yych <= '\n'){
if(yych <= '\t') goto yy103;
goto yy101;
} else {
if(yych == '"') goto yy105;
goto yy103;
}
} else {
if(yych <= '{'){
if(yych <= '\'') goto yy106;
if(yych <= 'z') goto yy103;
goto yy99;
} else {
if(yych != '}') goto yy103;
goto yy97;
}
}
yy97: yych = *++YYCURSOR;
goto yy98;
yy98:
#line 205 "scanner.re"
{ if(--depth == 0){
s->cur = cursor;
yylval.token = Token_new(Scanner_token(s), s->tline);
return CODE;
}
goto code; }
#line 610 "scanner.c"
yy99: yych = *++YYCURSOR;
goto yy100;
yy100:
#line 211 "scanner.re"
{ ++depth;
goto code; }
#line 617 "scanner.c"
yy101: yych = *++YYCURSOR;
goto yy102;
yy102:
#line 213 "scanner.re"
{ if(cursor == s->eof) Scanner_fatal(s, "missing '}'");
s->pos = cursor; s->cline++;
goto code;
}
#line 626 "scanner.c"
yy103: yych = *++YYCURSOR;
goto yy104;
yy104:
#line 217 "scanner.re"
{ goto code; }
#line 632 "scanner.c"
yy105: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
if(yych == '\n') goto yy104;
goto yy112;
yy106: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
if(yych == '\n') goto yy104;
goto yy108;
yy107: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
goto yy108;
yy108: if(yych <= '&'){
if(yych != '\n') goto yy107;
goto yy109;
} else {
if(yych <= '\'') goto yy103;
if(yych == '\\') goto yy110;
goto yy107;
}
yy109: YYCURSOR = YYMARKER;
switch(yyaccept){
case 0: goto yy104;
}
yy110: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if(yych == '\n') goto yy109;
goto yy107;
yy111: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
goto yy112;
yy112: if(yych <= '!'){
if(yych == '\n') goto yy109;
goto yy111;
} else {
if(yych <= '"') goto yy103;
if(yych != '\\') goto yy111;
goto yy113;
}
yy113: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if(yych == '\n') goto yy109;
goto yy111;
}
#line 218 "scanner.re"
comment:
#line 685 "scanner.c"
{
YYCTYPE yych;
goto yy114;
++YYCURSOR;
yy114:
if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if(yych <= ')'){
if(yych == '\n') goto yy119;
goto yy121;
} else {
if(yych <= '*') goto yy116;
if(yych == '/') goto yy118;
goto yy121;
}
yy116: yych = *++YYCURSOR;
if(yych == '/') goto yy124;
goto yy117;
yy117:
#line 232 "scanner.re"
{ goto comment; }
#line 707 "scanner.c"
yy118: yych = *++YYCURSOR;
if(yych == '*') goto yy122;
goto yy117;
yy119: yych = *++YYCURSOR;
goto yy120;
yy120:
#line 228 "scanner.re"
{ if(cursor == s->eof) RETURN(0);
s->tok = s->pos = cursor; s->cline++;
goto comment;
}
#line 719 "scanner.c"
yy121: yych = *++YYCURSOR;
goto yy117;
yy122: yych = *++YYCURSOR;
goto yy123;
yy123:
#line 226 "scanner.re"
{ ++depth;
goto comment; }
#line 728 "scanner.c"
yy124: yych = *++YYCURSOR;
goto yy125;
yy125:
#line 222 "scanner.re"
{ if(--depth == 0)
goto scan;
else
goto comment; }
#line 737 "scanner.c"
}
#line 233 "scanner.re"
}
void
Scanner_fatal(Scanner *s, const char *msg)
{
fprintf(stderr, "line %d, column %d: %s\n", s->tline, s->tchar + 1, msg);
exit(1);
}