ref: e57fc06379d7784bf90fadc8ac4440e2d2b2270b
dir: /irc.c/
#include <u.h>
#include <libc.h>
#include "dat.h"
static int
ircprefix(Ircmsg *irc)
{
char *p;
irc->nick = nil;
irc->user = nil;
irc->host = nil;
irc->prebuf[0] = 0;
if(irc->pre == nil)
return -1;
snprint(irc->prebuf, sizeof(irc->prebuf), "%s", irc->pre);
irc->nick = irc->prebuf;
for(p = irc->prebuf; *p != 0; p++){
if(*p == '@'){
*p = 0;
irc->host = p+1;
break;
}
if(irc->user == nil && *p == '!'){
*p = 0;
irc->user = p+1;
}
}
return 0;
}
int
ircparse(Ircmsg *irc, char *msg)
{
int i;
char *p;
snprint(irc->buf, sizeof(irc->buf), "%s", msg);
irc->pre = nil;
irc->cmd = nil;
for(i = 0; i < 15; i++)
irc->par[i] = nil;
irc->trail = nil;
irc->npar = 0;
i = 0;
p = irc->buf;
if(*p == ':')
irc->pre = ++p;
else
irc->cmd = p;
for(; *p != 0; p++){
if(*p == ' '){
*p = 0;
if(irc->cmd == nil)
irc->cmd = p+1;
else {
if(i == 14 || *(p+1) == ':'){
if(*(p+1) == ':')
irc->trail = p+2;
else
irc->trail = p+1;
irc->par[i++] = irc->trail;
break;
}
irc->par[i++] = p+1;
}
}
}
assert(irc->trail == nil || irc->trail == irc->par[i-1]);
irc->npar = i;
ircprefix(irc);
return 0;
}
void
ircprint(Ircmsg *irc)
{
int i;
fprint(2, "pre=%s cmd=%s", irc->pre, irc->cmd);
for(i = 0; i < irc->npar; i++)
fprint(2, " par[%d]=%s", i, irc->par[i]);
fprint(2, " trail=%s\n", irc->trail != nil ? "y" : "n");
}
int
ircischan(char *target)
{
return target != nil && target[0] == '#';
}