sic

simple irc client
git clone git://git.suckless.org/sic
Log | Files | Refs | README | LICENSE

commit cb68ce9e2c8406bd19fad4376dd024b623946d66
parent 5569a14e8edbc4e8e219b28658c7194201ed0417
Author: Anselm R. Garbe <arg@suckless.org>
Date:   Thu,  8 Feb 2007 14:51:04 +0100

some more simplifications
Diffstat:
sic.c | 78++++++++++++++++++++----------------------------------------------------------
1 file changed, 20 insertions(+), 58 deletions(-)

diff --git a/sic.c b/sic.c @@ -16,8 +16,6 @@ #define PINGTIMEOUT 300 #define MAXMSG 4096 -enum { Tnick, Tuser, Tcmd, Tchan, Targ, Ttext, Tlast }; - static char *server = "irc.oftc.net"; static unsigned short port = 6667; static char *nick = NULL; @@ -95,82 +93,46 @@ parsein(char *msg) { write(srv, bufout, strlen(bufout)); } -static unsigned int -tokenize(char **result, unsigned int reslen, char *str, char delim) { - char *p, *n; - unsigned int i = 0; - - if(!str) - return 0; - for(n = str; *n == delim; n++); - p = n; - for(i = 0; *n != 0;) { - if(i == reslen) - return i; - if(*n == delim) { - *n = 0; - if(strlen(p)) - result[i++] = p; - p = ++n; - } else - n++; - } - if((i < reslen) && (p < n) && strlen(p)) - result[i++] = p; - return i; /* number of tokens */ -} - static void parsesrv(char *msg) { - char *argv[Tlast], *cmd, *p; - int i; + char *chan, *cmd, *p, *txt, *usr; if(!msg || !(*msg)) return; - for(i = 0; i < Tlast; i++) - argv[i] = NULL; - /* <bufout> ::= [':' <prefix> <SPACE> ] <command> <params> <crlf> - * <prefix> ::= <servername> | <nick> [ '!' <user> ] [ '@' <server> ] - * <command> ::= <letter> { <letter> } | <number> <number> <number> - * <SPACE> ::= ' ' { ' ' } - * <params> ::= <SPACE> [ ':' <trailing> | <middle> <params> ] - * <middle> ::= <Any *non-empty* sequence of octets not including SPACE - * or NUL or CR or LF, the first of which may not be ':'> - * <trailing> ::= <Any, possibly *empty*, sequence of octets not including NUL or CR or LF> - * <crlf> ::= CR LF - */ if(msg[0] == ':') { /* check prefix */ - if (!(p = strchr(msg, ' '))) + if(!(p = strchr(msg, ' '))) return; *p = 0; for(++p; *p == ' '; p++); cmd = p; - argv[Tnick] = &msg[1]; - if((p = strchr(msg, '!'))) { + usr = &msg[1]; + if((p = strchr(msg, '!'))) *p = 0; - argv[Tuser] = ++p; - } } else cmd = msg; /* remove CRLFs */ for(p = cmd; p && *p != 0; p++) if(*p == '\r' || *p == '\n') *p = 0; - if((p = strchr(cmd, ':'))) { - *p = 0; - argv[Ttext] = ++p; - } - + if(!strncmp("PONG", cmd, 4)) + return; if(!strncmp("PRIVMSG", cmd, 7) || !strncmp("PING", cmd, 4)) { - if(tokenize(&argv[Tcmd], Tlast - Tcmd, cmd, ' ') != Tlast - Tcmd) + if(!(p = strchr(cmd, ' '))) return; - if(!strncmp("PRIVMSG", argv[Tcmd], 8)) { - snprintf(bufout, sizeof bufout, "<%s> %s", - argv[Tnick], argv[Ttext] ? argv[Ttext] : ""); - pout(argv[Tchan], bufout); + *p = 0; + chan = ++p; + for(; *p && *p != ' '; p++); + *p = 0; + if(!(p = strchr(++p, ':'))) + return; + *p = 0; + txt = ++p; + if(!strncmp("PRIVMSG", cmd, 8) && chan && txt) { + snprintf(bufout, sizeof bufout, "<%s> %s", usr, txt); + pout(chan, bufout); } - else if(!strncmp("PING", argv[Tcmd], 5)) { - snprintf(bufout, sizeof bufout, "PONG %s\r\n", argv[Ttext]); + else if(!strncmp("PING", cmd, 5) && txt) { + snprintf(bufout, sizeof bufout, "PONG %s\r\n", txt); write(srv, bufout, strlen(bufout)); } return;