preparing for release of 1.9.18alpha9
[samba.git] / source3 / ubi_dLinkList.c
1 /* ========================================================================== **
2  *                              ubi_dLinkList.c
3  *
4  *  Copyright (C) 1997 by Christopher R. Hertel
5  *
6  *  Email: crh@ubiqx.mn.org
7  * -------------------------------------------------------------------------- **
8  *  This module implements simple doubly-linked lists.
9  * -------------------------------------------------------------------------- **
10  *
11  *  This library is free software; you can redistribute it and/or
12  *  modify it under the terms of the GNU Library General Public
13  *  License as published by the Free Software Foundation; either
14  *  version 2 of the License, or (at your option) any later version.
15  *
16  *  This library is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  *  Library General Public License for more details.
20  *
21  *  You should have received a copy of the GNU Library General Public
22  *  License along with this library; if not, write to the Free
23  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24  *
25  * -------------------------------------------------------------------------- **
26  *
27  * Revision 0.3  1997/10/15 03:05:39  crh
28  * Added some handy type casting to the macros.  Added AddHere and RemThis
29  * macros.
30  *
31  * Revision 0.2  1997/10/08 03:07:21  crh
32  * Fixed a few forgotten link-ups in Insert(), and fixed the AddHead()
33  * macro, which was passing the wrong value for <After> to Insert().
34  *
35  * Revision 0.1  1997/10/07 04:34:07  crh
36  * Initial Revision.
37  *
38  *
39  * ========================================================================== **
40  */
41
42 #include "includes.h"
43 #include "ubi_dLinkList.h"
44
45 /* ========================================================================== **
46  * Functions...
47  */
48
49 ubi_dlListPtr ubi_dlInitList( ubi_dlListPtr ListPtr )
50   /* ------------------------------------------------------------------------ **
51    * Initialize a doubly-linked list header.
52    *
53    *  Input:  ListPtr - A pointer to the list structure that is to be
54    *                    initialized for use.
55    *
56    *  Output: A pointer to the initialized list header (i.e., same as
57    *          <ListPtr>).
58    *
59    * ------------------------------------------------------------------------ **
60    */
61   {
62   ListPtr->Head  = NULL;
63   ListPtr->Tail  = NULL;
64   ListPtr->count = 0;
65   return( ListPtr );
66   } /* ubi_dlInitList */
67
68 ubi_dlNodePtr ubi_dlInsert( ubi_dlListPtr ListPtr,
69                             ubi_dlNodePtr New,
70                             ubi_dlNodePtr After )
71   /* ------------------------------------------------------------------------ **
72    * Insert a new node into the list.
73    *
74    *  Input:  ListPtr - A pointer to the list into which the node is to
75    *                    be inserted.
76    *          New     - Pointer to the new node.
77    *          After   - NULL, or a pointer to a node that is already in the
78    *                    list.
79    *                    If NULL, then <New> will be added at the head of the
80    *                    list, else it will be added following <After>.
81    * 
82    *  Output: A pointer to the node that was inserted into the list (i.e.,
83    *          the same as <New>).
84    *
85    * ------------------------------------------------------------------------ **
86    */
87   {
88   if( NULL == After )
89     {
90     New->Next           = ListPtr->Head;
91     New->Prev           = NULL;
92     if( NULL != ListPtr->Head )
93       ListPtr->Head->Prev = New;
94     else
95       ListPtr->Tail       = New;
96     ListPtr->Head       = New;
97     }
98   else
99     {
100     New->Next         = After->Next;
101     New->Prev         = After;
102     if( NULL != After->Next )
103       After->Next->Prev = New;
104     else
105       ListPtr->Tail       = New;
106     After->Next       = New;
107     }
108
109   ++(ListPtr->count);
110
111   return( New );
112   } /* ubi_dlInsert */
113
114 ubi_dlNodePtr ubi_dlRemove( ubi_dlListPtr ListPtr, ubi_dlNodePtr Old )
115   /* ------------------------------------------------------------------------ **
116    * Remove a node from the list.
117    *
118    *  Input:  ListPtr - A pointer to the list from which <Old> is to be
119    *                    removed.
120    *          Old     - A pointer to the node that is to be removed from the
121    *                    list.
122    *
123    *  Output: A pointer to the node that was removed (i.e., <Old>).
124    *
125    * ------------------------------------------------------------------------ **
126    */
127   {
128   if( NULL != Old )
129     {
130     if( Old->Next )
131       Old->Next->Prev = Old->Prev;
132     else
133       ListPtr->Tail = Old->Prev;
134
135     if( Old->Prev )
136       Old->Prev->Next = Old->Next;
137     else
138       ListPtr->Head = Old->Next;
139
140     --(ListPtr->count);
141     }
142
143   return( Old );
144   } /* ubi_dlRemove */
145
146
147 /* ================================ The End ================================= */