change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
#include "irc_cmd.h"
#include <stdlib.h>
#include <string.h>
void irc_cmd_init (irc_cmd_handlers_t *handlers)
{
CHAIN_INIT(handlers);
}
err_t irc_cmd_add (irc_cmd_handlers_t *handlers, const struct irc_cmd_handler *list, void *arg)
{
return chain_add(handlers, list, arg);
}
void irc_cmd_invoke (irc_cmd_handlers_t *handlers, const struct irc_line *line)
{
struct chain_head *head;
const struct irc_cmd_handler *handler;
CHAIN_FOREACH(handlers, head) {
// look up appropriate handler
for (handler = head->chain; handler->command; handler++) {
// the command is alpha-only, so normal case-insensitive cmp is fine
if (strcasecmp(handler->command, line->command) == 0) {
// invoke the func
handler->func(line, head->arg);
// ...only one per chain
break;
}
}
}
}
void irc_cmd_free (irc_cmd_handlers_t *handlers)
{
chain_free(handlers);
}