about summary refs log tree commit diff
path: root/message.c
diff options
context:
space:
mode:
Diffstat (limited to 'message.c')
-rw-r--r--message.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/message.c b/message.c
new file mode 100644
index 0000000..f394ff7
--- /dev/null
+++ b/message.c
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2026 Nakidai Perumenei <nakidai at disroot dot org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "ircd.h"
+
+#include <stddef.h>
+#include <string.h>
+
+
+int
+parse_message(char *buf, struct Message *msg)
+{
+	char *t, *next;
+	size_t i;
+
+	memset(msg, 0, sizeof(*msg));
+
+	if (*buf == ':')
+	{
+		t = ++buf;
+		next = strchr(buf, ' ');
+		if (!next)
+			return 1;
+		*next++ = 0;
+		buf = next;
+
+		next = strchr(t, '@');
+		if (next)
+		{
+			*next++ = 0;
+			if (!*t)
+				return 1;
+
+			msg->nick = t;
+			t = next;
+
+			next = strchr(msg->nick, '!');
+			if (next)
+			{
+				*next++ = 0;
+				if (!*msg->nick || !*next)
+					return 1;
+				msg->user = next;
+			}
+		}
+		if (!*t)
+			return 1;
+		msg->host = t;
+	}
+
+	msg->command = buf;
+	t = strstr(buf, " :");
+	if (t)
+		*((t += 2) - 2) = 0;
+	for (i = 0; i < PARAM_MAX - !!t; ++i, buf = next)
+	{
+		next = strchr(buf, ' ');
+		if (!next)
+			break;
+		*next++ = 0;
+		msg->params[i] = next;
+	}
+	if (strchr(buf, ' '))
+		return 1;
+	if (t)
+		msg->params[i] = t;
+	return 0;
+}