author | Tero Marttila <terom@fixme.fi> |
Mon, 30 Mar 2009 01:31:27 +0300 | |
changeset 87 | f0db6ebf18b9 |
parent 69 | 6f298b6e0d5f |
child 171 | b54f393c3df0 |
permissions | -rw-r--r-- |
35
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
1 |
#ifndef CHAIN_H |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
2 |
#define CHAIN_H |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
3 |
|
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
4 |
/** |
87 | 5 |
* @file |
6 |
* |
|
7 |
* Defines a semi-generalized "chain of things" behaviour. |
|
35
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
8 |
* |
87 | 9 |
* The structure of this is a chain_list, which contains a number of chain_head items, which then contain a number of |
35
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
10 |
* induvidual items. |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
11 |
*/ |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
12 |
#include "error.h" |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
13 |
#include <sys/queue.h> |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
14 |
|
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
15 |
/** |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
16 |
* The chain header. |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
17 |
*/ |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
18 |
struct chain_head { |
87 | 19 |
/** The list of items */ |
35
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
20 |
const void *chain; |
87 | 21 |
|
22 |
/** The context arg */ |
|
35
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
23 |
void *arg; |
87 | 24 |
|
25 |
/** Our position in the chain_list */ |
|
35
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
26 |
STAILQ_ENTRY(chain_head) node; |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
27 |
}; |
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 |
/** |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
30 |
* @struct chain_list |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
31 |
* |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
32 |
* The chain list |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
33 |
*/ |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
34 |
STAILQ_HEAD(chain_list, chain_head); |
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 |
/** |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
37 |
* Initialize a `struct chain_list` |
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 |
#define CHAIN_INIT(list_ptr) STAILQ_INIT(list_ptr) |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
40 |
|
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
41 |
/** |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
42 |
* Add an item onto the end of a chain_list |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
43 |
*/ |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
44 |
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
|
45 |
|
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
46 |
/** |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
47 |
* Iterate over the contents of a chain_list |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
48 |
* |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
49 |
* struct chain_list *list = ...; |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
50 |
* struct chain_head *head; |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
51 |
* struct foo *foo; |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
52 |
* |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
53 |
* CHAIN_FOREACH(list, head) { |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
54 |
* for (foo = head->chain; foo->bar; foo++) { |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
55 |
* foo->bar(foo, head->arg); |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
56 |
* } |
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 |
*/ |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
59 |
#define CHAIN_FOREACH(list_ptr, head_ptr) STAILQ_FOREACH(head_ptr, list_ptr, 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 |
/** |
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
|
62 |
* Remove an item added with chain_add from a chain_list, matching against the given chain/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
|
63 |
* |
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
|
64 |
* If no item matches, nothing is done. |
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
|
65 |
*/ |
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
|
66 |
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
|
67 |
|
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
|
68 |
/** |
35
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
69 |
* Free a chain_list |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
70 |
*/ |
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
71 |
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
|
72 |
|
3715247e8f5a
add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
73 |
#endif |