From be9dba39c47aeb9ea26be4bcef07e7757bde69a9 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Fri, 15 Aug 2003 03:35:17 +0000 Subject: [PATCH] Scanner internal to re2c was not catching EOF's properly. svn path=/trunk/yasm/; revision=1035 --- tools/re2c/bootstrap/scanner.c | 234 +++++++++++++++++++-------------- tools/re2c/scanner.c | 121 +++++++++-------- tools/re2c/scanner.re | 5 + 3 files changed, 203 insertions(+), 157 deletions(-) diff --git a/tools/re2c/bootstrap/scanner.c b/tools/re2c/bootstrap/scanner.c index 1ce43d8d..5c9413d1 100644 --- a/tools/re2c/bootstrap/scanner.c +++ b/tools/re2c/bootstrap/scanner.c @@ -1,19 +1,18 @@ -/* Generated by re2c 0.9.1-C on Tue Aug 6 18:54:36 2002 +/* Generated by re2c 0.9.1-C on Thu Aug 14 20:33:10 2003 */ #line 1 "scanner.re" #include #include #include -#include "scanner.h" -#include "parse.h" -#include "parser.h" - -extern YYSTYPE yylval; +#include "tools/re2c/scanner.h" +#include "tools/re2c/parse.h" +#include "tools/re2c/globals.h" +#include "re2c-parser.h" #define BSIZE 8192 -#define YYCTYPE uchar +#define YYCTYPE unsigned char #define YYCURSOR cursor #define YYLIMIT s->lim #define YYMARKER s->ptr @@ -21,7 +20,7 @@ extern YYSTYPE yylval; #define RETURN(i) {s->cur = cursor; return i;} -static uchar *fill(Scanner*, uchar*); +static unsigned char *fill(Scanner*, unsigned char*); void Scanner_init(Scanner *s, FILE *i) @@ -33,11 +32,11 @@ Scanner_init(Scanner *s, FILE *i) s->cline = 1; } -static uchar * -fill(Scanner *s, uchar *cursor) +static unsigned char * +fill(Scanner *s, unsigned char *cursor) { if(!s->eof){ - uint cnt = s->tok - s->bot; + unsigned int cnt = s->tok - s->bot; if(cnt){ memcpy(s->bot, s->tok, s->lim - s->tok); s->tok = s->bot; @@ -47,7 +46,7 @@ fill(Scanner *s, uchar *cursor) s->lim -= cnt; } if((s->top - s->lim) < BSIZE){ - uchar *buf = malloc(sizeof(uchar)*((s->lim - s->bot) + BSIZE)); + unsigned char *buf = malloc(((s->lim - s->bot) + BSIZE)); memcpy(buf, s->tok, s->lim - s->tok); s->tok = buf; s->ptr = &buf[s->ptr - s->bot]; @@ -59,7 +58,7 @@ fill(Scanner *s, uchar *cursor) free(s->bot); s->bot = buf; } - if((cnt = fread(s->lim, sizeof(uchar), BSIZE, s->in)) != BSIZE){ + if((cnt = fread(s->lim, 1, BSIZE, s->in)) != BSIZE){ s->eof = &s->lim[cnt]; *s->eof++ = '\n'; } s->lim += cnt; @@ -67,38 +66,47 @@ fill(Scanner *s, uchar *cursor) return cursor; } -#line 76 +#line 75 "scanner.re" int Scanner_echo(Scanner *s, FILE *out) { - uchar *cursor = s->cur; + unsigned char *cursor = s->cur; + + /* Catch EOF */ + if (s->eof && cursor == s->eof) + return 0; + s->tok = cursor; echo: + +#line 85 "re2c-out.c" { YYCTYPE yych; unsigned int yyaccept; goto yy0; -yy1: ++YYCURSOR; + ++YYCURSOR; yy0: if((YYLIMIT - YYCURSOR) < 7) YYFILL(7); yych = *YYCURSOR; if(yych == '\n') goto yy4; if(yych != '/') goto yy6; -yy2: yyaccept = 0; + yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych == '*') goto yy7; yy3: -#line 92 - { goto echo; } +#line 96 "scanner.re" +{ goto echo; } +#line 102 "re2c-out.c" yy4: yych = *++YYCURSOR; -yy5: -#line 88 - { if(cursor == s->eof) RETURN(0); + +#line 92 "scanner.re" +{ if(cursor == s->eof) RETURN(0); fwrite(s->tok, 1, cursor - s->tok, out); - s->tok = s->pos = cursor; s->cline++; + s->tok = s->pos = cursor; s->cline++; oline++; goto echo; } +#line 110 "re2c-out.c" yy6: yych = *++YYCURSOR; goto yy3; yy7: yych = *++YYCURSOR; @@ -109,20 +117,21 @@ yy8: YYCURSOR = YYMARKER; } yy9: yych = *++YYCURSOR; if(yych != 'r') goto yy8; -yy10: yych = *++YYCURSOR; + yych = *++YYCURSOR; if(yych != 'e') goto yy8; -yy11: yych = *++YYCURSOR; + yych = *++YYCURSOR; if(yych != '2') goto yy8; -yy12: yych = *++YYCURSOR; + yych = *++YYCURSOR; if(yych != 'c') goto yy8; -yy13: yych = *++YYCURSOR; -yy14: -#line 85 - { fwrite(s->tok, 1, &cursor[-7] - s->tok, out); + yych = *++YYCURSOR; + +#line 89 "scanner.re" +{ fwrite(s->tok, 1, &cursor[-7] - s->tok, out); s->tok = cursor; RETURN(1); } +#line 133 "re2c-out.c" } -#line 93 +#line 97 "scanner.re" } @@ -130,18 +139,20 @@ yy14: int Scanner_scan(Scanner *s) { - uchar *cursor = s->cur; - uint depth; + unsigned char *cursor = s->cur; + unsigned int depth; scan: s->tchar = cursor - s->pos; s->tline = s->cline; s->tok = cursor; + +#line 151 "re2c-out.c" { YYCTYPE yych; unsigned int yyaccept; goto yy15; -yy16: ++YYCURSOR; + ++YYCURSOR; yy15: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; @@ -191,34 +202,39 @@ yy15: } } yy17: yych = *++YYCURSOR; -yy18: -#line 108 - { depth = 1; + +#line 112 "scanner.re" +{ depth = 1; goto code; } +#line 211 "re2c-out.c" yy19: yych = *++YYCURSOR; if(yych == '*') goto yy54; yy20: -#line 127 - { RETURN(*s->tok); } +#line 131 "scanner.re" +{ RETURN(*s->tok); } +#line 217 "re2c-out.c" yy21: yych = *++YYCURSOR; if(yych == '/') goto yy52; yy22: -#line 129 - { yylval.op = *s->tok; +#line 133 "scanner.re" +{ yylval.op = *s->tok; RETURN(CLOSE); } +#line 224 "re2c-out.c" yy23: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych != '\n') goto yy48; yy24: -#line 120 - { Scanner_fatal(s, "bad string"); } +#line 124 "scanner.re" +{ Scanner_fatal(s, "bad string"); } +#line 231 "re2c-out.c" yy25: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if(yych != '\n') goto yy42; yy26: -#line 125 - { Scanner_fatal(s, "bad character constant"); } +#line 129 "scanner.re" +{ Scanner_fatal(s, "bad character constant"); } +#line 238 "re2c-out.c" yy27: yych = *++YYCURSOR; goto yy20; yy28: yych = *++YYCURSOR; @@ -226,30 +242,34 @@ yy28: yych = *++YYCURSOR; yy29: yych = *++YYCURSOR; goto yy40; yy30: -#line 132 - { SubStr substr; +#line 136 "scanner.re" +{ SubStr substr; s->cur = cursor; substr = Scanner_token(s); yylval.symbol = Symbol_find(&substr); return ID; } +#line 252 "re2c-out.c" yy31: yych = *++YYCURSOR; goto yy38; yy32: -#line 138 - { goto scan; } +#line 142 "scanner.re" +{ goto scan; } +#line 258 "re2c-out.c" yy33: yych = *++YYCURSOR; -yy34: -#line 140 - { if(cursor == s->eof) RETURN(0); + +#line 144 "scanner.re" +{ if(cursor == s->eof) RETURN(0); s->pos = cursor; s->cline++; goto scan; } +#line 266 "re2c-out.c" yy35: yych = *++YYCURSOR; -yy36: -#line 145 - { fprintf(stderr, "unexpected character: '%c'\n", *s->tok); + +#line 149 "scanner.re" +{ fprintf(stderr, "unexpected character: '%c'\n", *s->tok); goto scan; } +#line 273 "re2c-out.c" yy37: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; @@ -290,11 +310,12 @@ yy44: ++YYCURSOR; if(yych == '\n') goto yy43; goto yy41; yy45: yych = *++YYCURSOR; -yy46: -#line 122 - { s->cur = cursor; + +#line 126 "scanner.re" +{ s->cur = cursor; yylval.regexp = ranToRE(Scanner_token(s)); return RANGE; } +#line 319 "re2c-out.c" yy47: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; @@ -305,37 +326,42 @@ yy48: if(yych <= '!'){ if(yych <= '"') goto yy50; if(yych != '\\') goto yy47; } -yy49: ++YYCURSOR; + ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych == '\n') goto yy43; goto yy47; yy50: yych = *++YYCURSOR; -yy51: -#line 117 - { s->cur = cursor; + +#line 121 "scanner.re" +{ s->cur = cursor; yylval.regexp = strToRE(Scanner_token(s)); return STRING; } +#line 341 "re2c-out.c" yy52: yych = *++YYCURSOR; -yy53: -#line 114 - { s->tok = cursor; + +#line 118 "scanner.re" +{ s->tok = cursor; RETURN(0); } +#line 347 "re2c-out.c" yy54: yych = *++YYCURSOR; -yy55: -#line 111 - { depth = 1; + +#line 115 "scanner.re" +{ depth = 1; goto comment; } +#line 353 "re2c-out.c" } -#line 148 +#line 152 "scanner.re" code: + +#line 360 "re2c-out.c" { YYCTYPE yych; - unsigned int yyaccept; + goto yy56; -yy57: ++YYCURSOR; + ++YYCURSOR; yy56: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; @@ -356,31 +382,35 @@ yy56: if(yych != '}') goto yy64; } } -yy58: yych = *++YYCURSOR; -yy59: -#line 152 - { if(--depth == 0){ + yych = *++YYCURSOR; + +#line 156 "scanner.re" +{ if(--depth == 0){ s->cur = cursor; yylval.token = Token_new(Scanner_token(s), s->tline); return CODE; } goto code; } +#line 395 "re2c-out.c" yy60: yych = *++YYCURSOR; -yy61: -#line 158 - { ++depth; + +#line 162 "scanner.re" +{ ++depth; goto code; } +#line 401 "re2c-out.c" yy62: yych = *++YYCURSOR; -yy63: -#line 160 - { if(cursor == s->eof) Scanner_fatal(s, "missing '}'"); + +#line 164 "scanner.re" +{ if(cursor == s->eof) Scanner_fatal(s, "missing '}'"); s->pos = cursor; s->cline++; goto code; } +#line 409 "re2c-out.c" yy64: yych = *++YYCURSOR; yy65: -#line 164 - { goto code; } +#line 168 "scanner.re" +{ goto code; } +#line 414 "re2c-out.c" yy66: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych == '\n') goto yy65; @@ -418,21 +448,23 @@ yy73: if(yych <= '!'){ if(yych <= '"') goto yy64; if(yych != '\\') goto yy72; } -yy74: ++YYCURSOR; + ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych == '\n') goto yy70; goto yy72; } -#line 165 +#line 169 "scanner.re" comment: + +#line 463 "re2c-out.c" { YYCTYPE yych; unsigned int yyaccept; goto yy75; -yy76: ++YYCURSOR; + ++YYCURSOR; yy75: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; @@ -447,39 +479,43 @@ yy75: yy77: yych = *++YYCURSOR; if(yych == '/') goto yy85; yy78: -#line 179 - { goto comment; } +#line 183 "scanner.re" +{ goto comment; } +#line 485 "re2c-out.c" yy79: yych = *++YYCURSOR; if(yych == '*') goto yy83; goto yy78; yy80: yych = *++YYCURSOR; -yy81: -#line 175 - { if(cursor == s->eof) RETURN(0); + +#line 179 "scanner.re" +{ if(cursor == s->eof) RETURN(0); s->tok = s->pos = cursor; s->cline++; goto comment; } +#line 496 "re2c-out.c" yy82: yych = *++YYCURSOR; goto yy78; yy83: yych = *++YYCURSOR; -yy84: -#line 173 - { ++depth; + +#line 177 "scanner.re" +{ ++depth; goto comment; } +#line 504 "re2c-out.c" yy85: yych = *++YYCURSOR; -yy86: -#line 169 - { if(--depth == 0) + +#line 173 "scanner.re" +{ if(--depth == 0) goto scan; else goto comment; } +#line 512 "re2c-out.c" } -#line 180 +#line 184 "scanner.re" } void -Scanner_fatal(Scanner *s, char *msg) +Scanner_fatal(Scanner *s, const char *msg) { fprintf(stderr, "line %d, column %d: %s\n", s->tline, s->tchar + 1, msg); exit(1); diff --git a/tools/re2c/scanner.c b/tools/re2c/scanner.c index 436a5a4e..5c9413d1 100644 --- a/tools/re2c/scanner.c +++ b/tools/re2c/scanner.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.9.1-C on Sat Oct 5 02:09:57 2002 +/* Generated by re2c 0.9.1-C on Thu Aug 14 20:33:10 2003 */ #line 1 "scanner.re" #include @@ -73,10 +73,15 @@ int Scanner_echo(Scanner *s, FILE *out) { unsigned char *cursor = s->cur; + + /* Catch EOF */ + if (s->eof && cursor == s->eof) + return 0; + s->tok = cursor; echo: -#line 80 "scanner.c" +#line 85 "re2c-out.c" { YYCTYPE yych; unsigned int yyaccept; @@ -91,17 +96,17 @@ yy0: yych = *(YYMARKER = ++YYCURSOR); if(yych == '*') goto yy7; yy3: -#line 91 "scanner.re" +#line 96 "scanner.re" { goto echo; } -#line 97 "scanner.c" +#line 102 "re2c-out.c" yy4: yych = *++YYCURSOR; -#line 87 "scanner.re" +#line 92 "scanner.re" { if(cursor == s->eof) RETURN(0); fwrite(s->tok, 1, cursor - s->tok, out); s->tok = s->pos = cursor; s->cline++; oline++; goto echo; } -#line 105 "scanner.c" +#line 110 "re2c-out.c" yy6: yych = *++YYCURSOR; goto yy3; yy7: yych = *++YYCURSOR; @@ -120,13 +125,13 @@ yy9: yych = *++YYCURSOR; if(yych != 'c') goto yy8; yych = *++YYCURSOR; -#line 84 "scanner.re" +#line 89 "scanner.re" { fwrite(s->tok, 1, &cursor[-7] - s->tok, out); s->tok = cursor; RETURN(1); } -#line 128 "scanner.c" +#line 133 "re2c-out.c" } -#line 92 "scanner.re" +#line 97 "scanner.re" } @@ -142,7 +147,7 @@ scan: s->tline = s->cline; s->tok = cursor; -#line 146 "scanner.c" +#line 151 "re2c-out.c" { YYCTYPE yych; unsigned int yyaccept; @@ -198,38 +203,38 @@ yy15: } yy17: yych = *++YYCURSOR; -#line 107 "scanner.re" +#line 112 "scanner.re" { depth = 1; goto code; } -#line 206 "scanner.c" +#line 211 "re2c-out.c" yy19: yych = *++YYCURSOR; if(yych == '*') goto yy54; yy20: -#line 126 "scanner.re" +#line 131 "scanner.re" { RETURN(*s->tok); } -#line 212 "scanner.c" +#line 217 "re2c-out.c" yy21: yych = *++YYCURSOR; if(yych == '/') goto yy52; yy22: -#line 128 "scanner.re" +#line 133 "scanner.re" { yylval.op = *s->tok; RETURN(CLOSE); } -#line 219 "scanner.c" +#line 224 "re2c-out.c" yy23: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych != '\n') goto yy48; yy24: -#line 119 "scanner.re" +#line 124 "scanner.re" { Scanner_fatal(s, "bad string"); } -#line 226 "scanner.c" +#line 231 "re2c-out.c" yy25: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if(yych != '\n') goto yy42; yy26: -#line 124 "scanner.re" +#line 129 "scanner.re" { Scanner_fatal(s, "bad character constant"); } -#line 233 "scanner.c" +#line 238 "re2c-out.c" yy27: yych = *++YYCURSOR; goto yy20; yy28: yych = *++YYCURSOR; @@ -237,34 +242,34 @@ yy28: yych = *++YYCURSOR; yy29: yych = *++YYCURSOR; goto yy40; yy30: -#line 131 "scanner.re" +#line 136 "scanner.re" { SubStr substr; s->cur = cursor; substr = Scanner_token(s); yylval.symbol = Symbol_find(&substr); return ID; } -#line 247 "scanner.c" +#line 252 "re2c-out.c" yy31: yych = *++YYCURSOR; goto yy38; yy32: -#line 137 "scanner.re" +#line 142 "scanner.re" { goto scan; } -#line 253 "scanner.c" +#line 258 "re2c-out.c" yy33: yych = *++YYCURSOR; -#line 139 "scanner.re" +#line 144 "scanner.re" { if(cursor == s->eof) RETURN(0); s->pos = cursor; s->cline++; goto scan; } -#line 261 "scanner.c" +#line 266 "re2c-out.c" yy35: yych = *++YYCURSOR; -#line 144 "scanner.re" +#line 149 "scanner.re" { fprintf(stderr, "unexpected character: '%c'\n", *s->tok); goto scan; } -#line 268 "scanner.c" +#line 273 "re2c-out.c" yy37: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; @@ -306,11 +311,11 @@ yy44: ++YYCURSOR; goto yy41; yy45: yych = *++YYCURSOR; -#line 121 "scanner.re" +#line 126 "scanner.re" { s->cur = cursor; yylval.regexp = ranToRE(Scanner_token(s)); return RANGE; } -#line 314 "scanner.c" +#line 319 "re2c-out.c" yy47: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; @@ -328,33 +333,33 @@ yy48: if(yych <= '!'){ goto yy47; yy50: yych = *++YYCURSOR; -#line 116 "scanner.re" +#line 121 "scanner.re" { s->cur = cursor; yylval.regexp = strToRE(Scanner_token(s)); return STRING; } -#line 336 "scanner.c" +#line 341 "re2c-out.c" yy52: yych = *++YYCURSOR; -#line 113 "scanner.re" +#line 118 "scanner.re" { s->tok = cursor; RETURN(0); } -#line 342 "scanner.c" +#line 347 "re2c-out.c" yy54: yych = *++YYCURSOR; -#line 110 "scanner.re" +#line 115 "scanner.re" { depth = 1; goto comment; } -#line 348 "scanner.c" +#line 353 "re2c-out.c" } -#line 147 "scanner.re" +#line 152 "scanner.re" code: -#line 355 "scanner.c" +#line 360 "re2c-out.c" { YYCTYPE yych; - unsigned int yyaccept; + goto yy56; ++YYCURSOR; yy56: @@ -379,33 +384,33 @@ yy56: } yych = *++YYCURSOR; -#line 151 "scanner.re" +#line 156 "scanner.re" { if(--depth == 0){ s->cur = cursor; yylval.token = Token_new(Scanner_token(s), s->tline); return CODE; } goto code; } -#line 390 "scanner.c" +#line 395 "re2c-out.c" yy60: yych = *++YYCURSOR; -#line 157 "scanner.re" +#line 162 "scanner.re" { ++depth; goto code; } -#line 396 "scanner.c" +#line 401 "re2c-out.c" yy62: yych = *++YYCURSOR; -#line 159 "scanner.re" +#line 164 "scanner.re" { if(cursor == s->eof) Scanner_fatal(s, "missing '}'"); s->pos = cursor; s->cline++; goto code; } -#line 404 "scanner.c" +#line 409 "re2c-out.c" yy64: yych = *++YYCURSOR; yy65: -#line 163 "scanner.re" +#line 168 "scanner.re" { goto code; } -#line 409 "scanner.c" +#line 414 "re2c-out.c" yy66: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych == '\n') goto yy65; @@ -449,12 +454,12 @@ yy73: if(yych <= '!'){ if(yych == '\n') goto yy70; goto yy72; } -#line 164 "scanner.re" +#line 169 "scanner.re" comment: -#line 458 "scanner.c" +#line 463 "re2c-out.c" { YYCTYPE yych; unsigned int yyaccept; @@ -474,38 +479,38 @@ yy75: yy77: yych = *++YYCURSOR; if(yych == '/') goto yy85; yy78: -#line 178 "scanner.re" +#line 183 "scanner.re" { goto comment; } -#line 480 "scanner.c" +#line 485 "re2c-out.c" yy79: yych = *++YYCURSOR; if(yych == '*') goto yy83; goto yy78; yy80: yych = *++YYCURSOR; -#line 174 "scanner.re" +#line 179 "scanner.re" { if(cursor == s->eof) RETURN(0); s->tok = s->pos = cursor; s->cline++; goto comment; } -#line 491 "scanner.c" +#line 496 "re2c-out.c" yy82: yych = *++YYCURSOR; goto yy78; yy83: yych = *++YYCURSOR; -#line 172 "scanner.re" +#line 177 "scanner.re" { ++depth; goto comment; } -#line 499 "scanner.c" +#line 504 "re2c-out.c" yy85: yych = *++YYCURSOR; -#line 168 "scanner.re" +#line 173 "scanner.re" { if(--depth == 0) goto scan; else goto comment; } -#line 507 "scanner.c" +#line 512 "re2c-out.c" } -#line 179 "scanner.re" +#line 184 "scanner.re" } diff --git a/tools/re2c/scanner.re b/tools/re2c/scanner.re index 13bf62e0..7c0a18a0 100644 --- a/tools/re2c/scanner.re +++ b/tools/re2c/scanner.re @@ -78,6 +78,11 @@ int Scanner_echo(Scanner *s, FILE *out) { unsigned char *cursor = s->cur; + + /* Catch EOF */ + if (s->eof && cursor == s->eof) + return 0; + s->tok = cursor; echo: /*!re2c -- 2.40.0