annotate lists.h @ 14:2d112b8a3756

Fix typo
author David Demelier <markand@malikania.fr>
date Wed, 07 Sep 2011 23:32:10 +0200
parents 7360d752183e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * lists.h -- function to manipulate linked lists
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2011, David Demelier <markand@malikania.fr>
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #ifndef _LISTS_H_
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define _LISTS_H_
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 /*
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 * Available function for single linked lists :
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 *
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 * <prefix> refers to the prefix argument given to the LIST_IMPLEMENTS macro.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 * all function will use this prefix to determine the correct function.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 *
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 * <type> refers to the data type used as template.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 *
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 * o void slist_<prefix>_init(struct slist *sls);
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 * Initialize the `ls' list structure.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 *
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 * o void slist_<prefix>_push(struct slist *sls, <type> *var)
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 * Add the `var' to the beginning of the list, if the list is empty
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 * the tail also refers to the head.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 *
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 * o void slist_<prefix>_pop(struct slist *sls)
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 * Remove the first element from the list.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 *
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 * o void slist_<prefix>_after(struct slist *sls, <type> *after, <type> *var)
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 * Insert after the object referenced by `after'.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 *
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 * o void slist_<prefix>_remove(struct slist *sls, <type> *var)
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 * Remove the var element from the list.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 *
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 * o <type> *slist_<prefix>_head(const struct slist *sls)
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 * Returns the first list element.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 */
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 struct slist {
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 int length;
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 void *head;
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 };
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 /*
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 * This declare prototype function, to prevent reimplementing function
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 * that already exists somewhere.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 */
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 #define SLIST_HEADER(attr, prefix, type) \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 attr void slist_##prefix##_init(struct slist *); \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 attr void slist_##prefix##_push(struct slist *, type *); \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 attr void slist_##prefix##_pop(struct slist *); \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 attr void slist_##prefix##_after(struct slist *, type *, type *); \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 attr void slist_##prefix##_remove(struct slist *, type *); \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 attr type *slist_##prefix##_head(const struct slist *);
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
67
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 /*
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 * Generate available function with the specified prefix. Name argument
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 * is the next pointer entry in the `type' structure used to go through
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 * the list.
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 */
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 #define SLIST_IMPLEMENTS(attr, prefix, type, field) \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 attr void \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 slist_##prefix##_init(struct slist *sls) \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 { \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 sls->length = 0; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 sls->head = NULL; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 } \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 attr void \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 slist_##prefix##_push(struct slist *sls, type *var) \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 { \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 var->field = sls->head; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 sls->head = var; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 sls->length++; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 } \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 attr void \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 slist_##prefix##_pop(struct slist *sls) \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 { \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 if (sls->head) { \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 sls->head = ((type *)sls->head)->field; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 sls->length--; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 } \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 } \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 attr void \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 slist_##prefix##_after(struct slist *sls, type *after, type *var) \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 { \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 var->field = after->field; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 after->field = var; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 sls->length++; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 } \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 attr type * \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 slist_##prefix##_head(const struct slist *sls) \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 { \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 return (type *) sls->head; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 }
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 #define SLIST_FOREACH(list, entry, field) \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 for (entry = (list)->head; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 entry; \
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 entry = entry->field)
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
117
7360d752183e Added lists.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 #endif /* _LISTS_H_ */