X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Flexer%2Flexer.c;h=2bcb18c32854748d206d1c87909bddb27b5b8a9e;hb=a77a485ccca5a79be44238d9bd2b00577badb9c8;hp=98cf8ec298245dfc53caf68648be4169a4cf90b0;hpb=b4f585e70eca236ca97e53ef487cea9a3ab5e78a;p=pspp diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c index 98cf8ec298..2bcb18c328 100644 --- a/src/language/lexer/lexer.c +++ b/src/language/lexer/lexer.c @@ -1257,7 +1257,6 @@ lex_source_error_valist (struct lex_source *src, int n0, int n1, { const struct lex_token *token; struct string s; - struct msg m; ds_init_empty (&s); @@ -1285,14 +1284,16 @@ lex_source_error_valist (struct lex_source *src, int n0, int n1, } ds_put_byte (&s, '.'); - m.category = MSG_C_SYNTAX; - m.severity = MSG_S_ERROR; - m.file_name = src->reader->file_name; - m.first_line = lex_source_get_first_line_number (src, n0); - m.last_line = lex_source_get_last_line_number (src, n1); - m.first_column = lex_source_get_first_column (src, n0); - m.last_column = lex_source_get_last_column (src, n1); - m.text = ds_steal_cstr (&s); + struct msg m = { + .category = MSG_C_SYNTAX, + .severity = MSG_S_ERROR, + .file_name = src->reader->file_name, + .first_line = lex_source_get_first_line_number (src, n0), + .last_line = lex_source_get_last_line_number (src, n1), + .first_column = lex_source_get_first_column (src, n0), + .last_column = lex_source_get_last_column (src, n1), + .text = ds_steal_cstr (&s), + }; msg_emit (&m); } @@ -1417,8 +1418,13 @@ lex_source_get__ (const struct lex_source *src_) /* Beginning of line. */ const char *line = &src->buffer[src->journal_pos - src->tail]; - /* Calculate line length, including \n or \r\n end-of-line if present. */ - size_t max_len = state.line_pos - src->journal_pos; + /* Calculate line length, including \n or \r\n end-of-line if present. + + We use src->head even though that may be beyond what we've actually + converted to tokens (which is only through state.line_pos). That's + because, if we're emitting the line due to SEG_END_COMMAND, we want to + take the whole line through the newline, not just through the '.'. */ + size_t max_len = src->head - src->journal_pos; const char *newline = memchr (line, '\n', max_len); size_t line_len = newline ? newline - line + 1 : max_len;