From: Michael D. Lowis Date: Sun, 29 Sep 2019 03:53:11 +0000 (-0400) Subject: reworked selection routines X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=9463fe0f321666aeac17962d3595215d7b81087d;p=projs%2Ftide.git reworked selection routines --- diff --git a/src/lib/buf.c b/src/lib/buf.c index 518a760..ce45ae8 100644 --- a/src/lib/buf.c +++ b/src/lib/buf.c @@ -9,24 +9,6 @@ #include "config.h" #ifndef NDEBUG -static bool buf_logvalid(Log* log) { - bool result = true; - for (; result && log; log = log->next) { - if (log->data) { - result = result && (log->beg == log->end); - } else { - result = result && (log->end > log->beg); - } - } - return result; -} - -static bool buf_selvalid(Buf* buf) { - (void)buf; - return (buf->selection.beg <= buf->selection.end); -// return true; -} - static bool buf_valid(Buf* buf) { return ( (buf->bufsize > 0) @@ -40,13 +22,25 @@ static bool buf_valid(Buf* buf) { && (buf->gapend >= buf->bufstart) && (buf->gapstart <= buf->bufend) && (buf->gapend <= buf->bufend) - && (buf_logvalid(buf->undo)) - && (buf_logvalid(buf->redo)) - && (buf_selvalid(buf)) ); } #endif +static Sel selswap(Sel sel) { + size_t off = sel.beg; + sel.beg = sel.end, sel.end = off; + return sel; +} + +static Sel selget(Buf* buf) { + Sel sel = buf->selection; + return (sel.end < sel.beg ? selswap(sel) : sel); +} + +//static void selset(Buf* buf, Sel sel) { +// buf->selection = (sel.end < sel.beg ? selswap(sel) : sel); +//} + /* Creation, Resizing, Loading, and Saving ******************************************************************************/ static size_t pagealign(size_t sz) { @@ -190,27 +184,6 @@ void buf_reload(Buf* buf) { buf_load(buf, path); } -static Sel selswap(Sel sel) { - size_t off = sel.beg; - sel.beg = sel.end, sel.end = off; - return sel; -} - -//static void proc_lines(Buf* buf) { -// if (!buf_end(buf)) return; -// Sel sel = buf->selection; -// buf->selection.beg = buf->selection.end = 0; -// size_t bend = buf_end(buf); -// while (buf->selection.end < bend) { -// buf->selection.end = buf_byline(buf, buf->selection.end, DOWN); -// char* s = buf_gets(buf); -// printf("'%s'\n", s); -// free(s); -// buf->selection.beg = buf->selection.end; -// } -// buf->selection = sel; -//} - static void trim_whitespace(Buf* buf) { if (!TrimOnSave || !buf_end(buf)) return; Sel sel = buf->selection; @@ -273,14 +246,6 @@ int buf_save(Buf* buf, char* path) { return buf->status; } -static Sel buf_getsel(Buf* buf) { - size_t temp; - Sel sel = buf->selection; - if (sel.end < sel.beg) - temp = sel.beg, sel.beg = sel.end, sel.end = temp; - return sel; -} - /* Undo/Redo Operations ******************************************************************************/ static Log* mklog(Buf* buf, size_t beg, size_t end, char* data, Log* next) { @@ -357,7 +322,7 @@ static void log_swap(Buf* buf, Log** src, Log** dest) { buf->selection.end = item->end; } else { /* delete the added bytes */ - Sel sel = buf_getsel(buf); + Sel sel = selget(buf); item->data = buf_gets(buf); buf_syncgap(buf, sel.beg); buf->gapend += (item->end - item->beg); @@ -451,10 +416,10 @@ void buf_putc(Buf* buf, int c) { void buf_puts(Buf* buf, char* s) { buf_del(buf); - size_t beg = buf_getsel(buf).beg; + size_t beg = buf_selbeg(buf); if (s && *s) { while (*s) putch(buf, *(s++), &(buf->selection)); - log_add(buf, beg, buf_getsel(buf).end, NULL); + log_add(buf, beg, buf_selend(buf), NULL); } ensure(buf_valid(buf)); } @@ -464,7 +429,7 @@ int buf_getc(Buf* buf) { } char* buf_gets(Buf* buf) { - Sel sel = buf_getsel(buf); + Sel sel = selget(buf); size_t nbytes = sel.end - sel.beg; char* str = malloc(nbytes+1); for (size_t i = 0; i < nbytes; i++) @@ -474,7 +439,7 @@ char* buf_gets(Buf* buf) { } char* buf_getsat(Buf* buf, size_t beg, size_t end) { - Sel sel = buf_getsel(buf); + Sel sel = selget(buf); buf->selection = (Sel){ .beg = beg, .end = end }; char* str = buf_gets(buf); buf->selection = sel; @@ -482,7 +447,7 @@ char* buf_getsat(Buf* buf, size_t beg, size_t end) { } void buf_del(Buf* buf) { - Sel sel = buf_getsel(buf); + Sel sel = selget(buf); size_t nbytes = sel.end - sel.beg; if (nbytes > 0) { buf->status = MODIFIED; @@ -509,7 +474,7 @@ static Rune nextrune(Buf* buf, size_t off, int move, bool (*testfn)(Rune)) { } static void selline(Buf* buf) { - Sel sel = buf_getsel(buf); + Sel sel = selget(buf); sel.beg = buf_bol(buf, sel.end); sel.end = buf_eol(buf, sel.end); sel.end = buf_byrune(buf, sel.end, RIGHT); @@ -517,7 +482,7 @@ static void selline(Buf* buf) { } static void selblock(Buf* buf, Rune first, Rune last) { - Sel sel = buf_getsel(buf); + Sel sel = selget(buf); int balance = 0, dir; size_t beg, end = sel.end; @@ -579,16 +544,14 @@ size_t buf_eol(Buf* buf, size_t off) { } void buf_selword(Buf* buf, bool (*isword)(Rune)) { - Sel sel = buf_getsel(buf); + Sel sel = selget(buf); for (; isword(buf_getrat(buf, sel.beg-1)); sel.beg--); for (; isword(buf_getrat(buf, sel.end)); sel.end++); buf->selection = sel; - ensure(buf_selvalid(buf)); } void buf_selall(Buf* buf) { buf->selection = (Sel){ .beg = 0, .end = buf_end(buf) }; - ensure(buf_selvalid(buf)); } static bool selquote(Buf* buf, Rune c) { @@ -636,7 +599,6 @@ void buf_selctx(Buf* buf, bool (*isword)(Rune)) { else buf_selword(buf, risbigword); buf_getcol(buf); - ensure(buf_selvalid(buf)); } size_t buf_byrune(Buf* buf, size_t pos, int count) { @@ -720,7 +682,6 @@ void buf_setln(Buf* buf, size_t line) { line--, curr = next; } buf->selection.beg = buf->selection.end = curr; - ensure(buf_selvalid(buf)); } void buf_getln(Buf* buf, size_t* begln, size_t* endln) { @@ -764,27 +725,23 @@ void buf_setcol(Buf* buf) { i += width; } buf->selection = sel; - ensure(buf_selvalid(buf)); } size_t buf_selbeg(Buf* buf) { - Sel sel = buf_getsel(buf); - return (sel.beg < sel.end ? sel.beg : sel.end); + return selget(buf).beg; } size_t buf_selend(Buf* buf) { - Sel sel = buf_getsel(buf); - return (sel.beg < sel.end ? sel.end : sel.beg); + return selget(buf).end; } size_t buf_selsz(Buf* buf) { - Sel sel = buf_getsel(buf); - return sel.end - sel.beg; + return (selget(buf).end - selget(buf).beg); } void buf_selln(Buf* buf) { /* Expand the selection to completely select the lines covered */ - Sel sel = (Sel){ .beg = buf_selbeg(buf), .end = buf_selend(buf) }; + Sel sel = selget(buf); sel.beg = buf_bol(buf, sel.beg); if (!buf_iseol(buf, sel.end-1) || sel.end == sel.beg) { sel.end = buf_eol(buf, sel.end); @@ -794,18 +751,16 @@ void buf_selln(Buf* buf) { } void buf_selclr(Buf* buf, int dir) { - if (buf->selection.beg > buf->selection.end) - buf->selection = selswap(buf->selection); + Sel sel = selget(buf); if (dir > 0) - buf->selection.beg = buf->selection.end; + sel.beg = sel.end; else - buf->selection.end = buf->selection.beg; - ensure(buf_selvalid(buf)); + sel.end = sel.beg; + buf->selection = sel; } bool buf_insel(Buf* buf, size_t off) { - Sel sel = buf_getsel(buf); - return (off >= sel.beg && off < sel.end); + return (off >= buf_selbeg(buf) && off < buf_selend(buf)); } char* buf_fetch(Buf* buf, bool (*isword)(Rune), size_t off) {