diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2014-09-13 23:00:19 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2014-09-13 23:00:19 +0200 |
| commit | 19c1ea602bde2e131bdc89f78786a2efced41d42 (patch) | |
| tree | 2ccc6d7a4d518d2c73fc296e90b349c791e483c5 | |
| parent | 9da490af05b2aac772f0bdbb934dd313c1271749 (diff) | |
| download | vis-19c1ea602bde2e131bdc89f78786a2efced41d42.tar.gz vis-19c1ea602bde2e131bdc89f78786a2efced41d42.tar.xz | |
Introduce some helper functions dealing with Filerange
| -rw-r--r-- | text-objects.c | 15 | ||||
| -rw-r--r-- | text.c | 19 | ||||
| -rw-r--r-- | text.h | 4 | ||||
| -rw-r--r-- | vis.c | 11 | ||||
| -rw-r--r-- | window.c | 8 |
5 files changed, 36 insertions, 21 deletions
diff --git a/text-objects.c b/text-objects.c index f4ff1f2..e1c53d3 100644 --- a/text-objects.c +++ b/text-objects.c @@ -18,17 +18,12 @@ #include "text-objects.h" #include "util.h" -static Filerange empty = { - .start = -1, - .end = -1, -}; - Filerange text_object_word(Text *txt, size_t pos) { Filerange r; char c, prev = '0', next = '0'; Iterator it = text_iterator_get(txt, pos); if (!text_iterator_byte_get(&it, &c)) - return empty; + return text_range_empty(); if (text_iterator_byte_prev(&it, &prev)) text_iterator_byte_next(&it, NULL); text_iterator_byte_next(&it, &next); @@ -86,6 +81,7 @@ Filerange text_object_paragraph(Text *txt, size_t pos) { static Filerange text_object_bracket(Text *txt, size_t pos, char type) { char c, open, close; int opened = 1, closed = 1; + Filerange r = text_range_empty(); switch (type) { case '(': case ')': open = '('; close = ')'; break; @@ -95,10 +91,9 @@ static Filerange text_object_bracket(Text *txt, size_t pos, char type) { case '"': open = '"'; close = '"'; break; case '`': open = '`'; close = '`'; break; case '\'': open = '\''; close = '\''; break; - default: return empty; + default: return r; } - Filerange r = empty; Iterator it = text_iterator_get(txt, pos); if (open == close && text_iterator_byte_get(&it, &c) && (c == '"' || c == '`' || c == '\'')) { @@ -129,8 +124,8 @@ static Filerange text_object_bracket(Text *txt, size_t pos, char type) { text_iterator_byte_next(&it, NULL); } - if (r.start == (size_t)-1 || r.end == (size_t)-1 || r.start > r.end) - return empty; + if (!text_range_valid(&r)) + return text_range_empty(); return r; } @@ -1111,3 +1111,22 @@ int text_search_range_backward(Text *txt, size_t pos, size_t len, Regex *r, size free(buf); return ret; } + +bool text_range_valid(Filerange *r) { + return r->start != EPOS && r->end != EPOS && r->start <= r->end; +} + +Filerange text_range_empty(void) { + return (Filerange){ .start = EPOS, .end = EPOS }; +} + +Filerange text_range_union(Filerange *r1, Filerange *r2) { + if (!text_range_valid(r1)) + return *r2; + if (!text_range_valid(r2)) + return *r1; + return (Filerange) { + .start = MIN(r1->start, r2->start), + .end = MAX(r1->end, r2->end), + }; +} @@ -12,6 +12,10 @@ typedef struct { size_t start, end; /* range in bytes from start of the file */ } Filerange; +bool text_range_valid(Filerange*); +Filerange text_range_empty(void); +Filerange text_range_union(Filerange*, Filerange*); + typedef struct Text Text; typedef struct Piece Piece; @@ -831,16 +831,15 @@ static void action_do(Action *a) { c.range.start = c.range.end = pos; for (int i = 0; i < a->count; i++) { r = a->textobj->range(txt, pos); - // TODO range_valid? - if (r.start == EPOS || r.end == EPOS) + if (!text_range_valid(&r)) break; if (a->textobj->type == OUTER) { r.start--; r.end++; } - // TODO c.range = range_union(&c.range, &r); - c.range.start = MIN(c.range.start, r.start); - c.range.end = MAX(c.range.end, r.end); + + c.range = text_range_union(&c.range, &r); + if (i < a->count - 1) { if (a->textobj == &textobjs[TEXT_OBJ_LINE_UP]) { pos = c.range.start - 1; @@ -851,7 +850,7 @@ static void action_do(Action *a) { } } else if (mode == &vis_modes[VIS_MODE_VISUAL]) { c.range = window_selection_get(win); - if (c.range.start == EPOS || c.range.end == EPOS) + if (!text_range_valid(&c.range)) c.range.start = c.range.end = pos; } @@ -84,7 +84,7 @@ static bool window_scroll_lines_down(Win *win, int n); static bool window_scroll_lines_up(Win *win, int n); void window_selection_clear(Win *win) { - win->sel.start = win->sel.end = EPOS; + win->sel = text_range_empty(); window_draw(win); window_cursor_update(win); curs_set(1); @@ -113,15 +113,13 @@ static void window_clear(Win *win) { Filerange window_selection_get(Win *win) { Filerange sel = win->sel; - if (sel.start == EPOS || sel.end == EPOS) { - sel.start = sel.end = EPOS; - return sel; - } if (sel.start > sel.end) { size_t tmp = sel.start; sel.start = sel.end; sel.end = tmp; } + if (!text_range_valid(&sel)) + return text_range_empty(); sel.end = text_char_next(win->text, sel.end); return sel; } |
