1/* Generated by re2c 0.9.1-C on Sun Oct 9 22:15:58 2005 2 */ 3#line 1 "scanner.re" 4#include <stdlib.h> 5#include <string.h> 6#include "tools/re2c/scanner.h" 7#include "tools/re2c/parse.h" 8#include "tools/re2c/globals.h" 9#include "re2c-parser.h" 10 11#ifndef MAX 12#define MAX(a,b) (((a)>(b))?(a):(b)) 13#endif 14 15#define BSIZE 8192 16 17#define YYCTYPE unsigned char 18#define YYCURSOR cursor 19#define YYLIMIT s->lim 20#define YYMARKER s->ptr 21#define YYFILL(n) {cursor = fill(s, cursor);} 22 23#define RETURN(i) {s->cur = cursor; return i;} 24 25static unsigned char *fill(Scanner*, unsigned char*); 26 27void 28Scanner_init(Scanner *s, FILE *i) 29{ 30 s->in = i; 31 s->bot = s->tok = s->ptr = s->cur = s->pos = s->lim = s->top = 32 s->eof = NULL; 33 s->tchar = s->tline = 0; 34 s->cline = 1; 35} 36 37static unsigned char * 38fill(Scanner *s, unsigned char *cursor) 39{ 40 if(!s->eof){ 41 unsigned int cnt = s->tok - s->bot; 42 if(cnt){ 43 memcpy(s->bot, s->tok, s->lim - s->tok); 44 s->tok = s->bot; 45 s->ptr -= cnt; 46 cursor -= cnt; 47 s->pos -= cnt; 48 s->lim -= cnt; 49 } 50 if((s->top - s->lim) < BSIZE){ 51 unsigned char *buf = malloc(((s->lim - s->bot) + BSIZE)); 52 memcpy(buf, s->tok, s->lim - s->tok); 53 s->tok = buf; 54 s->ptr = &buf[s->ptr - s->bot]; 55 cursor = &buf[cursor - s->bot]; 56 s->pos = &buf[s->pos - s->bot]; 57 s->lim = &buf[s->lim - s->bot]; 58 s->top = &s->lim[BSIZE]; 59 if (s->bot) 60 free(s->bot); 61 s->bot = buf; 62 } 63 if((cnt = fread(s->lim, 1, BSIZE, s->in)) != BSIZE){ 64 s->eof = &s->lim[cnt]; *s->eof++ = '\0'; 65 } 66 s->lim += cnt; 67 } 68 return cursor; 69} 70 71#line 79 "scanner.re" 72 73 74int 75Scanner_echo(Scanner *s, FILE *out) 76{ 77 unsigned char *cursor = s->cur; 78 int ignore_eoc = 0; 79 80 /* Catch EOF */ 81 if (s->eof && cursor == s->eof) 82 return 0; 83 84 s->tok = cursor; 85echo: 86 87#line 87 "scanner.c" 88{ 89 YYCTYPE yych; 90 unsigned int yyaccept; 91 goto yy0; 92 ++YYCURSOR; 93yy0: 94 if((YYLIMIT - YYCURSOR) < 11) YYFILL(11); 95 yych = *YYCURSOR; 96 if(yych <= ')'){ 97 if(yych <= '\000') goto yy7; 98 if(yych == '\n') goto yy5; 99 goto yy9; 100 } else { 101 if(yych <= '*') goto yy4; 102 if(yych != '/') goto yy9; 103 goto yy2; 104 } 105yy2: yyaccept = 0; 106 yych = *(YYMARKER = ++YYCURSOR); 107 if(yych == '*') goto yy12; 108 goto yy3; 109yy3: 110#line 117 "scanner.re" 111{ goto echo; } 112#line 112 "scanner.c" 113yy4: yych = *++YYCURSOR; 114 if(yych == '/') goto yy10; 115 goto yy3; 116yy5: yych = *++YYCURSOR; 117 goto yy6; 118yy6: 119#line 112 "scanner.re" 120{ fwrite(s->tok, 1, cursor - s->tok, out); 121 s->tok = s->pos = cursor; s->cline++; oline++; 122 goto echo; } 123#line 123 "scanner.c" 124yy7: yych = *++YYCURSOR; 125 goto yy8; 126yy8: 127#line 115 "scanner.re" 128{ fwrite(s->tok, 1, cursor - s->tok - 1, out); /* -1 so we don't write out the \0 */ 129 if(cursor == s->eof) { RETURN(0); } } 130#line 130 "scanner.c" 131yy9: yych = *++YYCURSOR; 132 goto yy3; 133yy10: yych = *++YYCURSOR; 134 goto yy11; 135yy11: 136#line 103 "scanner.re" 137{ 138 if (ignore_eoc) { 139 ignore_eoc = 0; 140 } else { 141 fwrite(s->tok, 1, cursor - s->tok, out); 142 } 143 s->tok = s->pos = cursor; 144 goto echo; 145 } 146#line 146 "scanner.c" 147yy12: yych = *++YYCURSOR; 148 if(yych == '!') goto yy14; 149 goto yy13; 150yy13: YYCURSOR = YYMARKER; 151 switch(yyaccept){ 152 case 0: goto yy3; 153 } 154yy14: yych = *++YYCURSOR; 155 if(yych == 'm') goto yy15; 156 if(yych == 'r') goto yy16; 157 goto yy13; 158yy15: yych = *++YYCURSOR; 159 if(yych == 'a') goto yy21; 160 goto yy13; 161yy16: yych = *++YYCURSOR; 162 if(yych != 'e') goto yy13; 163 goto yy17; 164yy17: yych = *++YYCURSOR; 165 if(yych != '2') goto yy13; 166 goto yy18; 167yy18: yych = *++YYCURSOR; 168 if(yych != 'c') goto yy13; 169 goto yy19; 170yy19: yych = *++YYCURSOR; 171 goto yy20; 172yy20: 173#line 94 "scanner.re" 174{ fwrite(s->tok, 1, &cursor[-7] - s->tok, out); 175 s->tok = cursor; 176 RETURN(1); } 177#line 177 "scanner.c" 178yy21: yych = *++YYCURSOR; 179 if(yych != 'x') goto yy13; 180 goto yy22; 181yy22: yych = *++YYCURSOR; 182 if(yych != ':') goto yy13; 183 goto yy23; 184yy23: yych = *++YYCURSOR; 185 if(yych != 'r') goto yy13; 186 goto yy24; 187yy24: yych = *++YYCURSOR; 188 if(yych != 'e') goto yy13; 189 goto yy25; 190yy25: yych = *++YYCURSOR; 191 if(yych != '2') goto yy13; 192 goto yy26; 193yy26: yych = *++YYCURSOR; 194 if(yych != 'c') goto yy13; 195 goto yy27; 196yy27: yych = *++YYCURSOR; 197 goto yy28; 198yy28: 199#line 97 "scanner.re" 200{ 201 fprintf(out, "#define YYMAXFILL %u\n", maxFill); 202 s->tok = s->pos = cursor; 203 ignore_eoc = 1; 204 goto echo; 205 } 206#line 206 "scanner.c" 207} 208#line 118 "scanner.re" 209 210} 211 212 213int 214Scanner_scan(Scanner *s) 215{ 216 unsigned char *cursor = s->cur; 217 unsigned int depth; 218 219scan: 220 s->tchar = cursor - s->pos; 221 s->tline = s->cline; 222 s->tok = cursor; 223 224#line 224 "scanner.c" 225{ 226 YYCTYPE yych; 227 unsigned int yyaccept; 228 goto yy29; 229 ++YYCURSOR; 230yy29: 231 if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); 232 yych = *YYCURSOR; 233 if(yych <= '/'){ 234 if(yych <= '"'){ 235 if(yych <= '\n'){ 236 if(yych <= '\b') goto yy53; 237 if(yych <= '\t') goto yy47; 238 goto yy49; 239 } else { 240 if(yych == ' ') goto yy47; 241 if(yych <= '!') goto yy53; 242 goto yy37; 243 } 244 } else { 245 if(yych <= '*'){ 246 if(yych <= '&') goto yy53; 247 if(yych <= '\'') goto yy39; 248 if(yych <= ')') goto yy43; 249 goto yy35; 250 } else { 251 if(yych <= '+') goto yy44; 252 if(yych <= '-') goto yy53; 253 if(yych <= '.') goto yy51; 254 goto yy33; 255 } 256 } 257 } else { 258 if(yych <= '@'){ 259 if(yych <= '<'){ 260 if(yych == ';') goto yy43; 261 goto yy53; 262 } else { 263 if(yych <= '=') goto yy43; 264 if(yych == '?') goto yy44; 265 goto yy53; 266 } 267 } else { 268 if(yych <= '`'){ 269 if(yych <= 'Z') goto yy45; 270 if(yych <= '[') goto yy41; 271 if(yych <= '\\') goto yy43; 272 goto yy53; 273 } else { 274 if(yych <= 'z') goto yy45; 275 if(yych <= '{') goto yy31; 276 if(yych <= '|') goto yy43; 277 goto yy53; 278 } 279 } 280 } 281yy31: yyaccept = 0; 282 yych = *(YYMARKER = ++YYCURSOR); 283 if(yych <= '/') goto yy32; 284 if(yych <= '9') goto yy84; 285 goto yy32; 286yy32: 287#line 133 "scanner.re" 288{ depth = 1; 289 goto code; 290 } 291#line 291 "scanner.c" 292yy33: yych = *++YYCURSOR; 293 if(yych == '*') goto yy82; 294 goto yy34; 295yy34: 296#line 163 "scanner.re" 297{ RETURN(*s->tok); } 298#line 298 "scanner.c" 299yy35: yych = *++YYCURSOR; 300 if(yych == '/') goto yy80; 301 goto yy36; 302yy36: 303#line 165 "scanner.re" 304{ yylval.op = *s->tok; 305 RETURN(CLOSE); } 306#line 306 "scanner.c" 307yy37: yyaccept = 1; 308 yych = *(YYMARKER = ++YYCURSOR); 309 if(yych != '\n') goto yy76; 310 goto yy38; 311yy38: 312#line 150 "scanner.re" 313{ Scanner_fatal(s, "unterminated string constant (missing \")"); } 314#line 314 "scanner.c" 315yy39: yyaccept = 2; 316 yych = *(YYMARKER = ++YYCURSOR); 317 if(yych != '\n') goto yy71; 318 goto yy40; 319yy40: 320#line 151 "scanner.re" 321{ Scanner_fatal(s, "unterminated string constant (missing ')"); } 322#line 322 "scanner.c" 323yy41: yyaccept = 3; 324 yych = *(YYMARKER = ++YYCURSOR); 325 if(yych == '\n') goto yy42; 326 if(yych == '^') goto yy62; 327 goto yy60; 328yy42: 329#line 161 "scanner.re" 330{ Scanner_fatal(s, "unterminated range (missing ])"); } 331#line 331 "scanner.c" 332yy43: yych = *++YYCURSOR; 333 goto yy34; 334yy44: yych = *++YYCURSOR; 335 goto yy36; 336yy45: yych = *++YYCURSOR; 337 goto yy58; 338yy46: 339#line 180 "scanner.re" 340{ SubStr substr; 341 s->cur = cursor; 342 substr = Scanner_token(s); 343 yylval.symbol = Symbol_find(&substr); 344 return ID; } 345#line 345 "scanner.c" 346yy47: yych = *++YYCURSOR; 347 goto yy56; 348yy48: 349#line 186 "scanner.re" 350{ goto scan; } 351#line 351 "scanner.c" 352yy49: yych = *++YYCURSOR; 353 goto yy50; 354yy50: 355#line 188 "scanner.re" 356{ if(cursor == s->eof) RETURN(0); 357 s->pos = cursor; s->cline++; 358 goto scan; 359 } 360#line 360 "scanner.c" 361yy51: yych = *++YYCURSOR; 362 goto yy52; 363yy52: 364#line 193 "scanner.re" 365{ s->cur = cursor; 366 yylval.regexp = mkDot(); 367 return RANGE; 368 } 369#line 369 "scanner.c" 370yy53: yych = *++YYCURSOR; 371 goto yy54; 372yy54: 373#line 198 "scanner.re" 374{ fprintf(stderr, "unexpected character: '%c'\n", *s->tok); 375 goto scan; 376 } 377#line 377 "scanner.c" 378yy55: ++YYCURSOR; 379 if(YYLIMIT == YYCURSOR) YYFILL(1); 380 yych = *YYCURSOR; 381 goto yy56; 382yy56: if(yych == '\t') goto yy55; 383 if(yych == ' ') goto yy55; 384 goto yy48; 385yy57: ++YYCURSOR; 386 if(YYLIMIT == YYCURSOR) YYFILL(1); 387 yych = *YYCURSOR; 388 goto yy58; 389yy58: if(yych <= '@'){ 390 if(yych <= '/') goto yy46; 391 if(yych <= '9') goto yy57; 392 goto yy46; 393 } else { 394 if(yych <= 'Z') goto yy57; 395 if(yych <= '`') goto yy46; 396 if(yych <= 'z') goto yy57; 397 goto yy46; 398 } 399yy59: ++YYCURSOR; 400 if(YYLIMIT == YYCURSOR) YYFILL(1); 401 yych = *YYCURSOR; 402 goto yy60; 403yy60: if(yych <= '['){ 404 if(yych != '\n') goto yy59; 405 goto yy61; 406 } else { 407 if(yych <= '\\') goto yy64; 408 if(yych <= ']') goto yy65; 409 goto yy59; 410 } 411yy61: YYCURSOR = YYMARKER; 412 switch(yyaccept){ 413 case 0: goto yy32; 414 case 1: goto yy38; 415 case 2: goto yy40; 416 case 3: goto yy42; 417 } 418yy62: ++YYCURSOR; 419 if(YYLIMIT == YYCURSOR) YYFILL(1); 420 yych = *YYCURSOR; 421 goto yy63; 422yy63: if(yych <= '['){ 423 if(yych == '\n') goto yy61; 424 goto yy62; 425 } else { 426 if(yych <= '\\') goto yy67; 427 if(yych <= ']') goto yy68; 428 goto yy62; 429 } 430yy64: ++YYCURSOR; 431 if(YYLIMIT == YYCURSOR) YYFILL(1); 432 yych = *YYCURSOR; 433 if(yych == '\n') goto yy61; 434 goto yy59; 435yy65: yych = *++YYCURSOR; 436 goto yy66; 437yy66: 438#line 157 "scanner.re" 439{ s->cur = cursor; 440 yylval.regexp = ranToRE(Scanner_token(s)); 441 return RANGE; } 442#line 442 "scanner.c" 443yy67: ++YYCURSOR; 444 if(YYLIMIT == YYCURSOR) YYFILL(1); 445 yych = *YYCURSOR; 446 if(yych == '\n') goto yy61; 447 goto yy62; 448yy68: yych = *++YYCURSOR; 449 goto yy69; 450yy69: 451#line 153 "scanner.re" 452{ s->cur = cursor; 453 yylval.regexp = invToRE(Scanner_token(s)); 454 return RANGE; } 455#line 455 "scanner.c" 456yy70: ++YYCURSOR; 457 if(YYLIMIT == YYCURSOR) YYFILL(1); 458 yych = *YYCURSOR; 459 goto yy71; 460yy71: if(yych <= '&'){ 461 if(yych == '\n') goto yy61; 462 goto yy70; 463 } else { 464 if(yych <= '\'') goto yy73; 465 if(yych != '\\') goto yy70; 466 goto yy72; 467 } 468yy72: ++YYCURSOR; 469 if(YYLIMIT == YYCURSOR) YYFILL(1); 470 yych = *YYCURSOR; 471 if(yych == '\n') goto yy61; 472 goto yy70; 473yy73: yych = *++YYCURSOR; 474 goto yy74; 475yy74: 476#line 146 "scanner.re" 477{ s->cur = cursor; 478 yylval.regexp = strToCaseInsensitiveRE(Scanner_token(s)); 479 return STRING; } 480#line 480 "scanner.c" 481yy75: ++YYCURSOR; 482 if(YYLIMIT == YYCURSOR) YYFILL(1); 483 yych = *YYCURSOR; 484 goto yy76; 485yy76: if(yych <= '!'){ 486 if(yych == '\n') goto yy61; 487 goto yy75; 488 } else { 489 if(yych <= '"') goto yy78; 490 if(yych != '\\') goto yy75; 491 goto yy77; 492 } 493yy77: ++YYCURSOR; 494 if(YYLIMIT == YYCURSOR) YYFILL(1); 495 yych = *YYCURSOR; 496 if(yych == '\n') goto yy61; 497 goto yy75; 498yy78: yych = *++YYCURSOR; 499 goto yy79; 500yy79: 501#line 142 "scanner.re" 502{ s->cur = cursor; 503 yylval.regexp = strToRE(Scanner_token(s)); 504 return STRING; } 505#line 505 "scanner.c" 506yy80: yych = *++YYCURSOR; 507 goto yy81; 508yy81: 509#line 139 "scanner.re" 510{ s->tok = cursor; 511 RETURN(0); } 512#line 512 "scanner.c" 513yy82: yych = *++YYCURSOR; 514 goto yy83; 515yy83: 516#line 136 "scanner.re" 517{ depth = 1; 518 goto comment; } 519#line 519 "scanner.c" 520yy84: ++YYCURSOR; 521 if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); 522 yych = *YYCURSOR; 523 goto yy85; 524yy85: if(yych <= '/'){ 525 if(yych == ',') goto yy88; 526 goto yy61; 527 } else { 528 if(yych <= '9') goto yy84; 529 if(yych != '}') goto yy61; 530 goto yy86; 531 } 532yy86: yych = *++YYCURSOR; 533 goto yy87; 534yy87: 535#line 168 "scanner.re" 536{ yylval.extop.minsize = atoi((char *)s->tok+1); 537 yylval.extop.maxsize = atoi((char *)s->tok+1); 538 RETURN(CLOSESIZE); } 539#line 539 "scanner.c" 540yy88: yych = *++YYCURSOR; 541 if(yych != '}') goto yy92; 542 goto yy89; 543yy89: yych = *++YYCURSOR; 544 goto yy90; 545yy90: 546#line 176 "scanner.re" 547{ yylval.extop.minsize = atoi((char *)s->tok+1); 548 yylval.extop.maxsize = -1; 549 RETURN(CLOSESIZE); } 550#line 550 "scanner.c" 551yy91: ++YYCURSOR; 552 if(YYLIMIT == YYCURSOR) YYFILL(1); 553 yych = *YYCURSOR; 554 goto yy92; 555yy92: if(yych <= '/') goto yy61; 556 if(yych <= '9') goto yy91; 557 if(yych != '}') goto yy61; 558 goto yy93; 559yy93: yych = *++YYCURSOR; 560 goto yy94; 561yy94: 562#line 172 "scanner.re" 563{ yylval.extop.minsize = atoi((char *)s->tok+1); 564 yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)s->tok, ',')+1)); 565 RETURN(CLOSESIZE); } 566#line 566 "scanner.c" 567} 568#line 201 "scanner.re" 569 570 571code: 572 573#line 573 "scanner.c" 574{ 575 YYCTYPE yych; 576 unsigned int yyaccept; 577 goto yy95; 578 ++YYCURSOR; 579yy95: 580 if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); 581 yych = *YYCURSOR; 582 if(yych <= '&'){ 583 if(yych <= '\n'){ 584 if(yych <= '\t') goto yy103; 585 goto yy101; 586 } else { 587 if(yych == '"') goto yy105; 588 goto yy103; 589 } 590 } else { 591 if(yych <= '{'){ 592 if(yych <= '\'') goto yy106; 593 if(yych <= 'z') goto yy103; 594 goto yy99; 595 } else { 596 if(yych != '}') goto yy103; 597 goto yy97; 598 } 599 } 600yy97: yych = *++YYCURSOR; 601 goto yy98; 602yy98: 603#line 205 "scanner.re" 604{ if(--depth == 0){ 605 s->cur = cursor; 606 yylval.token = Token_new(Scanner_token(s), s->tline); 607 return CODE; 608 } 609 goto code; } 610#line 610 "scanner.c" 611yy99: yych = *++YYCURSOR; 612 goto yy100; 613yy100: 614#line 211 "scanner.re" 615{ ++depth; 616 goto code; } 617#line 617 "scanner.c" 618yy101: yych = *++YYCURSOR; 619 goto yy102; 620yy102: 621#line 213 "scanner.re" 622{ if(cursor == s->eof) Scanner_fatal(s, "missing '}'"); 623 s->pos = cursor; s->cline++; 624 goto code; 625 } 626#line 626 "scanner.c" 627yy103: yych = *++YYCURSOR; 628 goto yy104; 629yy104: 630#line 217 "scanner.re" 631{ goto code; } 632#line 632 "scanner.c" 633yy105: yyaccept = 0; 634 yych = *(YYMARKER = ++YYCURSOR); 635 if(yych == '\n') goto yy104; 636 goto yy112; 637yy106: yyaccept = 0; 638 yych = *(YYMARKER = ++YYCURSOR); 639 if(yych == '\n') goto yy104; 640 goto yy108; 641yy107: ++YYCURSOR; 642 if(YYLIMIT == YYCURSOR) YYFILL(1); 643 yych = *YYCURSOR; 644 goto yy108; 645yy108: if(yych <= '&'){ 646 if(yych != '\n') goto yy107; 647 goto yy109; 648 } else { 649 if(yych <= '\'') goto yy103; 650 if(yych == '\\') goto yy110; 651 goto yy107; 652 } 653yy109: YYCURSOR = YYMARKER; 654 switch(yyaccept){ 655 case 0: goto yy104; 656 } 657yy110: ++YYCURSOR; 658 if(YYLIMIT == YYCURSOR) YYFILL(1); 659 yych = *YYCURSOR; 660 if(yych == '\n') goto yy109; 661 goto yy107; 662yy111: ++YYCURSOR; 663 if(YYLIMIT == YYCURSOR) YYFILL(1); 664 yych = *YYCURSOR; 665 goto yy112; 666yy112: if(yych <= '!'){ 667 if(yych == '\n') goto yy109; 668 goto yy111; 669 } else { 670 if(yych <= '"') goto yy103; 671 if(yych != '\\') goto yy111; 672 goto yy113; 673 } 674yy113: ++YYCURSOR; 675 if(YYLIMIT == YYCURSOR) YYFILL(1); 676 yych = *YYCURSOR; 677 if(yych == '\n') goto yy109; 678 goto yy111; 679} 680#line 218 "scanner.re" 681 682 683comment: 684 685#line 685 "scanner.c" 686{ 687 YYCTYPE yych; 688 goto yy114; 689 ++YYCURSOR; 690yy114: 691 if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); 692 yych = *YYCURSOR; 693 if(yych <= ')'){ 694 if(yych == '\n') goto yy119; 695 goto yy121; 696 } else { 697 if(yych <= '*') goto yy116; 698 if(yych == '/') goto yy118; 699 goto yy121; 700 } 701yy116: yych = *++YYCURSOR; 702 if(yych == '/') goto yy124; 703 goto yy117; 704yy117: 705#line 232 "scanner.re" 706{ goto comment; } 707#line 707 "scanner.c" 708yy118: yych = *++YYCURSOR; 709 if(yych == '*') goto yy122; 710 goto yy117; 711yy119: yych = *++YYCURSOR; 712 goto yy120; 713yy120: 714#line 228 "scanner.re" 715{ if(cursor == s->eof) RETURN(0); 716 s->tok = s->pos = cursor; s->cline++; 717 goto comment; 718 } 719#line 719 "scanner.c" 720yy121: yych = *++YYCURSOR; 721 goto yy117; 722yy122: yych = *++YYCURSOR; 723 goto yy123; 724yy123: 725#line 226 "scanner.re" 726{ ++depth; 727 goto comment; } 728#line 728 "scanner.c" 729yy124: yych = *++YYCURSOR; 730 goto yy125; 731yy125: 732#line 222 "scanner.re" 733{ if(--depth == 0) 734 goto scan; 735 else 736 goto comment; } 737#line 737 "scanner.c" 738} 739#line 233 "scanner.re" 740 741} 742 743void 744Scanner_fatal(Scanner *s, const char *msg) 745{ 746 fprintf(stderr, "line %d, column %d: %s\n", s->tline, s->tchar + 1, msg); 747 exit(1); 748} 749