src/chain.c
author Tero Marttila <terom@fixme.fi>
Mon, 04 May 2009 20:55:04 +0300
branchnew-transport
changeset 168 a58ad50911fc
parent 69 6f298b6e0d5f
child 171 b54f393c3df0
permissions -rw-r--r--
refactor test.c into tests/*
35
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "chain.h"
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <stdlib.h>
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
err_t chain_add (struct chain_list *list, const void *chain, void *arg)
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
{
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
    struct chain_head *item;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
    // allocate the chain item
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    if ((item = calloc(1, sizeof(*item))) == NULL)
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
        return ERR_CALLOC;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    // store
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    item->chain = chain;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    item->arg = arg;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    // append
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    STAILQ_INSERT_TAIL(list, item, node);
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    // ok
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    return SUCCESS;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
}
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
69
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    24
void chain_remove (struct chain_list *list, const void *chain, void *arg)
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    25
{
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    26
    struct chain_head *item;
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    27
    
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    28
    // look for it
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    29
    CHAIN_FOREACH(list, item) {
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    30
        if (item->chain == chain && item->arg == arg) {
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    31
            // remove it
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    32
            // XXX: use TAILQ instead?
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    33
            STAILQ_REMOVE(list, item, chain_head, node);
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    34
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    35
            // free it
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    36
            free(item);
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    37
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    38
            // ok
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    39
            return;
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    40
        }
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    41
    }
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    42
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    43
    // not found... ignore
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    44
}
6f298b6e0d5f create irc_log_chan function to log a new irc_log_chan, and irc_log_chan_destroy to remove the added callbacks/command handlers
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    45
35
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
void chain_free (struct chain_list *list)
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
{
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    // start from the first item
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    struct chain_head *next = STAILQ_FIRST(list);
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    // clean up any handler chains
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    while (next) {
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
        struct chain_head *node = next;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        // update next
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
        next = STAILQ_NEXT(node, node);
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        // free
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
        free(node);
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    }
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
}