2 * module-murphy-ivi -- PulseAudio module for providing audio routing support
3 * Copyright (c) 2012, Intel Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU Lesser General Public License,
7 * version 2.1, as published by the Free Software Foundation.
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.
12 * See the GNU Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this program; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin St - Fifth Floor, Boston,
23 #define MIR_DIM(a) (sizeof(a)/sizeof((a)[0]))
25 #define MIR_OFFSET(structure, member) \
26 ((int)((void *)((&((structure *)0)->member)) - (void *)0))
28 #define MIR_LIST_RELOCATE(structure, member, ptr) \
29 ((structure *)((void *)ptr - MIR_OFFSET(structure, member)))
32 #define MIR_DLIST_HEAD(name) mir_dlist name = { &(name), &(name) }
34 #define MIR_DLIST_INIT(self) \
36 (&(self))->prev = &(self); \
37 (&(self))->next = &(self); \
40 #define MIR_DLIST_EMPTY(name) ((&(name))->next == &(name))
42 #define MIR_DLIST_FOR_EACH(structure, member, pos, head) \
43 for (pos = MIR_LIST_RELOCATE(structure, member, (head)->next); \
44 &pos->member != (head); \
45 pos = MIR_LIST_RELOCATE(structure, member, pos->member.next))
47 #define MIR_DLIST_FOR_EACH_SAFE(structure, member, pos, n, head) \
48 for (pos = MIR_LIST_RELOCATE(structure, member, (head)->next), \
49 n = MIR_LIST_RELOCATE(structure, member, pos->member.next); \
50 &pos->member != (head); \
52 n = MIR_LIST_RELOCATE(structure, member, pos->member.next))
54 #define MIR_DLIST_FOR_EACH_BACKWARD(structure, member, pos, head) \
55 for (pos = MIR_LIST_RELOCATE(structure, member, (head)->prev); \
56 &pos->member != (head); \
57 pos = MIR_LIST_RELOCATE(structure, member, pos->member.prev))
59 #define MIR_DLIST_FOR_EACH_NOHEAD(structure, member, pos, start) \
61 &(pos)->member != &(start)->member; \
62 pos = MIR_LIST_RELOCATE(structure, member, pos->member.next))
64 #define MIR_DLIST_FOR_EACH_NOHEAD_SAFE(structure, member, pos,n, start) \
66 n = MIR_LIST_RELOCATE(structure, member, pos->member.next); \
67 &pos->member != &(start)->member; \
69 n = MIR_LIST_RELOCATE(structure, member, pos->member.next))
71 #define MIR_DLIST_INSERT_BEFORE(structure, member, new, before) \
73 mir_dlist *after = (before)->prev; \
74 after->next = &(new)->member; \
75 (new)->member.next = before; \
76 (before)->prev = &(new)->member; \
77 (new)->member.prev = after; \
79 #define MIR_DLIST_APPEND(structure, member, new, head) \
80 MIR_DLIST_INSERT_BEFORE(structure, member, new, head)
82 #define MIR_DLIST_INSERT_AFTER(structure, member, new, after) \
84 mir_dlist *before = (after)->next; \
85 (after)->next = &((new)->member); \
86 (new)->member.next = before; \
87 before->prev = &((new)->member); \
88 (new)->member.prev = after; \
90 #define MIR_DLIST_PREPEND(structure, member, new, head) \
91 MIR_DLIST_INSERT_AFTER(structure, member, new, head)
94 #define MIR_DLIST_UNLINK(structure, member, elem) \
96 mir_dlist *after = (elem)->member.prev; \
97 mir_dlist *before = (elem)->member.next; \
98 after->next = before; \
99 before->prev = after; \
100 (elem)->member.prev = (elem)->member.next = &(elem)->member; \
104 typedef struct mir_dlist {
105 struct mir_dlist *prev;
106 struct mir_dlist *next;
109 #endif /* foomirlistfoo */
115 * indent-tabs-mode: nil