size_t buf_eol(Buf* buf, size_t pos);
size_t buf_bow(Buf* buf, size_t pos);
size_t buf_eow(Buf* buf, size_t pos);
-size_t buf_lscan(Buf* buf, size_t pos, Rune r);
-size_t buf_rscan(Buf* buf, size_t pos, Rune r);
-void buf_getword(Buf* buf, bool (*isword)(Rune), Sel* sel);
-void buf_getblock(Buf* buf, Rune beg, Rune end, Sel* sel);
+
+void buf_selline(Buf* buf, Sel* sel);
+void buf_selword(Buf* buf, bool (*isword)(Rune), Sel* sel);
+void buf_selblock(Buf* buf, Rune beg, Rune end, Sel* sel);
+void buf_selall(Buf* buf, Sel* sel);
+
size_t buf_byrune(Buf* buf, size_t pos, int count);
size_t buf_byword(Buf* buf, size_t pos, int count);
size_t buf_byline(Buf* buf, size_t pos, int count);
size_t buf_eow(Buf* buf, size_t off) {
for (; risword(buf_getrat(buf, off)); off++);
- return off-1;
-}
-
-size_t buf_lscan(Buf* buf, size_t pos, Rune r) {
- size_t off = pos;
- for (; (off > 0) && (r != buf_getrat(buf, off)); off--);
- return (buf_getrat(buf, off) == r ? off : pos);
+ return off;
}
-size_t buf_rscan(Buf* buf, size_t pos, Rune r) {
- size_t off = pos;
- size_t end = buf_end(buf);
- for (; (off < end) && (r != buf_getrat(buf, off)); off++);
- return (buf_getrat(buf, off) == r ? off : pos);
+void buf_selline(Buf* buf, Sel* sel) {
+ sel->beg = buf_bol(buf, sel->end);
+ sel->end = buf_eol(buf, sel->end);
+ sel->end = buf_byrune(buf, sel->end, RIGHT);
}
-void buf_getword(Buf* buf, bool (*isword)(Rune), Sel* sel) {
+void buf_selword(Buf* buf, bool (*isword)(Rune), Sel* sel) {
for (; isword(buf_getrat(buf, sel->beg-1)); sel->beg--);
for (; isword(buf_getrat(buf, sel->end)); sel->end++);
- sel->end--;
}
-void buf_getblock(Buf* buf, Rune first, Rune last, Sel* sel) {
+void buf_selblock(Buf* buf, Rune first, Rune last, Sel* sel) {
int balance = 0, dir;
size_t beg, end = sel->end;
if (balance != 0) return;
/* update the passed in selection */
- if (end > beg) beg++, end--;
+ if (end > beg) beg++; else end++;
sel->beg = beg, sel->end = end;
}
+void buf_selall(Buf* buf, Sel* sel) {
+ *sel = (Sel){ .beg = 0, .end = buf_end(buf) };
+
+}
+
+
size_t buf_byrune(Buf* buf, size_t pos, int count) {
int move = (count < 0 ? -1 : 1);
count *= move; // remove the sign if there is one
void view_selword(View* view, size_t row, size_t col) {
if (row != SIZE_MAX && col != SIZE_MAX)
view_setcursor(view, row, col, false);
- buf_getword(&(view->buffer), risbigword, getsel(view));
- getsel(view)->end++;
+ buf_selword(&(view->buffer), risbigword, getsel(view));
}
void view_selprev(View* view) {
size_t off = getoffset(view, row, col);
if (off != SIZE_MAX) {
Sel sel = { .beg = off, .end = off };
- if (buf_insel(&(view->buffer), NULL, off)) {
+ if (buf_insel(&(view->buffer), NULL, off))
sel = *(getsel(view));
- } else {
- buf_getword(&(view->buffer), isword, &sel);
- sel.end++;
- }
+ else
+ buf_selword(&(view->buffer), isword, &sel);
str = view_getstr(view, &sel);
}
return str;
}
void view_selectall(View* view) {
- *(getsel(view)) = (Sel){ .beg = 0, .end = buf_end(&(view->buffer)) };
+ buf_selall(&(view->buffer), getsel(view));
view->sync_needed = true;
}
void view_selectobj(View* view, bool (*istype)(Rune)) {
- buf_getword(&(view->buffer), istype, getsel(view));
+ buf_selword(&(view->buffer), istype, getsel(view));
view->sync_needed = true;
}
getsel(view)->end = (off > buf_end(buf) ? buf_end(buf) : off);
if (!extsel)
getsel(view)->beg = getsel(view)->end;
- buf_getcol(&(view->buffer), getsel(view));
+ buf_getcol(buf, getsel(view));
view->sync_needed = true;
}
Buf* buf = &(view->buffer);
size_t bol = buf_bol(buf, sel->end);
Rune r = buf_getc(buf, sel);
- if (r == '(' || r == ')') {
- buf_getblock(buf, '(', ')', sel);
- } else if (r == '[' || r == ']') {
- buf_getblock(buf, '[', ']', sel);
- } else if (r == '{' || r == '}') {
- buf_getblock(buf, '{', '}', sel);
- } else if (sel->end == bol || r == '\n') {
- sel->beg = bol;
- sel->end = buf_eol(buf, sel->end);
- } else if (risword(r)) {
- buf_getword(buf, isword, sel);
- } else {
- buf_getword(buf, risbigword, sel);
- }
- sel->end = buf_byrune(&(view->buffer), sel->end, RIGHT);
+ if (r == '(' || r == ')')
+ buf_selblock(buf, '(', ')', sel);
+ else if (r == '[' || r == ']')
+ buf_selblock(buf, '[', ']', sel);
+ else if (r == '{' || r == '}')
+ buf_selblock(buf, '{', '}', sel);
+ else if (sel->end == bol || r == '\n')
+ buf_selline(buf, sel);
+ else if (risword(r))
+ buf_selword(buf, isword, sel);
+ else
+ buf_selword(buf, risbigword, sel);
buf_getcol(&(view->buffer), getsel(view));
}