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 "chain.h"
#include <stdlib.h>
err_t chain_add (struct chain_list *list, const void *chain, void *arg)
{
struct chain_head *item;
// allocate the chain item
if ((item = calloc(1, sizeof(*item))) == NULL)
return ERR_CALLOC;
// store
item->chain = chain;
item->arg = arg;
// append
STAILQ_INSERT_TAIL(list, item, node);
// ok
return SUCCESS;
}
void chain_free (struct chain_list *list)
{
// start from the first item
struct chain_head *next = STAILQ_FIRST(list);
// clean up any handler chains
while (next) {
struct chain_head *node = next;
// update next
next = STAILQ_NEXT(node, node);
// free
free(node);
}
}