#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)
&& (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) {
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;
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) {
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);
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));
}
}
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++)
}
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;
}
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;
}
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);
}
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;
}
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) {
else
buf_selword(buf, risbigword);
buf_getcol(buf);
- ensure(buf_selvalid(buf));
}
size_t buf_byrune(Buf* buf, size_t pos, int count) {
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) {
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);
}
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) {