summary refs log tree commit diff
path: root/edit.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-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);