This is my library of lists and trees. My hope is to replace all of the
[kai/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  * $Log: ubi_dLinkList.c,v $
28  * Revision 1.1  1997/10/09 04:09:55  crh
29  * This is my library of lists and trees.  My hope is to replace all of the
30  * hard coded linked lists that are currently used in Samba with calls to
31  * these modules.  This should make the code simpler, smaller, and (I hope)
32  * faster.  The tree code, in particular, should speed up processing where
33  * large lists are involved.
34  *
35  * Chris -)-----
36  *
37  * Revision 0.2  1997/10/08 03:07:21  crh
38  * Fixed a few forgotten link-ups in Insert(), and fixed the AddHead()
39  * macro, which was passing the wrong value for <After> to Insert().
40  *
41  * Revision 0.1  1997/10/07 04:34:07  crh
42  * Initial Revision.
43  *
44  *
45  * ========================================================================== **
46  */
47
48 #include "ubi_dLinkList.h"
49
50 /* ========================================================================== **
51  * Functions...
52  */
53
54 ubi_dlListPtr ubi_dlInitList( ubi_dlListPtr ListPtr )
55   /* ------------------------------------------------------------------------ **
56    * Initialize a doubly-linked list header.
57    *
58    *  Input:  ListPtr - A pointer to the list structure that is to be
59    *                    initialized for use.
60    *
61    *  Output: A pointer to the initialized list header (i.e., same as
62    *          <ListPtr>).
63    *
64    * ------------------------------------------------------------------------ **
65    */
66   {
67   ListPtr->Head  = NULL;
68   ListPtr->Tail  = NULL;
69   ListPtr->count = 0;
70   return( ListPtr );
71   } /* ubi_dlInitList */
72
73 ubi_dlNodePtr ubi_dlInsert( ubi_dlListPtr ListPtr,
74                             ubi_dlNodePtr New,
75                             ubi_dlNodePtr After )
76   /* ------------------------------------------------------------------------ **
77    * Insert a new node into the list.
78    *
79    *  Input:  ListPtr - A pointer to the list into which the node is to
80    *                    be inserted.
81    *          New     - Pointer to the new node.
82    *          After   - NULL, or a pointer to a node that is already in the
83    *                    list.
84    *                    If NULL, then <New> will be added at the head of the
85    *                    list, else it will be added following <After>.
86    * 
87    *  Output: A pointer to the node that was inserted into the list (i.e.,
88    *          the same as <New>).
89    *
90    * ------------------------------------------------------------------------ **
91    */
92   {
93   if( NULL == After )
94     {
95     New->Next           = ListPtr->Head;
96     New->Prev           = NULL;
97     if( NULL != ListPtr->Head )
98       ListPtr->Head->Prev = New;
99     else
100       ListPtr->Tail       = New;
101     ListPtr->Head       = New;
102     }
103   else
104     {
105     New->Next         = After->Next;
106     New->Prev         = After;
107     if( NULL != After->Next )
108       After->Next->Prev = New;
109     else
110       ListPtr->Tail       = New;
111     After->Next       = New;
112     }
113
114   ++(ListPtr->count);
115
116   return( New );
117   } /* ubi_dlInsert */
118
119 ubi_dlNodePtr ubi_dlRemove( ubi_dlListPtr ListPtr, ubi_dlNodePtr Old )
120   /* ------------------------------------------------------------------------ **
121    * Remove a node from the list.
122    *
123    *  Input:  ListPtr - A pointer to the list from which <Old> is to be
124    *                    removed.
125    *          Old     - A pointer to the node that is to be removed from the
126    *                    list.
127    *
128    *  Output: A pointer to the node that was removed (i.e., <Old>).
129    *
130    * ------------------------------------------------------------------------ **
131    */
132   {
133   if( NULL != Old )
134     {
135     if( Old->Next )
136       Old->Next->Prev = Old->Prev;
137     else
138       ListPtr->Tail = Old->Prev;
139
140     if( Old->Prev )
141       Old->Prev->Next = Old->Next;
142     else
143       ListPtr->Head = Old->Next;
144
145     --(ListPtr->count);
146     }
147
148   return( Old );
149   } /* ubi_dlRemove */
150
151
152 /* ================================ The End ================================= */