summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2018-08-07 15:43:49 -0400
committerJune McEnroe <june@causal.agency>2018-08-07 15:46:04 -0400
commitfe21b1410f3a2a0ee756a4b30dbd9ba91434cca3 (patch)
tree6d47583bd0234fb1107781a641ce666bb2fc9b61
parentPopulate tab-complete list (diff)
downloadcatgirl-fe21b1410f3a2a0ee756a4b30dbd9ba91434cca3.tar.gz
catgirl-fe21b1410f3a2a0ee756a4b30dbd9ba91434cca3.zip
Convert input to multibyte before handling
-rw-r--r--chat.c2
-rw-r--r--chat.h3
-rw-r--r--input.c50
-rw-r--r--pls.c12
-rw-r--r--ui.c11
5 files changed, 37 insertions, 41 deletions
diff --git a/chat.c b/chat.c
index ba83907..697e39a 100644
--- a/chat.c
+++ b/chat.c
@@ -30,7 +30,7 @@
 
 static void sigint(int sig) {
 	(void)sig;
-	input(L"/quit");
+	input("/quit");
 	uiHide();
 	exit(EX_OK);
 }
diff --git a/chat.h b/chat.h
index 5d9dc1c..8af6e8a 100644
--- a/chat.h
+++ b/chat.h
@@ -58,11 +58,10 @@ void uiFmt(const wchar_t *format, ...);
 #endif
 
 void handle(char *line);
-void input(wchar_t *line);
+void input(char *line);
 
 void tabTouch(const char *word);
 void tabRemove(const char *word);
 void tabReplace(const char *prev, const char *next);
 
-wchar_t *wcssep(wchar_t **stringp, const wchar_t *delim);
 int vaswprintf(wchar_t **ret, const wchar_t *format, va_list ap);
diff --git a/input.c b/input.c
index 0b653eb..391c5b5 100644
--- a/input.c
+++ b/input.c
@@ -18,16 +18,16 @@
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <sysexits.h>
-#include <wchar.h>
 
 #include "chat.h"
 
-static void privmsg(bool action, const wchar_t *mesg) {
+static void privmsg(bool action, const char *mesg) {
 	char *line;
 	int send;
 	asprintf(
-		&line, ":%s!%s %nPRIVMSG %s :%s%ls%s",
+		&line, ":%s!%s %nPRIVMSG %s :%s%s%s",
 		chat.nick, chat.user, &send, chat.chan,
 		(action ? "\1ACTION " : ""), mesg, (action ? "\1" : "")
 	);
@@ -37,66 +37,66 @@ static void privmsg(bool action, const wchar_t *mesg) {
 	free(line);
 }
 
-typedef void (*Handler)(wchar_t *params);
+typedef void (*Handler)(char *params);
 
-static void inputMe(wchar_t *params) {
-	privmsg(true, params ? params : L"");
+static void inputMe(char *params) {
+	privmsg(true, params ? params : "");
 }
 
-static void inputNick(wchar_t *params) {
-	wchar_t *nick = wcssep(&params, L" ");
+static void inputNick(char *params) {
+	char *nick = strsep(&params, " ");
 	if (nick) {
-		ircFmt("NICK %ls\r\n", nick);
+		ircFmt("NICK %s\r\n", nick);
 	} else {
 		uiLog(L"/nick requires a name");
 	}
 }
 
-static void inputWho(wchar_t *params) {
+static void inputWho(char *params) {
 	(void)params;
 	ircFmt("WHO %s\r\n", chat.chan);
 }
 
-static void inputTopic(wchar_t *params) {
+static void inputTopic(char *params) {
 	if (params) {
-		ircFmt("TOPIC %s :%ls\r\n", chat.chan, params);
+		ircFmt("TOPIC %s :%s\r\n", chat.chan, params);
 	} else {
 		ircFmt("TOPIC %s\r\n", chat.chan);
 	}
 }
 
-static void inputQuit(wchar_t *params) {
+static void inputQuit(char *params) {
 	if (params) {
-		ircFmt("QUIT :%ls\r\n", params);
+		ircFmt("QUIT :%s\r\n", params);
 	} else {
 		ircFmt("QUIT :Goodbye\r\n");
 	}
 }
 
 static const struct {
-	const wchar_t *command;
+	const char *command;
 	Handler handler;
 } COMMANDS[] = {
-	{ L"me", inputMe },
-	{ L"names", inputWho },
-	{ L"nick", inputNick },
-	{ L"quit", inputQuit },
-	{ L"topic", inputTopic },
-	{ L"who", inputWho },
+	{ "me", inputMe },
+	{ "names", inputWho },
+	{ "nick", inputNick },
+	{ "quit", inputQuit },
+	{ "topic", inputTopic },
+	{ "who", inputWho },
 };
 static const size_t COMMANDS_LEN = sizeof(COMMANDS) / sizeof(COMMANDS[0]);
 
-void input(wchar_t *input) {
+void input(char *input) {
 	if (input[0] != '/') {
 		privmsg(false, input);
 		return;
 	}
 	input++;
-	wchar_t *command = wcssep(&input, L" ");
+	char *command = strsep(&input, " ");
 	for (size_t i = 0; i < COMMANDS_LEN; ++i) {
-		if (wcscmp(command, COMMANDS[i].command)) continue;
+		if (strcmp(command, COMMANDS[i].command)) continue;
 		COMMANDS[i].handler(input);
 		return;
 	}
-	uiFmt("/%ls isn't a recognized command", command);
+	uiFmt("/%s isn't a recognized command", command);
 }
diff --git a/pls.c b/pls.c
index 7e6570c..0667036 100644
--- a/pls.c
+++ b/pls.c
@@ -20,18 +20,6 @@
 #include <stdlib.h>
 #include <wchar.h>
 
-wchar_t *wcssep(wchar_t **stringp, const wchar_t *delim) {
-	wchar_t *orig = *stringp;
-	if (!orig) return NULL;
-	size_t i = wcscspn(orig, delim);
-	*stringp = NULL;
-	if (orig[i]) {
-		orig[i] = L'\0';
-		*stringp = &orig[i + 1];
-	}
-	return orig;
-}
-
 // From <https://en.cppreference.com/w/c/io/fwprintf#Notes>:
 //
 // While narrow strings provide snprintf, which makes it possible to determine
diff --git a/ui.c b/ui.c
index 5cf62a1..2e028ff 100644
--- a/ui.c
+++ b/ui.c
@@ -350,7 +350,16 @@ static void delete(void) {
 static void enter(void) {
 	if (line.end == line.buf) return;
 	*line.end = L'\0';
-	input(line.buf);
+
+	const wchar_t *src = line.buf;
+	size_t len = wcsrtombs(NULL, &src, 0, NULL);
+	if (len == (size_t)-1) err(EX_DATAERR, "wcsrtombs");
+
+	char buf[1 + len];
+	len = wcsrtombs(buf, &src, sizeof(buf), NULL);
+	if (len == (size_t)-1) err(EX_DATAERR, "wcsrtombs");
+
+	input(buf);
 	line.ptr = line.buf;
 	line.end = line.buf;
 }