aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--text-objects.c15
-rw-r--r--text.c19
-rw-r--r--text.h4
-rw-r--r--vis.c11
-rw-r--r--window.c8
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;
}
diff --git a/text.c b/text.c
index 7cdfd03..3b73a62 100644
--- a/text.c
+++ b/text.c
@@ -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),
+ };
+}
diff --git a/text.h b/text.h
index 2343085..4f7c4dc 100644
--- a/text.h
+++ b/text.h
@@ -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;
diff --git a/vis.c b/vis.c
index a52fe9d..7e75dbc 100644
--- a/vis.c
+++ b/vis.c
@@ -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;
}
diff --git a/window.c b/window.c
index 59a275e..7329077 100644
--- a/window.c
+++ b/window.c
@@ -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;
}