summaryrefslogtreecommitdiff
path: root/src/io/line.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/io/line.cpp')
-rw-r--r--src/io/line.cpp43
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)
{}