X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Fmclex.c;h=da8bfb513112679949f055c4dbca66b4ace3ebd4;hb=cf6f3e86ded2cd950f59a0f2c164f2c953ef534b;hp=c1560b674dea6ab79982d52e70c1566212ecc4d2;hpb=219d1afa89d0d53ca93a684cac341f16470f3ca0;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/mclex.c b/binutils/mclex.c index c1560b674d..da8bfb5131 100644 --- a/binutils/mclex.c +++ b/binutils/mclex.c @@ -1,5 +1,5 @@ /* mclex.c -- lexer for Windows mc files parser. - Copyright (C) 2007-2018 Free Software Foundation, Inc. + Copyright (C) 2007-2020 Free Software Foundation, Inc. Written by Kai Tietz, Onevision. @@ -323,6 +323,21 @@ mc_token (const unichar *t, size_t len) return -1; } +/* Skip characters in input_stream_pos up to and including a newline + character. Returns non-zero if the newline was found, zero otherwise. */ + +static int +skip_until_eol (void) +{ + while (input_stream_pos[0] != 0 && input_stream_pos[0] != '\n') + ++input_stream_pos; + if (input_stream_pos[0] == 0) + return 0; + if (input_stream_pos[0] == '\n') + ++input_stream_pos; + return 1; +} + int yylex (void) { @@ -334,27 +349,28 @@ yylex (void) fatal ("Input stream not setuped.\n"); return -1; } + if (mclex_want_line) { start_token = input_stream_pos; + if (input_stream_pos[0] == 0) + return -1; + /* PR 26082: Reject a period followed by EOF. */ + if (input_stream_pos[0] == '.' && input_stream_pos[1] == 0) + return -1; if (input_stream_pos[0] == '.' && (input_stream_pos[1] == '\n' || (input_stream_pos[1] == '\r' && input_stream_pos[2] == '\n'))) - { - mclex_want_line = FALSE; - while (input_stream_pos[0] != 0 && input_stream_pos[0] != '\n') - ++input_stream_pos; - if (input_stream_pos[0] == '\n') - ++input_stream_pos; - return MCENDLINE; - } - while (input_stream_pos[0] != 0 && input_stream_pos[0] != '\n') - ++input_stream_pos; - if (input_stream_pos[0] == '\n') - ++input_stream_pos; + { + mclex_want_line = FALSE; + return skip_until_eol () ? MCENDLINE : -1; + } + if (!skip_until_eol ()) + return -1; yylval.ustr = get_diff (input_stream_pos, start_token); return MCLINE; } + while ((ch = input_stream_pos[0]) <= 0x20) { if (ch == 0) @@ -402,10 +418,8 @@ yylex (void) { case ';': ++start_token; - while (input_stream_pos[0] != '\n' && input_stream_pos[0] != 0) - ++input_stream_pos; - if (input_stream_pos[0] == '\n') - input_stream_pos++; + if (!skip_until_eol ()) + return -1; yylval.ustr = get_diff (input_stream_pos, start_token); return MCCOMMENT; case '=':