diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2016-10-26 22:47:24 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2016-10-26 22:58:12 +0100 |
| commit | 7c6c6871ce205d80801e0e3133afd66d0b9b04cd (patch) | |
| tree | d2bf26cd9e3f5a4ce3f5a30dfee0d7c04b1b77db /src/display_buffer.cc | |
| parent | 4b2004c6ff3d68fc439e551ebca394ca51e5741f (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.cc | 30 |
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 { |
