diff options
author | June McEnroe <june@causal.agency> | 2022-02-20 16:20:33 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2022-02-20 16:20:33 -0500 |
commit | da1b943fccc426bc43caa7e7e51208833b9fce66 (patch) | |
tree | 470f1248afb330b03e1090d953b1e49f4f736d3c | |
parent | Assert return values in edit tests (diff) | |
download | catgirl-da1b943fccc426bc43caa7e7e51208833b9fce66.tar.gz catgirl-da1b943fccc426bc43caa7e7e51208833b9fce66.zip |
Share a cut buffer between all edit buffers
-rw-r--r-- | edit.c | 26 | ||||
-rw-r--r-- | edit.h | 8 | ||||
-rw-r--r-- | input.c | 5 |
3 files changed, 16 insertions, 23 deletions
diff --git a/edit.c b/edit.c index eb3d28d..bb92edf 100644 --- a/edit.c +++ b/edit.c @@ -38,13 +38,6 @@ static bool isword(wchar_t ch) { return !iswspace(ch) && !iswpunct(ch); } -void editFree(struct Edit *e) { - free(e->buf); - free(e->cut.buf); - e->pos = e->len = e->cap = 0; - e->cut.len = 0; -} - char *editString(const struct Edit *e, char **buf, size_t *cap, size_t *pos) { size_t req = e->len * MB_CUR_MAX + 1; if (req > *cap) { @@ -93,11 +86,10 @@ int editCopy(struct Edit *e, size_t index, size_t count) { errno = EINVAL; return -1; } - wchar_t *buf = realloc(e->cut.buf, sizeof(*buf) * count); - if (!buf) return -1; - e->cut.buf = buf; - wmemcpy(e->cut.buf, &e->buf[index], count); - e->cut.len = count; + if (!e->cut) return 0; + e->cut->len = 0; + if (editReserve(e->cut, 0, count) < 0) return -1; + wmemcpy(e->cut->buf, &e->buf[index], count); return 0; } @@ -159,10 +151,11 @@ int editFn(struct Edit *e, enum EditFn fn) { } break; case EditPaste: { - ret = editReserve(e, e->pos, e->cut.len); + if (!e->cut) break; + ret = editReserve(e, e->pos, e->cut->len); if (ret == 0) { - wmemcpy(&e->buf[e->pos], e->cut.buf, e->cut.len); - e->pos += e->cut.len; + wmemcpy(&e->buf[e->pos], e->cut->buf, e->cut->len); + e->pos += e->cut->len; } } break; case EditTranspose: { @@ -226,7 +219,8 @@ static bool eq(struct Edit *e, const char *str1) { #define editFn(...) assert(0 == editFn(__VA_ARGS__)) int main(void) { - struct Edit e = { .mode = EditEmacs }; + struct Edit cut = {0}; + struct Edit e = { .cut = &cut }; fix(&e, "foo bar"); editFn(&e, EditHead); diff --git a/edit.h b/edit.h index 9cf814b..957d3e3 100644 --- a/edit.h +++ b/edit.h @@ -38,10 +38,7 @@ struct Edit { size_t pos; size_t len; size_t cap; - struct { - wchar_t *buf; - size_t len; - } cut; + struct Edit *cut; }; enum EditFn { @@ -75,9 +72,6 @@ int editInsert(struct Edit *e, wchar_t ch); // Convert the buffer to a multi-byte string. char *editString(const struct Edit *e, char **buf, size_t *cap, size_t *pos); -// Free all buffers. -void editFree(struct Edit *e); - // Reserve a range in the buffer. int editReserve(struct Edit *e, size_t index, size_t count); diff --git a/input.c b/input.c index a74335e..b6c51a2 100644 --- a/input.c +++ b/input.c @@ -89,9 +89,14 @@ enum { #undef X }; +static struct Edit cut; static struct Edit edits[IDCap]; void inputInit(void) { + for (size_t i = 0; i < ARRAY_LEN(edits); ++i) { + edits[i].cut = &cut; + } + struct termios term; int error = tcgetattr(STDOUT_FILENO, &term); if (error) err(EX_OSERR, "tcgetattr"); |