summary refs log tree commit diff
path: root/edit.c
diff options
context:
space:
mode:
authorCurtis McEnroe2018-12-16 17:19:06 -0500
committerCurtis McEnroe2018-12-16 17:19:06 -0500
commit0b3d927e030876e20a5f408447ecf0238269a9eb (patch)
tree0210780c61cd8f2380f04b0a4af2af72c3d3d134 /edit.c
parentef916ddaff2c651c41e4737cdb50abb06365f8b3 (diff)
Add M-? to apply ROT13
Diffstat (limited to 'edit.c')
-rw-r--r--edit.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/edit.c b/edit.c
index 88301f6..93cba12 100644
--- a/edit.c
+++ b/edit.c
@@ -19,6 +19,7 @@
 #include <stdlib.h>
 #include <sysexits.h>
 #include <wchar.h>
+#include <wctype.h>
 
 #include "chat.h"
 
@@ -94,6 +95,14 @@ static void killForeWord(void) {
 	line.ptr = from;
 }
 
+static void rot13(void) {
+	for (wchar_t *ch = line.buf; ch != line.end; ++ch) {
+		if (!iswascii(*ch)) continue;
+		if (iswupper(*ch)) *ch = L'A' + (*ch - L'A' + 13) % 26;
+		if (iswlower(*ch)) *ch = L'a' + (*ch - L'a' + 13) % 26;
+	}
+}
+
 static char *prefix;
 static void complete(struct Tag tag) {
 	if (!line.tab) {
@@ -175,6 +184,8 @@ void edit(struct Tag tag, enum Edit op, wchar_t ch) {
 		break; case EditKillForeWord: reject(); killForeWord();
 		break; case EditKillLine:     reject(); line.end = line.ptr;
 
+		break; case EditROT13: accept(); rot13();
+
 		break; case EditComplete: complete(tag);
 
 		break; case EditEnter: accept(); enter(tag);