shithub: ircd

ref: 4161df5fd7487feaf4758b93a8d8371bec433471
dir: /parse.c/

View raw version
#include <u.h>
#include <libc.h>
#include "dat.h"
#include "fns.h"

static Prefix
parseprefix(char *line, char **next)
{
	/* nick!user@host or servername */
	Prefix r;
	char *c;
	
	r.name = nil;
	r.user = nil;
	r.host = nil;
	
	/* first, find end of prefix */
	c = strchr(line, ' ');
	if (c) {
		while (*c == ' ') {
			*c = 0;
			c++;
		}
		*next = c;
	} else {
		*next = line;
		return r;
	}
	
	/* nick/servername follows ':' */
	*line = 0;
	r.name = &line[1]; /* fixed character position */
	c = r.name;
	
	/* next field: user after '!' */
	c = strchr(c, '!');
	if (c) {
		*c = 0;
		r.user = &c[1];
		c = r.user;
	} else {
		c = r.name;
	}
	
	/* next field: host after '@' */
	c = strchr(c, '@');
	if (c) {
		*c = 0;
		r.host = &c[1];
	}
	return r;
}

static void
parseargs(Request *r, char *line)
{
	char *c;
	char *trailing;
	int i, maxargs;
	
	maxargs = 15;
	c = strchr(line, ':');
	trailing = c ? &c[1] : nil;
	if (c) {
		*c = 0;
		maxargs--;
	}
	
	i = getfields(line, r->args, maxargs, 1, " ");
	r->args[i] = trailing;
}

Request
parseline(char *line)
{
	Request r;
	char *l;
	char *c;
	
	r.cmd = nil;
	r.args[0] = nil;
	r.prefix.name = nil;
	r.prefix.user = nil;
	r.prefix.host = nil;
	
	for (int i = 0; i < 15; i++) {
		r.args[i] = nil;
	}
	
	if (!line || line[0] == 0)
		return r;
	
	l = line;
	
	/* prefix */
	if (l[0] == ':') {
		r.prefix = parseprefix(l, &l);
	}
	
	/* command */
	c = strchr(l, ' ');
	if (!c) {
		r.cmd = findcommand(l);
		return r;
	}
	*c = 0;
	r.cmd = findcommand(l);
	
	l = &c[1];
	while (*l == ' ') {
		*l = 0;
		l++;
	}
	
	if (l[0])
		parseargs(&r, l);
	
	return r;
}