~sircmpwn/hare-dev

This thread contains a patchset. You're looking at the original emails, but you may wish to use the patch review UI. Review patch
3 2

[PATCH hare-irc] bump language usage

Details
Message ID
<20240803140652.21676-2-contact@willowbarraco.fr>
DKIM signature
pass
Download raw message
Patch: +27 -33
- void to opaque
- void to done
- unreachable aborts

Signed-off-by: Willow Barraco <contact@willowbarraco.fr>
---
 cmd/testbot/main.ha |  4 ++--
 net/irc/client.ha   |  9 ++++-----
 net/irc/isupport.ha | 15 ++++++---------
 net/irc/message.ha  |  8 +++-----
 net/irc/state.ha    | 24 ++++++++++++------------
 5 files changed, 27 insertions(+), 33 deletions(-)

diff --git a/cmd/testbot/main.ha b/cmd/testbot/main.ha
index e09af6b..e073410 100644
--- a/cmd/testbot/main.ha
+++ b/cmd/testbot/main.ha
@@ -43,7 +43,7 @@ export fn main() void = {
	for (!(irc::dispatch(conn)! is io::EOF)) void;
};

fn logmsg(state: nullable *void, party: irc::party, msg: *irc::message) void = {
fn logmsg(state: nullable *opaque, party: irc::party, msg: *irc::message) void = {
	switch (party) {
	case irc::party::SERVER =>
		fmt::print("<= ")!;
@@ -58,7 +58,7 @@ fn logmsg(state: nullable *void, party: irc::party, msg: *irc::message) void = {
};

fn handle_privmsg(
	state: nullable *void,
	state: nullable *opaque,
	msg: const *irc::message,
) (void | irc::error) = {
	fmt::printfln("PRIVMSG from {}: {}", msg.prefix.nick, msg.params[1])!;
diff --git a/net/irc/client.ha b/net/irc/client.ha
index e4cc767..2428941 100644
--- a/net/irc/client.ha
+++ b/net/irc/client.ha
@@ -15,10 +15,10 @@ export type config = struct {
	pass: str,
	realname: str,
	logfn: nullable *logfn,
	logstate: nullable *void,
	logstate: nullable *opaque,
};

export type logfn = fn(state: nullable *void, party: party, msg: *message) void;
export type logfn = fn(state: nullable *opaque, party: party, msg: *message) void;

export type client = struct {
	conn: net::socket,
@@ -27,7 +27,7 @@ export type client = struct {
	dirty: size,
	nick: str,
	logfn: nullable *logfn,
	logstate: nullable *void,
	logstate: nullable *opaque,
	next_id: uint,
	handlers: [64][]handler,
	isupport: isupport,
@@ -171,7 +171,6 @@ export fn recv(client: *client) (message | io::EOF | error) = {
		client.dirty = end + 2;
		return msg;
	};
	abort();
};

// Performs a blocking read on the IRC connection, processes one message, and
@@ -226,7 +225,7 @@ export type party = enum {
export fn setlog(
	client: *client,
	func: nullable *logfn,
	state: nullable *void,
	state: nullable *opaque,
) void = {
	client.logfn = func;
	client.logstate = state;
diff --git a/net/irc/isupport.ha b/net/irc/isupport.ha
index 280d59d..891aba6 100644
--- a/net/irc/isupport.ha
+++ b/net/irc/isupport.ha
@@ -194,7 +194,7 @@ fn isupport_setparam(
		};
	case "CHANTYPES" =>
		free(sup.chantypes);
		sup.chantypes = strings::runes(value);
		sup.chantypes = strings::torunes(value);
	case "NETWORK" =>
		free(sup.network);
		sup.network = strings::dup(value);
@@ -202,7 +202,7 @@ fn isupport_setparam(
		free(sup.prefixes);
		let iter = strings::iter(value);
		match (strings::next(&iter)) {
		case void =>
		case done =>
			return invalid;
		case let r: rune =>
			if (r != '(') {
@@ -211,7 +211,7 @@ fn isupport_setparam(
		};
		for (true) {
			match (strings::next(&iter)) {
			case void =>
			case done =>
				return invalid;
			case let r: rune =>
				if (r == ')') {
@@ -224,21 +224,18 @@ fn isupport_setparam(
			};
		};
		for (let i = 0z; i < len(sup.prefixes); i += 1) {
			match (strings::next(&iter)) {
			case void =>
				return invalid;
			case let r: rune =>
			for (let r => strings::next(&iter)) {
				sup.prefixes[i].prefix = r;
			};
		};
		if (!(strings::next(&iter) is void)) {
		if (!(strings::next(&iter) is done)) {
			return invalid;
		};
	};
};

fn handle_isupport(
	state: nullable *void,
	state: nullable *opaque,
	msg: const *message,
) (void | error) = {
	let client = state: *client;
diff --git a/net/irc/message.ha b/net/irc/message.ha
index 6d9533a..4505157 100644
--- a/net/irc/message.ha
+++ b/net/irc/message.ha
@@ -62,7 +62,7 @@ export fn parse(in: const str) (message | invalid) = {
// will handle truncation if required.
export fn serialize(sink: io::handle, msg: *message) (size | io::error) = {
	let buf: [MAXLEN + 2]u8 = [0...];
	let sink = bufio::buffered(sink, [], buf[..]);
	let sink = bufio::init(sink, [], buf[..]);
	defer io::close(&sink)!;

	let z = 0z;
@@ -160,11 +160,10 @@ fn next(tok: *strings::tokenizer) (str | invalid) = {
			if (len(s) > 0) {
				return s;
			};
		case void =>
		case done =>
			return invalid;
		};
	};
	abort(); // Unreachable
};

fn peek(tok: *strings::tokenizer) (str | void) = {
@@ -176,9 +175,8 @@ fn peek(tok: *strings::tokenizer) (str | void) = {
			} else {
				strings::next_token(tok);
			};
		case void =>
		case done =>
			return;
		};
	};
	abort(); // Unreachable
};
diff --git a/net/irc/state.ha b/net/irc/state.ha
index 9d3f182..5a955fc 100644
--- a/net/irc/state.ha
+++ b/net/irc/state.ha
@@ -6,7 +6,7 @@ use time;

// A function which handles an incoming IRC message.
export type callback = fn(
	state: nullable *void,
	state: nullable *opaque,
	msg: const *message,
) (void | error);

@@ -14,7 +14,7 @@ export type handler = struct {
	id: uint,
	cmd: const str,
	func: *callback,
	state: nullable *void,
	state: nullable *opaque,
};

// Registers a callback for an IRC event, returning the internally assigned ID
@@ -26,7 +26,7 @@ export fn on(
	client: *client,
	cmd: const str,
	callback: *callback,
	state: nullable *void,
	state: nullable *opaque,
) uint = {
	const hash = fnv::string(cmd);
	const bucket = &client.handlers[hash % len(client.handlers)];
@@ -97,12 +97,12 @@ fn delchan(client: *client, name: str) void = {
	};
};

fn handle_ping(state: nullable *void, msg: const *message) (void | error) = {
fn handle_ping(state: nullable *opaque, msg: const *message) (void | error) = {
	let client = state: *client;
	send(client, "PONG", msg.params...)?;
};

fn handle_topic(state: nullable *void, msg: const *message) (void | error) = {
fn handle_topic(state: nullable *opaque, msg: const *message) (void | error) = {
	let client = state: *client;
	let chan = getchan(client, msg.params[1]);
	free(chan.topic);
@@ -110,7 +110,7 @@ fn handle_topic(state: nullable *void, msg: const *message) (void | error) = {
};

fn handle_topicwhotime(
	state: nullable *void,
	state: nullable *opaque,
	msg: const *message,
) (void | error) = {
	let client = state: *client;
@@ -126,7 +126,7 @@ fn handle_topicwhotime(
};

fn handle_namereply(
	state: nullable *void,
	state: nullable *opaque,
	msg: const *message,
) (void | error) = {
	let client = state: *client;
@@ -150,7 +150,7 @@ fn handle_namereply(
};

fn handle_nick(
	state: nullable *void,
	state: nullable *opaque,
	msg: const *message,
) (void | error) = {
	let client = state: *client;
@@ -173,7 +173,7 @@ fn handle_nick(
};

fn handle_join(
	state: nullable *void,
	state: nullable *opaque,
	msg: const *message,
) (void | error) = {
	let client = state: *client;
@@ -201,7 +201,7 @@ fn handle_join(
};

fn handle_part(
	state: nullable *void,
	state: nullable *opaque,
	msg: const *message,
) (void | error) = {
	let client = state: *client;
@@ -222,7 +222,7 @@ fn handle_part(
};

fn handle_kick(
	state: nullable *void,
	state: nullable *opaque,
	msg: const *message,
) (void | error) = {
	let client = state: *client;
@@ -247,7 +247,7 @@ fn handle_kick(
};

fn handle_quit(
	state: nullable *void,
	state: nullable *opaque,
	msg: const *message,
) (void | error) = {
	let client = state: *client;
-- 
2.46.0
Details
Message ID
<D370MHLLBPRM.3FCJ25N8IW5HW@cmpwn.com>
In-Reply-To
<20240803140652.21676-2-contact@willowbarraco.fr> (view parent)
DKIM signature
pass
Download raw message
Thanks! This should probably be rewritten to use hare-ev at some point.

To git@git.sr.ht:~sircmpwn/hare-irc
   c1d902a..78ba2f5  master -> master
Details
Message ID
<D370XBFQLPE4.3OLKMDUS4RZ00@willowbarraco.fr>
In-Reply-To
<D370MHLLBPRM.3FCJ25N8IW5HW@cmpwn.com> (view parent)
DKIM signature
pass
Download raw message
> Thanks! This should probably be rewritten to use hare-ev at some point.

I was giving it a try yersterday. The thing is that a basic IRC server
really looks like a TCP servers in the end. Depending on the scope of
hare-irc, we could embed some default behaviors. But parsing the
messages is the minimal denominator of "IRC talkers".

Once again, having a safer integrated read/write buffer management on
hare-ev would already be enough to start writing some IRC servers.
Details
Message ID
<D3711A3U57KD.19O4MZF00EX9J@cmpwn.com>
In-Reply-To
<D370XBFQLPE4.3OLKMDUS4RZ00@willowbarraco.fr> (view parent)
DKIM signature
pass
Download raw message
If you want to pick that bufio thread back up, get a rebased patch with
a flag to choose the appropriate behavior on the list for discussion and
I'll make sure to find some time to have it reviewed and merged.
Reply to thread Export thread (mbox)