]> git.mdlowis.com Git - projs/tide.git/commitdiff
reworked selection routines
authorMichael D. Lowis <mike@mdlowis.com>
Sun, 29 Sep 2019 03:53:11 +0000 (23:53 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Sun, 29 Sep 2019 03:53:11 +0000 (23:53 -0400)
src/lib/buf.c

index 518a760b48c704a842b0bdb3893085b72da8f777..ce45ae8a181f5a1327893ff07c1392244d7b3868 100644 (file)
@@ -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) {