summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--chat.c2
-rw-r--r--chat.h75
-rw-r--r--command.c68
-rw-r--r--complete.c22
-rw-r--r--edit.c4
-rw-r--r--handle.c32
-rw-r--r--irc.c4
-rw-r--r--ui.c66
-rw-r--r--url.c18
9 files changed, 146 insertions, 145 deletions
diff --git a/chat.c b/chat.c
index 318a379..ef135bc 100644
--- a/chat.c
+++ b/chat.c
@@ -63,7 +63,7 @@ enum Color idColors[IDCap] = {
 	[Network] = Gray,
 };
 
-size_t idNext = Network + 1;
+uint idNext = Network + 1;
 
 struct Network network;
 struct Self self = { .color = Default };
diff --git a/chat.h b/chat.h
index ade2ffc..b14a65a 100644
--- a/chat.h
+++ b/chat.h
@@ -26,6 +26,7 @@
 #define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0]))
 #define BIT(x) x##Bit, x = 1 << x##Bit, x##Bit_ = x##Bit
 
+typedef unsigned uint;
 typedef unsigned char byte;
 
 enum Color {
@@ -38,17 +39,17 @@ enum Color {
 enum { None, Debug, Network, IDCap = 256 };
 extern char *idNames[IDCap];
 extern enum Color idColors[IDCap];
-extern size_t idNext;
+extern uint idNext;
 
-static inline size_t idFind(const char *name) {
-	for (size_t id = 0; id < idNext; ++id) {
+static inline uint idFind(const char *name) {
+	for (uint id = 0; id < idNext; ++id) {
 		if (!strcmp(idNames[id], name)) return id;
 	}
 	return None;
 }
 
-static inline size_t idFor(const char *name) {
-	size_t id = idFind(name);
+static inline uint idFor(const char *name) {
+	uint id = idFind(name);
 	if (id) return id;
 	if (idNext == IDCap) return Network;
 	idNames[idNext] = strdup(name);
@@ -141,29 +142,29 @@ void ircFormat(const char *format, ...)
 void ircClose(void);
 
 extern struct Replies {
-	size_t away;
-	size_t join;
-	size_t list;
-	size_t names;
-	size_t topic;
-	size_t whois;
+	uint away;
+	uint join;
+	uint list;
+	uint names;
+	uint topic;
+	uint whois;
 } replies;
 
-size_t execID;
+uint execID;
 int execPipe[2];
 
 void handle(struct Message msg);
-void command(size_t id, char *input);
-const char *commandIsPrivmsg(size_t id, const char *input);
-const char *commandIsNotice(size_t id, const char *input);
-const char *commandIsAction(size_t id, const char *input);
+void command(uint id, char *input);
+const char *commandIsPrivmsg(uint id, const char *input);
+const char *commandIsNotice(uint id, const char *input);
+const char *commandIsAction(uint id, const char *input);
 void commandComplete(void);
 
 int utilPipe[2];
 
 enum { UtilCap = 16 };
 struct Util {
-	size_t argc;
+	uint argc;
 	const char *argv[UtilCap];
 };
 
@@ -181,15 +182,15 @@ void uiInit(void);
 void uiShow(void);
 void uiHide(void);
 void uiDraw(void);
-void uiShowID(size_t id);
-void uiShowNum(size_t num);
-void uiMoveID(size_t id, size_t num);
-void uiCloseID(size_t id);
-void uiCloseNum(size_t id);
+void uiShowID(uint id);
+void uiShowNum(uint num);
+void uiMoveID(uint id, uint num);
+void uiCloseID(uint id);
+void uiCloseNum(uint id);
 void uiRead(void);
-void uiWrite(size_t id, enum Heat heat, const time_t *time, const char *str);
+void uiWrite(uint id, enum Heat heat, const time_t *time, const char *str);
 void uiFormat(
-	size_t id, enum Heat heat, const time_t *time, const char *format, ...
+	uint id, enum Heat heat, const time_t *time, const char *format, ...
 ) __attribute__((format(printf, 4, 5)));
 void uiLoad(const char *name);
 int uiSave(const char *name);
@@ -213,26 +214,26 @@ enum Edit {
 	EditComplete,
 	EditEnter,
 };
-void edit(size_t id, enum Edit op, wchar_t ch);
+void edit(uint id, enum Edit op, wchar_t ch);
 char *editBuffer(size_t *pos);
 
-const char *complete(size_t id, const char *prefix);
+const char *complete(uint id, const char *prefix);
 void completeAccept(void);
 void completeReject(void);
-void completeAdd(size_t id, const char *str, enum Color color);
-void completeTouch(size_t id, const char *str, enum Color color);
-void completeReplace(size_t id, const char *old, const char *new);
-void completeRemove(size_t id, const char *str);
-void completeClear(size_t id);
-size_t completeID(const char *str);
-enum Color completeColor(size_t id, const char *str);
+void completeAdd(uint id, const char *str, enum Color color);
+void completeTouch(uint id, const char *str, enum Color color);
+void completeReplace(uint id, const char *old, const char *new);
+void completeRemove(uint id, const char *str);
+void completeClear(uint id);
+uint completeID(const char *str);
+enum Color completeColor(uint id, const char *str);
 
 extern struct Util urlOpenUtil;
 extern struct Util urlCopyUtil;
-void urlScan(size_t id, const char *nick, const char *mesg);
-void urlOpenCount(size_t id, size_t count);
-void urlOpenMatch(size_t id, const char *str);
-void urlCopyMatch(size_t id, const char *str);
+void urlScan(uint id, const char *nick, const char *mesg);
+void urlOpenCount(uint id, uint count);
+void urlOpenMatch(uint id, const char *str);
+void urlCopyMatch(uint id, const char *str);
 
 FILE *configOpen(const char *path, const char *mode);
 FILE *dataOpen(const char *path, const char *mode);
diff --git a/command.c b/command.c
index 8d781f7..58d5a66 100644
--- a/command.c
+++ b/command.c
@@ -22,9 +22,9 @@
 
 #include "chat.h"
 
-typedef void Command(size_t id, char *params);
+typedef void Command(uint id, char *params);
 
-static void commandDebug(size_t id, char *params) {
+static void commandDebug(uint id, char *params) {
 	(void)id;
 	(void)params;
 	self.debug ^= true;
@@ -34,12 +34,12 @@ static void commandDebug(size_t id, char *params) {
 	);
 }
 
-static void commandQuote(size_t id, char *params) {
+static void commandQuote(uint id, char *params) {
 	(void)id;
 	if (params) ircFormat("%s\r\n", params);
 }
 
-static void commandPrivmsg(size_t id, char *params) {
+static void commandPrivmsg(uint id, char *params) {
 	if (!params || !params[0]) return;
 	ircFormat("PRIVMSG %s :%s\r\n", idNames[id], params);
 	struct Message msg = {
@@ -52,7 +52,7 @@ static void commandPrivmsg(size_t id, char *params) {
 	handle(msg);
 }
 
-static void commandNotice(size_t id, char *params) {
+static void commandNotice(uint id, char *params) {
 	if (!params || !params[0]) return;
 	ircFormat("NOTICE %s :%s\r\n", idNames[id], params);
 	struct Message msg = {
@@ -65,21 +65,21 @@ static void commandNotice(size_t id, char *params) {
 	handle(msg);
 }
 
-static void commandMe(size_t id, char *params) {
+static void commandMe(uint id, char *params) {
 	char buf[512];
 	snprintf(buf, sizeof(buf), "\1ACTION %s\1", (params ? params : ""));
 	commandPrivmsg(id, buf);
 }
 
-static void commandMsg(size_t id, char *params) {
+static void commandMsg(uint id, char *params) {
 	(void)id;
 	char *nick = strsep(&params, " ");
 	if (!params) return;
 	commandPrivmsg(idFor(nick), params);
 }
 
-static void commandJoin(size_t id, char *params) {
-	size_t count = 1;
+static void commandJoin(uint id, char *params) {
+	uint count = 1;
 	if (params) {
 		for (char *ch = params; *ch && *ch != ' '; ++ch) {
 			if (*ch == ',') count++;
@@ -91,7 +91,7 @@ static void commandJoin(size_t id, char *params) {
 	replies.names += count;
 }
 
-static void commandPart(size_t id, char *params) {
+static void commandPart(uint id, char *params) {
 	if (params) {
 		ircFormat("PART %s :%s\r\n", idNames[id], params);
 	} else {
@@ -99,18 +99,18 @@ static void commandPart(size_t id, char *params) {
 	}
 }
 
-static void commandQuit(size_t id, char *params) {
+static void commandQuit(uint id, char *params) {
 	(void)id;
 	set(&self.quit, (params ? params : "Goodbye"));
 }
 
-static void commandNick(size_t id, char *params) {
+static void commandNick(uint id, char *params) {
 	(void)id;
 	if (!params) return;
 	ircFormat("NICK :%s\r\n", params);
 }
 
-static void commandAway(size_t id, char *params) {
+static void commandAway(uint id, char *params) {
 	(void)id;
 	if (params) {
 		ircFormat("AWAY :%s\r\n", params);
@@ -120,7 +120,7 @@ static void commandAway(size_t id, char *params) {
 	replies.away++;
 }
 
-static void commandTopic(size_t id, char *params) {
+static void commandTopic(uint id, char *params) {
 	if (params) {
 		ircFormat("TOPIC %s :%s\r\n", idNames[id], params);
 	} else {
@@ -129,19 +129,19 @@ static void commandTopic(size_t id, char *params) {
 	}
 }
 
-static void commandNames(size_t id, char *params) {
+static void commandNames(uint id, char *params) {
 	(void)params;
 	ircFormat("NAMES :%s\r\n", idNames[id]);
 	replies.names++;
 }
 
-static void commandInvite(size_t id, char *params) {
+static void commandInvite(uint id, char *params) {
 	if (!params) return;
 	char *nick = strsep(&params, " ");
 	ircFormat("INVITE %s %s\r\n", nick, idNames[id]);
 }
 
-static void commandKick(size_t id, char *params) {
+static void commandKick(uint id, char *params) {
 	if (!params) return;
 	char *nick = strsep(&params, " ");
 	if (params) {
@@ -151,7 +151,7 @@ static void commandKick(size_t id, char *params) {
 	}
 }
 
-static void commandList(size_t id, char *params) {
+static void commandList(uint id, char *params) {
 	(void)id;
 	if (params) {
 		ircFormat("LIST :%s\r\n", params);
@@ -161,33 +161,33 @@ static void commandList(size_t id, char *params) {
 	replies.list++;
 }
 
-static void commandWhois(size_t id, char *params) {
+static void commandWhois(uint id, char *params) {
 	(void)id;
 	if (!params) return;
 	ircFormat("WHOIS :%s\r\n", params);
 	replies.whois++;
 }
 
-static void commandNS(size_t id, char *params) {
+static void commandNS(uint id, char *params) {
 	(void)id;
 	if (!params) return;
 	ircFormat("PRIVMSG NickServ :%s\r\n", params);
 }
 
-static void commandCS(size_t id, char *params) {
+static void commandCS(uint id, char *params) {
 	(void)id;
 	if (!params) return;
 	ircFormat("PRIVMSG ChanServ :%s\r\n", params);
 }
 
-static void commandQuery(size_t id, char *params) {
+static void commandQuery(uint id, char *params) {
 	if (!params) return;
-	size_t query = idFor(params);
+	uint query = idFor(params);
 	idColors[query] = completeColor(id, params);
 	uiShowID(query);
 }
 
-static void commandWindow(size_t id, char *params) {
+static void commandWindow(uint id, char *params) {
 	if (!params) return;
 	if (isdigit(params[0])) {
 		uiShowNum(strtoul(params, NULL, 10));
@@ -197,7 +197,7 @@ static void commandWindow(size_t id, char *params) {
 	}
 }
 
-static void commandMove(size_t id, char *params) {
+static void commandMove(uint id, char *params) {
 	if (!params) return;
 	char *name = strsep(&params, " ");
 	if (params) {
@@ -208,7 +208,7 @@ static void commandMove(size_t id, char *params) {
 	}
 }
 
-static void commandClose(size_t id, char *params) {
+static void commandClose(uint id, char *params) {
 	if (!params) {
 		uiCloseID(id);
 	} else if (isdigit(params[0])) {
@@ -219,7 +219,7 @@ static void commandClose(size_t id, char *params) {
 	}
 }
 
-static void commandOpen(size_t id, char *params) {
+static void commandOpen(uint id, char *params) {
 	if (!params) {
 		urlOpenCount(id, 1);
 	} else if (isdigit(params[0])) {
@@ -229,11 +229,11 @@ static void commandOpen(size_t id, char *params) {
 	}
 }
 
-static void commandCopy(size_t id, char *params) {
+static void commandCopy(uint id, char *params) {
 	urlCopyMatch(id, params);
 }
 
-static void commandExec(size_t id, char *params) {
+static void commandExec(uint id, char *params) {
 	execID = id;
 
 	pid_t pid = fork();
@@ -251,7 +251,7 @@ static void commandExec(size_t id, char *params) {
 	_exit(EX_UNAVAILABLE);
 }
 
-static void commandHelp(size_t id, char *params) {
+static void commandHelp(uint id, char *params) {
 	(void)id;
 	uiHide();
 
@@ -306,7 +306,7 @@ static int compar(const void *cmd, const void *_handler) {
 	return strcmp(cmd, handler->cmd);
 }
 
-const char *commandIsPrivmsg(size_t id, const char *input) {
+const char *commandIsPrivmsg(uint id, const char *input) {
 	if (id == Network || id == Debug) return NULL;
 	if (input[0] != '/') return input;
 	const char *space = strchr(&input[1], ' ');
@@ -315,19 +315,19 @@ const char *commandIsPrivmsg(size_t id, const char *input) {
 	return NULL;
 }
 
-const char *commandIsNotice(size_t id, const char *input) {
+const char *commandIsNotice(uint id, const char *input) {
 	if (id == Network || id == Debug) return NULL;
 	if (strncmp(input, "/notice ", 8)) return NULL;
 	return &input[8];
 }
 
-const char *commandIsAction(size_t id, const char *input) {
+const char *commandIsAction(uint id, const char *input) {
 	if (id == Network || id == Debug) return NULL;
 	if (strncmp(input, "/me ", 4)) return NULL;
 	return &input[4];
 }
 
-void command(size_t id, char *input) {
+void command(uint id, char *input) {
 	if (id == Debug && input[0] != '/') {
 		commandQuote(id, input);
 	} else if (commandIsPrivmsg(id, input)) {
diff --git a/complete.c b/complete.c
index 041aade..b65d870 100644
--- a/complete.c
+++ b/complete.c
@@ -23,14 +23,14 @@
 #include "chat.h"
 
 struct Node {
-	size_t id;
+	uint id;
 	char *str;
 	enum Color color;
 	struct Node *prev;
 	struct Node *next;
 };
 
-static struct Node *alloc(size_t id, const char *str, enum Color color) {
+static struct Node *alloc(uint id, const char *str, enum Color color) {
 	struct Node *node = malloc(sizeof(*node));
 	if (!node) err(EX_OSERR, "malloc");
 	node->id = id;
@@ -73,31 +73,31 @@ static struct Node *append(struct Node *node) {
 	return node;
 }
 
-static struct Node *find(size_t id, const char *str) {
+static struct Node *find(uint id, const char *str) {
 	for (struct Node *node = head; node; node = node->next) {
 		if (node->id == id && !strcmp(node->str, str)) return node;
 	}
 	return NULL;
 }
 
-void completeAdd(size_t id, const char *str, enum Color color) {
+void completeAdd(uint id, const char *str, enum Color color) {
 	if (!find(id, str)) append(alloc(id, str, color));
 }
 
-void completeTouch(size_t id, const char *str, enum Color color) {
+void completeTouch(uint id, const char *str, enum Color color) {
 	struct Node *node = find(id, str);
 	if (node && node->color != color) node->color = color;
 	prepend(node ? detach(node) : alloc(id, str, color));
 }
 
-enum Color completeColor(size_t id, const char *str) {
+enum Color completeColor(uint id, const char *str) {
 	struct Node *node = find(id, str);
 	return (node ? node->color : Default);
 }
 
 static struct Node *match;
 
-const char *complete(size_t id, const char *prefix) {
+const char *complete(uint id, const char *prefix) {
 	for (match = (match ? match->next : head); match; match = match->next) {
 		if (match->id && match->id != id) continue;
 		if (strncasecmp(match->str, prefix, strlen(prefix))) continue;
@@ -115,14 +115,14 @@ void completeReject(void) {
 	match = NULL;
 }
 
-size_t completeID(const char *str) {
+uint completeID(const char *str) {
 	for (match = (match ? match->next : head); match; match = match->next) {
 		if (match->id && !strcmp(match->str, str)) return match->id;
 	}
 	return None;
 }
 
-void completeReplace(size_t id, const char *old, const char *new) {
+void completeReplace(uint id, const char *old, const char *new) {
 	struct Node *next = NULL;
 	for (struct Node *node = head; node; node = next) {
 		next = node->next;
@@ -136,7 +136,7 @@ void completeReplace(size_t id, const char *old, const char *new) {
 	}
 }
 
-void completeRemove(size_t id, const char *str) {
+void completeRemove(uint id, const char *str) {
 	struct Node *next = NULL;
 	for (struct Node *node = head; node; node = next) {
 		next = node->next;
@@ -149,7 +149,7 @@ void completeRemove(size_t id, const char *str) {
 	}
 }
 
-void completeClear(size_t id) {
+void completeClear(uint id) {
 	struct Node *next = NULL;
 	for (struct Node *node = head; node; node = next) {
 		next = node->next;
diff --git a/edit.c b/edit.c
index 997feed..a0ec333 100644
--- a/edit.c
+++ b/edit.c
@@ -78,7 +78,7 @@ static struct {
 	size_t len;
 } tab;
 
-static void tabComplete(size_t id) {
+static void tabComplete(uint id) {
 	if (!tab.len) {
 		tab.pos = pos;
 		while (tab.pos && buf[tab.pos - 1] != L' ') tab.pos--;
@@ -142,7 +142,7 @@ static void tabReject(void) {
 	tab.len = 0;
 }
 
-void edit(size_t id, enum Edit op, wchar_t ch) {
+void edit(uint id, enum Edit op, wchar_t ch) {
 	size_t init = pos;
 	switch (op) {
 		break; case EditHead: pos = 0;
diff --git a/handle.c b/handle.c
index f407fa5..c012261 100644
--- a/handle.c
+++ b/handle.c
@@ -63,15 +63,15 @@ static const char *capList(enum Cap caps) {
 	return buf;
 }
 
-static void require(struct Message *msg, bool origin, size_t len) {
+static void require(struct Message *msg, bool origin, uint len) {
 	if (origin) {
 		if (!msg->nick) errx(EX_PROTOCOL, "%s missing origin", msg->cmd);
 		if (!msg->user) msg->user = msg->nick;
 		if (!msg->host) msg->host = msg->user;
 	}
-	for (size_t i = 0; i < len; ++i) {
+	for (uint i = 0; i < len; ++i) {
 		if (msg->params[i]) continue;
-		errx(EX_PROTOCOL, "%s missing parameter %zu", msg->cmd, 1 + i);
+		errx(EX_PROTOCOL, "%s missing parameter %u", msg->cmd, 1 + i);
 	}
 }
 
@@ -195,7 +195,7 @@ static void handleReplyWelcome(struct Message *msg) {
 	set(&self.nick, msg->params[0]);
 	completeTouch(Network, self.nick, Default);
 	if (self.join) {
-		size_t count = 1;
+		uint count = 1;
 		for (const char *ch = self.join; *ch && *ch != ' '; ++ch) {
 			if (*ch == ',') count++;
 		}
@@ -207,7 +207,7 @@ static void handleReplyWelcome(struct Message *msg) {
 }
 
 static void handleReplyISupport(struct Message *msg) {
-	for (size_t i = 1; i < ParamCap; ++i) {
+	for (uint i = 1; i < ParamCap; ++i) {
 		if (!msg->params[i]) break;
 		char *key = strsep(&msg->params[i], "=");
 		if (!msg->params[i]) continue;
@@ -245,7 +245,7 @@ static void handleReplyMOTD(struct Message *msg) {
 
 static void handleJoin(struct Message *msg) {
 	require(msg, true, 1);
-	size_t id = idFor(msg->params[0]);
+	uint id = idFor(msg->params[0]);
 	if (!strcmp(msg->nick, self.nick)) {
 		if (!self.user) {
 			set(&self.user, msg->user);
@@ -275,7 +275,7 @@ static void handleJoin(struct Message *msg) {
 
 static void handlePart(struct Message *msg) {
 	require(msg, true, 1);
-	size_t id = idFor(msg->params[0]);
+	uint id = idFor(msg->params[0]);
 	if (!strcmp(msg->nick, self.nick)) {
 		completeClear(id);
 	}
@@ -292,7 +292,7 @@ static void handlePart(struct Message *msg) {
 
 static void handleKick(struct Message *msg) {
 	require(msg, true, 2);
-	size_t id = idFor(msg->params[0]);
+	uint id = idFor(msg->params[0]);
 	bool kicked = !strcmp(msg->params[1], self.nick);
 	completeTouch(id, msg->nick, hash(msg->user));
 	urlScan(id, msg->nick, msg->params[2]);
@@ -316,7 +316,7 @@ static void handleNick(struct Message *msg) {
 		set(&self.nick, msg->params[0]);
 		uiRead(); // Update prompt.
 	}
-	size_t id;
+	uint id;
 	while (None != (id = completeID(msg->nick))) {
 		if (!strcmp(idNames[id], msg->nick)) {
 			set(&idNames[id], msg->params[0]);
@@ -332,7 +332,7 @@ static void handleNick(struct Message *msg) {
 
 static void handleQuit(struct Message *msg) {
 	require(msg, true, 0);
-	size_t id;
+	uint id;
 	while (None != (id = completeID(msg->nick))) {
 		urlScan(id, msg->nick, msg->params[0]);
 		uiFormat(
@@ -348,7 +348,7 @@ static void handleQuit(struct Message *msg) {
 
 static void handleReplyNames(struct Message *msg) {
 	require(msg, false, 4);
-	size_t id = idFor(msg->params[2]);
+	uint id = idFor(msg->params[2]);
 	char buf[1024];
 	size_t len = 0;
 	while (msg->params[3]) {
@@ -394,7 +394,7 @@ static void handleReplyTopic(struct Message *msg) {
 	require(msg, false, 3);
 	if (!replies.topic) return;
 	replies.topic--;
-	size_t id = idFor(msg->params[1]);
+	uint id = idFor(msg->params[1]);
 	urlScan(id, NULL, msg->params[2]);
 	uiFormat(
 		id, Cold, tagTime(msg),
@@ -405,7 +405,7 @@ static void handleReplyTopic(struct Message *msg) {
 
 static void handleTopic(struct Message *msg) {
 	require(msg, true, 2);
-	size_t id = idFor(msg->params[0]);
+	uint id = idFor(msg->params[0]);
 	if (msg->params[1][0]) {
 		urlScan(id, msg->nick, msg->params[1]);
 		uiFormat(
@@ -560,7 +560,7 @@ static void handleReplyEndOfWhois(struct Message *msg) {
 static void handleReplyAway(struct Message *msg) {
 	require(msg, false, 3);
 	// Might be part of a WHOIS response.
-	size_t id;
+	uint id;
 	if (completeColor(Network, msg->params[1]) != Default) {
 		id = Network;
 	} else {
@@ -602,7 +602,7 @@ static bool isMention(const struct Message *msg) {
 	return false;
 }
 
-static const char *colorMentions(size_t id, struct Message *msg) {
+static const char *colorMentions(uint id, struct Message *msg) {
 	char *split = strchr(msg->params[1], ':');
 	if (!split) {
 		split = strchr(msg->params[1], ' ');
@@ -650,7 +650,7 @@ static void handlePrivmsg(struct Message *msg) {
 	bool query = !strchr(network.chanTypes, msg->params[0][0]);
 	bool server = strchr(msg->nick, '.');
 	bool mine = !strcmp(msg->nick, self.nick);
-	size_t id;
+	uint id;
 	if (query && server) {
 		id = Network;
 	} else if (query && !mine) {
diff --git a/irc.c b/irc.c
index dd36f10..704caa6 100644
--- a/irc.c
+++ b/irc.c
@@ -220,7 +220,7 @@ static struct Message parse(char *line) {
 		while (tags) {
 			char *tag = strsep(&tags, ";");
 			char *key = strsep(&tag, "=");
-			for (size_t i = 0; i < TagCap; ++i) {
+			for (uint i = 0; i < TagCap; ++i) {
 				if (strcmp(key, TagNames[i])) continue;
 				unescape(tag);
 				msg.tags[i] = tag;
@@ -237,7 +237,7 @@ static struct Message parse(char *line) {
 	}
 
 	msg.cmd = strsep(&line, " ");
-	for (size_t i = 0; line && i < ParamCap; ++i) {
+	for (uint i = 0; line && i < ParamCap; ++i) {
 		if (line[0] == ':') {
 			msg.params[i] = &line[1];
 			break;
diff --git a/ui.c b/ui.c
index 9cfc2eb..c39e6c3 100644
--- a/ui.c
+++ b/ui.c
@@ -78,31 +78,31 @@ static const char *bufferLine(const struct Buffer *buffer, size_t i) {
 
 enum { WindowLines = BufferCap };
 struct Window {
-	size_t id;
+	uint id;
 	struct Buffer buffer;
 	WINDOW *pad;
 	int scroll;
 	bool mark;
 	enum Heat heat;
-	int unreadTotal;
-	int unreadWarm;
-	int unreadLines;
+	uint unreadTotal;
+	uint unreadWarm;
+	uint unreadLines;
 };
 
 static struct {
-	size_t show;
-	size_t swap;
+	uint show;
+	uint swap;
 	struct Window *ptrs[IDCap];
-	size_t len;
+	uint len;
 } windows;
 
-static size_t windowPush(struct Window *window) {
+static uint windowPush(struct Window *window) {
 	assert(windows.len < IDCap);
 	windows.ptrs[windows.len] = window;
 	return windows.len++;
 }
 
-static size_t windowInsert(size_t num, struct Window *window) {
+static uint windowInsert(uint num, struct Window *window) {
 	assert(windows.len < IDCap);
 	assert(num <= windows.len);
 	memmove(
@@ -115,7 +115,7 @@ static size_t windowInsert(size_t num, struct Window *window) {
 	return num;
 }
 
-static struct Window *windowRemove(size_t num) {
+static struct Window *windowRemove(uint num) {
 	assert(num < windows.len);
 	struct Window *window = windows.ptrs[num];
 	windows.len--;
@@ -127,8 +127,8 @@ static struct Window *windowRemove(size_t num) {
 	return window;
 }
 
-static size_t windowFor(size_t id) {
-	for (size_t num = 0; num < windows.len; ++num) {
+static uint windowFor(uint id) {
+	for (uint num = 0; num < windows.len; ++num) {
 		if (windows.ptrs[num]->id == id) return num;
 	}
 
@@ -403,7 +403,7 @@ static void statusUpdate(void) {
 	enum Heat otherHeat = Cold;
 	wmove(status, 0, 0);
 
-	for (size_t num = 0; num < windows.len; ++num) {
+	for (uint num = 0; num < windows.len; ++num) {
 		const struct Window *window = windows.ptrs[num];
 		if (!window->heat && num != windows.show) continue;
 		if (num != windows.show) {
@@ -413,7 +413,7 @@ static void statusUpdate(void) {
 		int trunc;
 		char buf[256];
 		snprintf(
-			buf, sizeof(buf), "\3%d%s %zu %s %n(\3%02d%d\3%d) ",
+			buf, sizeof(buf), "\3%d%s %u %s %n(\3%02d%d\3%d) ",
 			idColors[window->id], (num == windows.show ? "\26" : ""),
 			num, idNames[window->id],
 			&trunc, (window->heat > Warm ? White : idColors[window->id]),
@@ -555,7 +555,7 @@ static int wordWrap(WINDOW *win, const char *str) {
 }
 
 struct Util uiNotifyUtil;
-static void notify(size_t id, const char *str) {
+static void notify(uint id, const char *str) {
 	if (!uiNotifyUtil.argc) return;
 
 	struct Util util = uiNotifyUtil;
@@ -583,7 +583,7 @@ static void notify(size_t id, const char *str) {
 	_exit(EX_CONFIG);
 }
 
-void uiWrite(size_t id, enum Heat heat, const time_t *src, const char *str) {
+void uiWrite(uint id, enum Heat heat, const time_t *src, const char *str) {
 	struct Window *window = windows.ptrs[windowFor(id)];
 	time_t clock = (src ? *src : time(NULL));
 	bufferPush(&window->buffer, clock, str);
@@ -609,7 +609,7 @@ void uiWrite(size_t id, enum Heat heat, const time_t *src, const char *str) {
 }
 
 void uiFormat(
-	size_t id, enum Heat heat, const time_t *time, const char *format, ...
+	uint id, enum Heat heat, const time_t *time, const char *format, ...
 ) {
 	char buf[1024];
 	va_list ap;
@@ -641,7 +641,7 @@ static void resize(void) {
 	int height, width;
 	getmaxyx(windows.ptrs[0]->pad, height, width);
 	if (width == COLS) return;
-	for (size_t num = 0; num < windows.len; ++num) {
+	for (uint num = 0; num < windows.len; ++num) {
 		wresize(windows.ptrs[num]->pad, BufferCap, COLS);
 		reflow(windows.ptrs[num]);
 	}
@@ -715,7 +715,7 @@ static void inputAdd(struct Style *style, const char *str) {
 }
 
 static void inputUpdate(void) {
-	size_t id = windows.ptrs[windows.show]->id;
+	uint id = windows.ptrs[windows.show]->id;
 	size_t pos;
 	char *buf = editBuffer(&pos);
 
@@ -768,7 +768,7 @@ static void inputUpdate(void) {
 	wmove(input, y, x);
 }
 
-static void windowShow(size_t num) {
+static void windowShow(uint num) {
 	touchwin(windows.ptrs[num]->pad);
 	windows.swap = windows.show;
 	windows.show = num;
@@ -777,15 +777,15 @@ static void windowShow(size_t num) {
 	inputUpdate();
 }
 
-void uiShowID(size_t id) {
+void uiShowID(uint id) {
 	windowShow(windowFor(id));
 }
 
-void uiShowNum(size_t num) {
+void uiShowNum(uint num) {
 	if (num < windows.len) windowShow(num);
 }
 
-void uiMoveID(size_t id, size_t num) {
+void uiMoveID(uint id, uint num) {
 	struct Window *window = windowRemove(windowFor(id));
 	if (num < windows.len) {
 		windowShow(windowInsert(num, window));
@@ -794,7 +794,7 @@ void uiMoveID(size_t id, size_t num) {
 	}
 }
 
-static void windowClose(size_t num) {
+static void windowClose(uint num) {
 	if (windows.ptrs[num]->id == Network) return;
 	struct Window *window = windowRemove(num);
 	completeClear(window->id);
@@ -809,26 +809,26 @@ static void windowClose(size_t num) {
 	statusUpdate();
 }
 
-void uiCloseID(size_t id) {
+void uiCloseID(uint id) {
 	windowClose(windowFor(id));
 }
 
-void uiCloseNum(size_t num) {
+void uiCloseNum(uint num) {
 	if (num < windows.len) windowClose(num);
 }
 
 static void showAuto(void) {
-	static size_t swap;
+	static uint swap;
 	if (windows.swap != swap) {
 		swap = windows.show;
 	}
-	for (size_t num = 0; num < windows.len; ++num) {
+	for (uint num = 0; num < windows.len; ++num) {
 		if (windows.ptrs[num]->heat < Hot) continue;
 		windowShow(num);
 		windows.swap = swap;
 		return;
 	}
-	for (size_t num = 0; num < windows.len; ++num) {
+	for (uint num = 0; num < windows.len; ++num) {
 		if (windows.ptrs[num]->heat < Warm) continue;
 		windowShow(num);
 		windows.swap = swap;
@@ -839,7 +839,7 @@ static void showAuto(void) {
 
 static void keyCode(int code) {
 	struct Window *window = windows.ptrs[windows.show];
-	size_t id = window->id;
+	uint id = window->id;
 	switch (code) {
 		break; case KEY_RESIZE:  resize();
 		break; case KeyFocusIn:  unmark(window);
@@ -880,7 +880,7 @@ static void keyCode(int code) {
 
 static void keyCtrl(wchar_t ch) {
 	struct Window *window = windows.ptrs[windows.show];
-	size_t id = window->id;
+	uint id = window->id;
 	switch (ch ^ L'@') {
 		break; case L'?': edit(id, EditDeletePrev, 0);
 		break; case L'A': edit(id, EditHead, 0);
@@ -906,7 +906,7 @@ static void keyCtrl(wchar_t ch) {
 }
 
 static void keyStyle(wchar_t ch) {
-	size_t id = windows.ptrs[windows.show]->id;
+	uint id = windows.ptrs[windows.show]->id;
 	switch (iswcntrl(ch) ? ch ^ L'@' : (wchar_t)towupper(ch)) {
 		break; case L'B': edit(id, EditInsert, B);
 		break; case L'C': edit(id, EditInsert, C);
@@ -973,7 +973,7 @@ int uiSave(const char *name) {
 	if (!file) return -1;
 
 	if (writeTime(file, Signatures[1])) return -1;
-	for (size_t num = 0; num < windows.len; ++num) {
+	for (uint num = 0; num < windows.len; ++num) {
 		const struct Window *window = windows.ptrs[num];
 		if (writeString(file, idNames[window->id])) return -1;
 		if (writeTime(file, window->heat)) return -1;
diff --git a/url.c b/url.c
index 43c2ee9..64fdd8b 100644
--- a/url.c
+++ b/url.c
@@ -59,7 +59,7 @@ static void compile(void) {
 }
 
 struct URL {
-	size_t id;
+	uint id;
 	char *nick;
 	char *url;
 };
@@ -71,7 +71,7 @@ static struct {
 } ring;
 static_assert(!(Cap & (Cap - 1)), "Cap is power of two");
 
-static void push(size_t id, const char *nick, const char *str, size_t len) {
+static void push(uint id, const char *nick, const char *str, size_t len) {
 	struct URL *url = &ring.urls[ring.len++ % Cap];
 	free(url->nick);
 	free(url->url);
@@ -85,7 +85,7 @@ static void push(size_t id, const char *nick, const char *str, size_t len) {
 	if (!url->url) err(EX_OSERR, "strndup");
 }
 
-void urlScan(size_t id, const char *nick, const char *mesg) {
+void urlScan(uint id, const char *nick, const char *mesg) {
 	if (!mesg) return;
 	compile();
 	regmatch_t match = {0};
@@ -175,8 +175,8 @@ static void urlCopy(const char *url) {
 	_exit(EX_CONFIG);
 }
 
-void urlOpenCount(size_t id, size_t count) {
-	for (size_t i = 1; i <= Cap; ++i) {
+void urlOpenCount(uint id, uint count) {
+	for (uint i = 1; i <= Cap; ++i) {
 		const struct URL *url = &ring.urls[(ring.len - i) % Cap];
 		if (!url->url) break;
 		if (url->id != id) continue;
@@ -185,8 +185,8 @@ void urlOpenCount(size_t id, size_t count) {
 	}
 }
 
-void urlOpenMatch(size_t id, const char *str) {
-	for (size_t i = 1; i <= Cap; ++i) {
+void urlOpenMatch(uint id, const char *str) {
+	for (uint i = 1; i <= Cap; ++i) {
 		const struct URL *url = &ring.urls[(ring.len - i) % Cap];
 		if (!url->url) break;
 		if (url->id != id) continue;
@@ -197,8 +197,8 @@ void urlOpenMatch(size_t id, const char *str) {
 	}
 }
 
-void urlCopyMatch(size_t id, const char *str) {
-	for (size_t i = 1; i <= Cap; ++i) {
+void urlCopyMatch(uint id, const char *str) {
+	for (uint i = 1; i <= Cap; ++i) {
 		const struct URL *url = &ring.urls[(ring.len - i) % Cap];
 		if (!url->url) break;
 		if (url->id != id) continue;