summaryrefslogtreecommitdiff
path: root/src/display_buffer.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2016-10-26 22:47:24 +0100
committerMaxime Coste <frrrwww@gmail.com>2016-10-26 22:58:12 +0100
commit7c6c6871ce205d80801e0e3133afd66d0b9b04cd (patch)
treed2bf26cd9e3f5a4ce3f5a30dfee0d7c04b1b77db /src/display_buffer.cc
parent4b2004c6ff3d68fc439e551ebca394ca51e5741f (diff)
BufferRange option syntax support <line>.<column>+<len> and is inclusive
Fixes #864
Diffstat (limited to 'src/display_buffer.cc')
-rw-r--r--src/display_buffer.cc30
1 files changed, 17 insertions, 13 deletions
diff --git a/src/display_buffer.cc b/src/display_buffer.cc
index fdf3b1c4..4ac6a2fb 100644
--- a/src/display_buffer.cc
+++ b/src/display_buffer.cc
@@ -14,28 +14,32 @@ String option_to_string(BufferRange range)
{
return format("{}.{},{}.{}",
range.begin.line+1, range.begin.column+1,
- range.end.line+1, range.end.column+1);
+ range.end.line, range.end.column);
}
void option_from_string(StringView str, BufferRange& opt)
{
- auto comma = find(str, ',');
- auto dot_begin = find(StringView{str.begin(), comma}, '.');
- auto dot_end = find(StringView{comma, str.end()}, '.');
+ auto sep = find_if(str, [](char c){ return c == ',' or c == '+'; });
+ auto dot_beg = find(StringView{str.begin(), sep}, '.');
+ auto dot_end = find(StringView{sep, str.end()}, '.');
- if (comma == str.end() or dot_begin == comma or dot_end == str.end())
- throw runtime_error(format("'{}' does not follow <line>.<column>,<line>.<column> format", str));
+ if (sep == str.end() or dot_beg == sep or
+ (*sep == ',' and dot_end == str.end()))
+ throw runtime_error(format("'{}' does not follow <line>.<column>,<line>.<column> or <line>.<column>+<len> format", str));
- BufferCoord begin{str_to_int({str.begin(), dot_begin}) - 1,
- str_to_int({dot_begin+1, comma}) - 1};
+ const BufferCoord beg{str_to_int({str.begin(), dot_beg}) - 1,
+ str_to_int({dot_beg+1, sep}) - 1};
- BufferCoord end{str_to_int({comma+1, dot_end}) - 1,
- str_to_int({dot_end+1, str.end()}) - 1};
+ const bool len = (*sep == '+');
+ const BufferCoord end{len ? beg.line : str_to_int({sep+1, dot_end}) - 1,
+ len ? beg.column + str_to_int({sep+1, str.end()})
+ : str_to_int({dot_end+1, str.end()}) };
- opt.begin = begin;
- opt.end = end;
-}
+ if (beg.line < 0 or beg.column < 0 or end.line < 0 or end.column < 0)
+ throw runtime_error("coordinates elements should be >= 1");
+ opt = { beg, end };
+}
StringView DisplayAtom::content() const
{