src/chain.c
author Tero Marttila <terom@fixme.fi>
Thu, 12 Mar 2009 18:07:47 +0200
changeset 35 3715247e8f5a
child 69 6f298b6e0d5f
permissions -rw-r--r--
add a kind of semi-generic chain-list implementation
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
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
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
    25
{
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    // start from the first item
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    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
    28
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    // clean up any handler chains
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    while (next) {
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        struct chain_head *node = next;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
        // update next
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
        next = STAILQ_NEXT(node, node);
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        // free
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        free(node);
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    }
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
}