~ubuntu-branches/ubuntu/saucy/sssd/saucy

« back to all changes in this revision

Viewing changes to server/util/dlinklist.h

  • Committer: Stéphane Graber
  • Date: 2011-06-15 16:23:14 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: stgraber@ubuntu.com-20110615162314-rbhoppnpaxfqo5q7
Merge 1.5.8

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* 
2
 
   Unix SMB/CIFS implementation.
3
 
   some simple double linked list macros
4
 
   Copyright (C) Andrew Tridgell 1998
5
 
   
6
 
   This program is free software; you can redistribute it and/or modify
7
 
   it under the terms of the GNU General Public License as published by
8
 
   the Free Software Foundation; either version 3 of the License, or
9
 
   (at your option) any later version.
10
 
   
11
 
   This program is distributed in the hope that it will be useful,
12
 
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 
   GNU General Public License for more details.
15
 
   
16
 
   You should have received a copy of the GNU General Public License
17
 
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
 
*/
19
 
 
20
 
/* To use these macros you must have a structure containing a next and
21
 
   prev pointer */
22
 
 
23
 
#ifndef _DLINKLIST_H
24
 
#define _DLINKLIST_H
25
 
 
26
 
 
27
 
/* hook into the front of the list */
28
 
#define DLIST_ADD(list, p) \
29
 
do { \
30
 
        if (!(list)) { \
31
 
                (list) = (p); \
32
 
                (p)->next = (p)->prev = NULL; \
33
 
        } else { \
34
 
                (list)->prev = (p); \
35
 
                (p)->next = (list); \
36
 
                (p)->prev = NULL; \
37
 
                (list) = (p); \
38
 
        }\
39
 
} while (0)
40
 
 
41
 
/* remove an element from a list - element doesn't have to be in list. */
42
 
#define DLIST_REMOVE(list, p) \
43
 
do { \
44
 
        if ((p) == (list)) { \
45
 
                (list) = (p)->next; \
46
 
                if (list) (list)->prev = NULL; \
47
 
        } else { \
48
 
                if ((p)->prev) (p)->prev->next = (p)->next; \
49
 
                if ((p)->next) (p)->next->prev = (p)->prev; \
50
 
        } \
51
 
        if ((p) != (list)) (p)->next = (p)->prev = NULL; \
52
 
} while (0)
53
 
 
54
 
/* promote an element to the top of the list */
55
 
#define DLIST_PROMOTE(list, p) \
56
 
do { \
57
 
          DLIST_REMOVE(list, p); \
58
 
          DLIST_ADD(list, p); \
59
 
} while (0)
60
 
 
61
 
/* hook into the end of the list - needs a tmp pointer */
62
 
#define DLIST_ADD_END(list, p, type) \
63
 
do { \
64
 
                if (!(list)) { \
65
 
                        (list) = (p); \
66
 
                        (p)->next = (p)->prev = NULL; \
67
 
                } else { \
68
 
                        type tmp; \
69
 
                        for (tmp = (list); tmp->next; tmp = tmp->next) ; \
70
 
                        tmp->next = (p); \
71
 
                        (p)->next = NULL; \
72
 
                        (p)->prev = tmp; \
73
 
                } \
74
 
} while (0)
75
 
 
76
 
/* insert 'p' after the given element 'el' in a list. If el is NULL then
77
 
   this is the same as a DLIST_ADD() */
78
 
#define DLIST_ADD_AFTER(list, p, el) \
79
 
do { \
80
 
        if (!(list) || !(el)) { \
81
 
                DLIST_ADD(list, p); \
82
 
        } else { \
83
 
                p->prev = el; \
84
 
                p->next = el->next; \
85
 
                el->next = p; \
86
 
                if (p->next) p->next->prev = p; \
87
 
        }\
88
 
} while (0)
89
 
 
90
 
/* demote an element to the end of the list, needs a tmp pointer */
91
 
#define DLIST_DEMOTE(list, p, type) \
92
 
do { \
93
 
                DLIST_REMOVE(list, p); \
94
 
                DLIST_ADD_END(list, p, type); \
95
 
} while (0)
96
 
 
97
 
/* concatenate two lists - putting all elements of the 2nd list at the
98
 
   end of the first list */
99
 
#define DLIST_CONCATENATE(list1, list2, type) \
100
 
do { \
101
 
                if (!(list1)) { \
102
 
                        (list1) = (list2); \
103
 
                } else { \
104
 
                        type tmp; \
105
 
                        for (tmp = (list1); tmp->next; tmp = tmp->next) ; \
106
 
                        tmp->next = (list2); \
107
 
                        if (list2) { \
108
 
                                (list2)->prev = tmp;    \
109
 
                        } \
110
 
                } \
111
 
} while (0)
112
 
 
113
 
#define DLIST_FOR_EACH(p, list) \
114
 
        for ((p) = (list); (p) != NULL; (p) = (p)->next)
115
 
 
116
 
#endif /* _DLINKLIST_H */