From 7e0ea2f66566f3a9df5690ea6d197e70eaa8e2ad Mon Sep 17 00:00:00 2001 From: Mateusz Golicz Date: Sat, 20 Aug 2016 14:11:57 +1200 Subject: [PATCH] Show line contents with compile errors or warnings --- src/aven.cc | 5 ++++- src/datain.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/message.c | 17 +++++++++++++---- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/src/aven.cc b/src/aven.cc index e6e7e55a..d182b485 100644 --- a/src/aven.cc +++ b/src/aven.cc @@ -478,7 +478,10 @@ aven_v_report(int severity, const char *fnm, int line, int en, va_list ap) } char buf[1024]; - vsnprintf(buf, sizeof(buf), msg(en), ap); + if(severity == -1) + vsnprintf(buf, sizeof(buf), "%s", ap); + else + vsnprintf(buf, sizeof(buf), msg(en), ap); m += wxString(buf, wxConvUTF8); if (wxTheApp == NULL) { // We haven't initialised the Aven app object yet. diff --git a/src/datain.c b/src/datain.c index 1817c674..19c5fc78 100644 --- a/src/datain.c +++ b/src/datain.c @@ -116,6 +116,52 @@ error_list_parent_files(void) } } +void v_report_line_contents(const char *filename, unsigned line, ...); + + +void +v_report_line_contents(const char *filename, unsigned line, ...) +{ + va_list ap; + va_start(ap, line); + v_report(-1, filename, line, 0, 0, ap); + va_end(ap); + +} + +char *get_line_contents(); + +char* +get_line_contents() +{ +#define MAX_REPORTING_WIDTH 80 + filepos fp_stored; + filepos fp; + static char line[MAX_REPORTING_WIDTH + 1]; + int p = 0; + + /* Rewind to beginning of line */ + get_pos(&fp_stored); + + fp.ch = '\n'; + fp.offset = file.lpos; + set_pos(&fp); + + /* Read the line until EOL */ + while((p < MAX_REPORTING_WIDTH) && (!feof(file.fh))) + { + nextch(); + if(isEol(ch)) break; + line[p++] = ch; + } + line[p++] = 0; + + /* Revert to where we were */ + set_pos(&fp_stored); + + return line; +} + static void compile_v_report(int severity, int en, va_list ap) { @@ -125,6 +171,8 @@ compile_v_report(int severity, int en, va_list ap) en = -en; if (file.fh) col = ftell(file.fh) - file.lpos; } + if(file.fh) + v_report_line_contents(file.filename, file.line, get_line_contents()); v_report(severity, file.filename, file.line, col, en, ap); } diff --git a/src/message.c b/src/message.c index f771dc8a..028482d6 100644 --- a/src/message.c +++ b/src/message.c @@ -1218,19 +1218,28 @@ v_report(int severity, const char *fnm, int line, int col, int en, va_list ap) /* TRANSLATORS: Indicates a warning message e.g.: * "spoon.svx:12: warning: *prefix is deprecated" */ level = msg(/*warning*/4); - } else { + } else if (severity > 0) { /* TRANSLATORS: Indicates an error message e.g.: * "spoon.svx:13:4: error: Field may not be omitted" */ level = msg(/*error*/93); } - fputs(level, STDERR); - fputs(": ", STDERR); - vfprintf(STDERR, msg(en), ap); + if(severity == -1) + vfprintf(STDERR, "%s", ap); + else + { + fputs(level, STDERR); + fputs(": ", STDERR); + vfprintf(STDERR, msg(en), ap); + } + fputnl(STDERR); #endif switch (severity) { + case -1: + /* Just reporting line contents! */ + break; case 0: msg_warnings++; break; -- 2.11.4.GIT