diff options
Diffstat (limited to 'src/io/line.cpp')
-rw-r--r-- | src/io/line.cpp | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/src/io/line.cpp b/src/io/line.cpp index fb73f45..8173398 100644 --- a/src/io/line.cpp +++ b/src/io/line.cpp @@ -32,7 +32,7 @@ namespace io { - AString Line::message_str(ZString cat, ZString msg) + AString Line::message_str(ZString cat, ZString msg) const { MString out; if (column) @@ -46,7 +46,7 @@ namespace io return AString(out); } - void Line::message(ZString cat, ZString msg) + void Line::message(ZString cat, ZString msg) const { if (column) FPRINTF(stderr, "%s:%u:%u: %s: %s\n", @@ -58,6 +58,45 @@ namespace io FPRINTF(stderr, "%*c\n", column, '^'); } + AString LineSpan::message_str(ZString cat, ZString msg) const + { + assert (begin.column); + assert (end.column); + assert (begin.column <= end.column); + + MString out; + if (begin.line == end.line) + { + out += STRPRINTF("%s:%u:%u: %s: %s\n", + begin.filename, begin.line, begin.column, cat, msg); + out += STRPRINTF("%s\n", begin.text); + out += STRPRINTF("%*c", begin.column, '^'); + for (unsigned c = begin.column; c != end.column; ++c) + out += '~'; + out += '\n'; + } + else + { + out += STRPRINTF("%s:%u:%u: %s: %s\n", + begin.filename, begin.line, begin.column, cat, msg); + out += STRPRINTF("%s\n", begin.text); + out += STRPRINTF("%*c", begin.column, '^'); + for (unsigned c = begin.column; c != begin.text.size(); ++c) + out += '~'; + out += " ...\n"; + out += STRPRINTF("%s\n", end.text); + for (unsigned c = 0; c != end.column; ++c) + out += '~'; + out += '\n'; + } + return AString(out); + } + + void LineSpan::message(ZString cat, ZString msg) const + { + FPRINTF(stderr, "%s", message_str(cat, msg)); + } + LineReader::LineReader(ZString name) : filename(name), line(0), column(0), rf(name) {} |