diff options
Diffstat (limited to 'src/wasm-parser-lexer-shared.c')
-rw-r--r-- | src/wasm-parser-lexer-shared.c | 103 |
1 files changed, 10 insertions, 93 deletions
diff --git a/src/wasm-parser-lexer-shared.c b/src/wasm-parser-lexer-shared.c index 7cc10057..599f7c2b 100644 --- a/src/wasm-parser-lexer-shared.c +++ b/src/wasm-parser-lexer-shared.c @@ -49,107 +49,24 @@ void wasm_format_error(WasmSourceErrorHandler* error_handler, char* source_line = NULL; size_t source_line_length = 0; - size_t source_line_column_offset = 0; + int source_line_column_offset = 0; size_t source_line_max_length = error_handler->source_line_max_length; if (loc) { source_line = alloca(source_line_max_length + 1); - - size_t line_offset = wasm_lexer_get_file_offset_from_line(lexer, loc->line); - FILE* lexer_file = wasm_lexer_get_file(lexer); - long old_offset = ftell(lexer_file); - if (old_offset != -1) { - size_t next_line_offset = - wasm_lexer_get_file_offset_from_line(lexer, loc->line + 1); - if (next_line_offset == WASM_INVALID_LINE_OFFSET) { - /* we haven't gotten to the next line yet. read the file to find it. - 1 - because columns are 1-based */ - size_t offset = line_offset + (loc->last_column - 1); - next_line_offset = offset; - if (fseek(lexer_file, offset, SEEK_SET) != -1) { - char buffer[256]; - while (1) { - size_t bytes_read = fread(buffer, 1, sizeof(buffer), lexer_file); - if (bytes_read <= 0) - break; - - char* newline = memchr(buffer, '\n', bytes_read); - if (newline) { - next_line_offset += (newline - buffer); - break; - } else { - next_line_offset += bytes_read; - } - } - } - } else { - /* don't include the newline */ - next_line_offset--; - } - - source_line_length = next_line_offset - line_offset; - size_t column_range = loc->last_column - loc->first_column; - size_t start_offset = line_offset; - if (source_line_length > source_line_max_length) { - source_line_length = source_line_max_length; - size_t center_on; - if (column_range > source_line_max_length) { - /* the column range doesn't fit, just center on first_column */ - center_on = loc->first_column - 1; - } else { - /* the entire range fits, display it all in the center */ - center_on = (loc->first_column + loc->last_column) / 2 - 1; - } - if (center_on > source_line_max_length / 2) - start_offset = line_offset + center_on - source_line_max_length / 2; - if (start_offset > next_line_offset - source_line_max_length) - start_offset = next_line_offset - source_line_max_length; - } - - source_line_column_offset = start_offset - line_offset; - - char* p = source_line; - size_t read_start = start_offset; - size_t read_length = source_line_length; - WasmBool has_start_ellipsis = start_offset != line_offset; - WasmBool has_end_ellipsis = - start_offset + source_line_length != next_line_offset; - - if (has_start_ellipsis) { - memcpy(p, "...", 3); - p += 3; - read_start += 3; - read_length -= 3; - } - - if (has_end_ellipsis) { - read_length -= 3; - } - - if (fseek(lexer_file, read_start, SEEK_SET) != -1) { - size_t bytes_read = fread(p, 1, read_length, lexer_file); - if (bytes_read > 0) - p += bytes_read; - } - - if (has_end_ellipsis) { - memcpy(p, "...", 3); - p += 3; - } - - source_line_length = p - source_line; - - *p = '\0'; - - if (fseek(lexer_file, old_offset, SEEK_SET) == -1) { - /* we're screwed now, blow up. */ - WASM_FATAL("failed to seek."); - } + WasmResult result = wasm_lexer_get_source_line( + lexer, loc, source_line_max_length, source_line, + &source_line_length, &source_line_column_offset); + if (WASM_FAILED(result)) { + /* if this fails, it means that we've probably screwed up the lexer. blow + * up. */ + WASM_FATAL("error getting the source line."); } } if (error_handler->on_error) { error_handler->on_error(loc, buffer, source_line, source_line_length, - source_line_column_offset, error_handler->user_data); + source_line_column_offset, + error_handler->user_data); } va_end(args_copy); } |