summary refs log tree commit diff
diff options
context:
space:
mode:
authorCurtis McEnroe2018-12-16 17:19:06 -0500
committerCurtis McEnroe2018-12-16 17:19:06 -0500
commit0b3d927e030876e20a5f408447ecf0238269a9eb (patch)
tree0210780c61cd8f2380f04b0a4af2af72c3d3d134
parentef916ddaff2c651c41e4737cdb50abb06365f8b3 (diff)
Add M-? to apply ROT13
-rw-r--r--catgirl.13
-rw-r--r--chat.h1
-rw-r--r--edit.c11
-rw-r--r--ui.c1
4 files changed, 16 insertions, 0 deletions
diff --git a/catgirl.1 b/catgirl.1
index 62f373e..e9476b7 100644
--- a/catgirl.1
+++ b/catgirl.1
@@ -293,6 +293,9 @@ Delete line after cursor.
 .It Aq Sy Tab
 Cycle through completions
 for commands, nicks and channels.
+.
+.It Sy M-?
+ROT13-encode line.
 .El
 .
 .Ss IRC Formatting
diff --git a/chat.h b/chat.h
index 441056c..03f3251 100644
--- a/chat.h
+++ b/chat.h
@@ -162,6 +162,7 @@ enum Edit {
 	EditKillBackWord,
 	EditKillForeWord,
 	EditKillLine,
+	EditROT13,
 	EditComplete,
 	EditEnter,
 };
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);
diff --git a/ui.c b/ui.c
index a4fedf5..fbbaae2 100644
--- a/ui.c
+++ b/ui.c
@@ -472,6 +472,7 @@ static void keyChar(wchar_t ch) {
 			break; case L'f':  edit(ui.view->tag, EditForeWord, 0);
 			break; case L'\b': edit(ui.view->tag, EditKillBackWord, 0);
 			break; case L'd':  edit(ui.view->tag, EditKillForeWord, 0);
+			break; case L'?':  edit(ui.view->tag, EditROT13, 0);
 			break; case L'm':  uiLog(ui.view->tag, UICold, L"");
 			break; default: {
 				if (ch >= L'0' && ch <= L'9') uiViewNum(ch - L'0');