about summary refs log tree commit diff
path: root/edit.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-02-09 01:28:24 -0500
committerJune McEnroe <june@causal.agency>2020-02-09 01:28:24 -0500
commit2d62ea9e30e7249e7f3e5bc3e60f5c8e97b3e2cc (patch)
tree98e9370d66dfd03bbc2139d345fb35b757593c99 /edit.c
parentShow realname on JOIN if it is different from nick (diff)
downloadcatgirl-2d62ea9e30e7249e7f3e5bc3e60f5c8e97b3e2cc.tar.gz
catgirl-2d62ea9e30e7249e7f3e5bc3e60f5c8e97b3e2cc.zip
Simplify edit buffer conversion and input rendering
Diffstat (limited to 'edit.c')
-rw-r--r--edit.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/edit.c b/edit.c
index 0c50f33..38dadcd 100644
--- a/edit.c
+++ b/edit.c
@@ -27,21 +27,22 @@ static wchar_t buf[Cap];
 static size_t len;
 static size_t pos;
 
-char *editHead(void) {
+char *editBuffer(size_t *mbsPos) {
 	static char mbs[MB_LEN_MAX * Cap];
+
 	const wchar_t *ptr = buf;
-	size_t n = wcsnrtombs(mbs, &ptr, pos, sizeof(mbs) - 1, NULL);
-	assert(n != (size_t)-1);
-	mbs[n] = '\0';
-	return mbs;
-}
+	size_t mbsLen = wcsnrtombs(mbs, &ptr, pos, sizeof(mbs) - 1, NULL);
+	assert(mbsLen != (size_t)-1);
+	if (mbsPos) *mbsPos = mbsLen;
 
-char *editTail(void) {
-	static char mbs[MB_LEN_MAX * Cap];
-	const wchar_t *ptr = &buf[pos];
-	size_t n = wcsnrtombs(mbs, &ptr, len - pos, sizeof(mbs) - 1, NULL);
+	ptr = &buf[pos];
+	size_t n = wcsnrtombs(
+		&mbs[mbsLen], &ptr, len - pos, sizeof(mbs) - mbsLen - 1, NULL
+	);
 	assert(n != (size_t)-1);
-	mbs[n] = '\0';
+	mbsLen += n;
+
+	mbs[mbsLen] = '\0';
 	return mbs;
 }
 
@@ -78,7 +79,7 @@ void edit(size_t id, enum Edit op, wchar_t ch) {
 		}
 		break; case EditEnter: {
 			pos = 0;
-			command(id, editTail());
+			command(id, editBuffer(NULL));
 			len = 0;
 		}
 	}