1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker *
3*48a54d36SAndroid Build Coastguard Worker * Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
4*48a54d36SAndroid Build Coastguard Worker *
5*48a54d36SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*48a54d36SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*48a54d36SAndroid Build Coastguard Worker * You may obtain a copy of the License at
8*48a54d36SAndroid Build Coastguard Worker *
9*48a54d36SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*48a54d36SAndroid Build Coastguard Worker *
11*48a54d36SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*48a54d36SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*48a54d36SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*48a54d36SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*48a54d36SAndroid Build Coastguard Worker * limitations under the License.
16*48a54d36SAndroid Build Coastguard Worker
17*48a54d36SAndroid Build Coastguard Worker File: GenLinkedList.c
18*48a54d36SAndroid Build Coastguard Worker
19*48a54d36SAndroid Build Coastguard Worker Contains: implementation of generic linked lists.
20*48a54d36SAndroid Build Coastguard Worker
21*48a54d36SAndroid Build Coastguard Worker Version: 1.0
22*48a54d36SAndroid Build Coastguard Worker Tabs: 4 spaces
23*48a54d36SAndroid Build Coastguard Worker */
24*48a54d36SAndroid Build Coastguard Worker
25*48a54d36SAndroid Build Coastguard Worker #include "GenLinkedList.h"
26*48a54d36SAndroid Build Coastguard Worker
27*48a54d36SAndroid Build Coastguard Worker
28*48a54d36SAndroid Build Coastguard Worker // Return the link pointer contained within element e at offset o.
29*48a54d36SAndroid Build Coastguard Worker #define GETLINK( e, o) ( *(void**)((char*) (e) + (o)) )
30*48a54d36SAndroid Build Coastguard Worker
31*48a54d36SAndroid Build Coastguard Worker // Assign the link pointer l to element e at offset o.
32*48a54d36SAndroid Build Coastguard Worker #define ASSIGNLINK( e, l, o) ( *((void**)((char*) (e) + (o))) = (l))
33*48a54d36SAndroid Build Coastguard Worker
34*48a54d36SAndroid Build Coastguard Worker
35*48a54d36SAndroid Build Coastguard Worker // GenLinkedList /////////////////////////////////////////////////////////////
36*48a54d36SAndroid Build Coastguard Worker
InitLinkedList(GenLinkedList * pList,size_t linkOffset)37*48a54d36SAndroid Build Coastguard Worker void InitLinkedList( GenLinkedList *pList, size_t linkOffset)
38*48a54d36SAndroid Build Coastguard Worker /* Initialize the block of memory pointed to by pList as a linked list. */
39*48a54d36SAndroid Build Coastguard Worker {
40*48a54d36SAndroid Build Coastguard Worker pList->Head = NULL;
41*48a54d36SAndroid Build Coastguard Worker pList->Tail = NULL;
42*48a54d36SAndroid Build Coastguard Worker pList->LinkOffset = linkOffset;
43*48a54d36SAndroid Build Coastguard Worker }
44*48a54d36SAndroid Build Coastguard Worker
45*48a54d36SAndroid Build Coastguard Worker
AddToTail(GenLinkedList * pList,void * elem)46*48a54d36SAndroid Build Coastguard Worker void AddToTail( GenLinkedList *pList, void *elem)
47*48a54d36SAndroid Build Coastguard Worker /* Add a linked list element to the tail of the list. */
48*48a54d36SAndroid Build Coastguard Worker {
49*48a54d36SAndroid Build Coastguard Worker if ( pList->Tail) {
50*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( pList->Tail, elem, pList->LinkOffset);
51*48a54d36SAndroid Build Coastguard Worker } else
52*48a54d36SAndroid Build Coastguard Worker pList->Head = elem;
53*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( elem, NULL, pList->LinkOffset);
54*48a54d36SAndroid Build Coastguard Worker
55*48a54d36SAndroid Build Coastguard Worker pList->Tail = elem;
56*48a54d36SAndroid Build Coastguard Worker }
57*48a54d36SAndroid Build Coastguard Worker
58*48a54d36SAndroid Build Coastguard Worker
AddToHead(GenLinkedList * pList,void * elem)59*48a54d36SAndroid Build Coastguard Worker void AddToHead( GenLinkedList *pList, void *elem)
60*48a54d36SAndroid Build Coastguard Worker /* Add a linked list element to the head of the list. */
61*48a54d36SAndroid Build Coastguard Worker {
62*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( elem, pList->Head, pList->LinkOffset);
63*48a54d36SAndroid Build Coastguard Worker if ( pList->Tail == NULL)
64*48a54d36SAndroid Build Coastguard Worker pList->Tail = elem;
65*48a54d36SAndroid Build Coastguard Worker
66*48a54d36SAndroid Build Coastguard Worker pList->Head = elem;
67*48a54d36SAndroid Build Coastguard Worker }
68*48a54d36SAndroid Build Coastguard Worker
69*48a54d36SAndroid Build Coastguard Worker
RemoveFromList(GenLinkedList * pList,void * elem)70*48a54d36SAndroid Build Coastguard Worker int RemoveFromList( GenLinkedList *pList, void *elem)
71*48a54d36SAndroid Build Coastguard Worker /* Remove a linked list element from the list. Return 0 if it was not found. */
72*48a54d36SAndroid Build Coastguard Worker /* If the element is removed, its link will be set to NULL. */
73*48a54d36SAndroid Build Coastguard Worker {
74*48a54d36SAndroid Build Coastguard Worker void *iElem, *lastElem;
75*48a54d36SAndroid Build Coastguard Worker
76*48a54d36SAndroid Build Coastguard Worker for ( iElem = pList->Head, lastElem = NULL; iElem; iElem = GETLINK( iElem, pList->LinkOffset)) {
77*48a54d36SAndroid Build Coastguard Worker if ( iElem == elem) {
78*48a54d36SAndroid Build Coastguard Worker if ( lastElem) { // somewhere past the head
79*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( lastElem, GETLINK( elem, pList->LinkOffset), pList->LinkOffset);
80*48a54d36SAndroid Build Coastguard Worker } else { // at the head
81*48a54d36SAndroid Build Coastguard Worker pList->Head = GETLINK( elem, pList->LinkOffset);
82*48a54d36SAndroid Build Coastguard Worker }
83*48a54d36SAndroid Build Coastguard Worker if ( pList->Tail == elem)
84*48a54d36SAndroid Build Coastguard Worker pList->Tail = lastElem ? lastElem : NULL;
85*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( elem, NULL, pList->LinkOffset); // maybe catch a stale reference bug.
86*48a54d36SAndroid Build Coastguard Worker return 1;
87*48a54d36SAndroid Build Coastguard Worker }
88*48a54d36SAndroid Build Coastguard Worker lastElem = iElem;
89*48a54d36SAndroid Build Coastguard Worker }
90*48a54d36SAndroid Build Coastguard Worker
91*48a54d36SAndroid Build Coastguard Worker return 0;
92*48a54d36SAndroid Build Coastguard Worker }
93*48a54d36SAndroid Build Coastguard Worker
94*48a54d36SAndroid Build Coastguard Worker
ReplaceElem(GenLinkedList * pList,void * elemInList,void * newElem)95*48a54d36SAndroid Build Coastguard Worker int ReplaceElem( GenLinkedList *pList, void *elemInList, void *newElem)
96*48a54d36SAndroid Build Coastguard Worker /* Replace an element in the list with a new element, in the same position. */
97*48a54d36SAndroid Build Coastguard Worker {
98*48a54d36SAndroid Build Coastguard Worker void *iElem, *lastElem;
99*48a54d36SAndroid Build Coastguard Worker
100*48a54d36SAndroid Build Coastguard Worker if ( elemInList == NULL || newElem == NULL)
101*48a54d36SAndroid Build Coastguard Worker return 0;
102*48a54d36SAndroid Build Coastguard Worker
103*48a54d36SAndroid Build Coastguard Worker for ( iElem = pList->Head, lastElem = NULL; iElem; iElem = GETLINK( iElem, pList->LinkOffset))
104*48a54d36SAndroid Build Coastguard Worker {
105*48a54d36SAndroid Build Coastguard Worker if ( iElem == elemInList)
106*48a54d36SAndroid Build Coastguard Worker {
107*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( newElem, GETLINK( elemInList, pList->LinkOffset), pList->LinkOffset);
108*48a54d36SAndroid Build Coastguard Worker if ( lastElem) // somewhere past the head
109*48a54d36SAndroid Build Coastguard Worker {
110*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( lastElem, newElem, pList->LinkOffset);
111*48a54d36SAndroid Build Coastguard Worker }
112*48a54d36SAndroid Build Coastguard Worker else // at the head
113*48a54d36SAndroid Build Coastguard Worker {
114*48a54d36SAndroid Build Coastguard Worker pList->Head = newElem;
115*48a54d36SAndroid Build Coastguard Worker }
116*48a54d36SAndroid Build Coastguard Worker if ( pList->Tail == elemInList)
117*48a54d36SAndroid Build Coastguard Worker pList->Tail = newElem;
118*48a54d36SAndroid Build Coastguard Worker return 1;
119*48a54d36SAndroid Build Coastguard Worker }
120*48a54d36SAndroid Build Coastguard Worker lastElem = iElem;
121*48a54d36SAndroid Build Coastguard Worker }
122*48a54d36SAndroid Build Coastguard Worker
123*48a54d36SAndroid Build Coastguard Worker return 0;
124*48a54d36SAndroid Build Coastguard Worker }
125*48a54d36SAndroid Build Coastguard Worker
126*48a54d36SAndroid Build Coastguard Worker
127*48a54d36SAndroid Build Coastguard Worker // GenDoubleLinkedList /////////////////////////////////////////////////////////
128*48a54d36SAndroid Build Coastguard Worker
InitDoubleLinkedList(GenDoubleLinkedList * pList,size_t fwdLinkOffset,size_t backLinkOffset)129*48a54d36SAndroid Build Coastguard Worker void InitDoubleLinkedList( GenDoubleLinkedList *pList, size_t fwdLinkOffset,
130*48a54d36SAndroid Build Coastguard Worker size_t backLinkOffset)
131*48a54d36SAndroid Build Coastguard Worker /* Initialize the block of memory pointed to by pList as a double linked list. */
132*48a54d36SAndroid Build Coastguard Worker {
133*48a54d36SAndroid Build Coastguard Worker pList->Head = NULL;
134*48a54d36SAndroid Build Coastguard Worker pList->Tail = NULL;
135*48a54d36SAndroid Build Coastguard Worker pList->FwdLinkOffset = fwdLinkOffset;
136*48a54d36SAndroid Build Coastguard Worker pList->BackLinkOffset = backLinkOffset;
137*48a54d36SAndroid Build Coastguard Worker }
138*48a54d36SAndroid Build Coastguard Worker
139*48a54d36SAndroid Build Coastguard Worker
DLLAddToHead(GenDoubleLinkedList * pList,void * elem)140*48a54d36SAndroid Build Coastguard Worker void DLLAddToHead( GenDoubleLinkedList *pList, void *elem)
141*48a54d36SAndroid Build Coastguard Worker /* Add a linked list element to the head of the list. */
142*48a54d36SAndroid Build Coastguard Worker {
143*48a54d36SAndroid Build Coastguard Worker void *pNext;
144*48a54d36SAndroid Build Coastguard Worker
145*48a54d36SAndroid Build Coastguard Worker pNext = pList->Head;
146*48a54d36SAndroid Build Coastguard Worker
147*48a54d36SAndroid Build Coastguard Worker // fix up the forward links
148*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( elem, pList->Head, pList->FwdLinkOffset);
149*48a54d36SAndroid Build Coastguard Worker pList->Head = elem;
150*48a54d36SAndroid Build Coastguard Worker
151*48a54d36SAndroid Build Coastguard Worker // fix up the backward links
152*48a54d36SAndroid Build Coastguard Worker if ( pNext) {
153*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( pNext, elem, pList->BackLinkOffset);
154*48a54d36SAndroid Build Coastguard Worker } else
155*48a54d36SAndroid Build Coastguard Worker pList->Tail = elem;
156*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( elem, NULL, pList->BackLinkOffset);
157*48a54d36SAndroid Build Coastguard Worker }
158*48a54d36SAndroid Build Coastguard Worker
159*48a54d36SAndroid Build Coastguard Worker
DLLRemoveFromList(GenDoubleLinkedList * pList,void * elem)160*48a54d36SAndroid Build Coastguard Worker void DLLRemoveFromList( GenDoubleLinkedList *pList, void *elem)
161*48a54d36SAndroid Build Coastguard Worker /* Remove a linked list element from the list. */
162*48a54d36SAndroid Build Coastguard Worker /* When the element is removed, its link will be set to NULL. */
163*48a54d36SAndroid Build Coastguard Worker {
164*48a54d36SAndroid Build Coastguard Worker void *pNext, *pPrev;
165*48a54d36SAndroid Build Coastguard Worker
166*48a54d36SAndroid Build Coastguard Worker pNext = GETLINK( elem, pList->FwdLinkOffset);
167*48a54d36SAndroid Build Coastguard Worker pPrev = GETLINK( elem, pList->BackLinkOffset);
168*48a54d36SAndroid Build Coastguard Worker
169*48a54d36SAndroid Build Coastguard Worker // fix up the forward links
170*48a54d36SAndroid Build Coastguard Worker if ( pPrev)
171*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( pPrev, pNext, pList->FwdLinkOffset);
172*48a54d36SAndroid Build Coastguard Worker else
173*48a54d36SAndroid Build Coastguard Worker pList->Head = pNext;
174*48a54d36SAndroid Build Coastguard Worker
175*48a54d36SAndroid Build Coastguard Worker // fix up the backward links
176*48a54d36SAndroid Build Coastguard Worker if ( pNext)
177*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( pNext, pPrev, pList->BackLinkOffset);
178*48a54d36SAndroid Build Coastguard Worker else
179*48a54d36SAndroid Build Coastguard Worker pList->Tail = pPrev;
180*48a54d36SAndroid Build Coastguard Worker
181*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( elem, NULL, pList->FwdLinkOffset);
182*48a54d36SAndroid Build Coastguard Worker ASSIGNLINK( elem, NULL, pList->BackLinkOffset);
183*48a54d36SAndroid Build Coastguard Worker }
184*48a54d36SAndroid Build Coastguard Worker
185*48a54d36SAndroid Build Coastguard Worker
186*48a54d36SAndroid Build Coastguard Worker // GenLinkedOffsetList /////////////////////////////////////////////////////
187*48a54d36SAndroid Build Coastguard Worker
188*48a54d36SAndroid Build Coastguard Worker // Extract the Next offset from element
189*48a54d36SAndroid Build Coastguard Worker #define GETOFFSET( e, o) ( *(size_t*)((char*) (e) + (o)) )
190*48a54d36SAndroid Build Coastguard Worker
191*48a54d36SAndroid Build Coastguard Worker static void AssignOffsetLink( void *elem, void *link, size_t linkOffset);
192*48a54d36SAndroid Build Coastguard Worker
193*48a54d36SAndroid Build Coastguard Worker
AssignOffsetLink(void * elem,void * link,size_t linkOffset)194*48a54d36SAndroid Build Coastguard Worker static void AssignOffsetLink( void *elem, void *link, size_t linkOffset)
195*48a54d36SAndroid Build Coastguard Worker // Assign link to elem as an offset from elem. Assign 0 to elem if link is NULL.
196*48a54d36SAndroid Build Coastguard Worker {
197*48a54d36SAndroid Build Coastguard Worker GETOFFSET( elem, linkOffset) = link ? (size_t) link - (size_t) elem : 0;
198*48a54d36SAndroid Build Coastguard Worker }
199*48a54d36SAndroid Build Coastguard Worker
200*48a54d36SAndroid Build Coastguard Worker
GetHeadPtr(GenLinkedOffsetList * pList)201*48a54d36SAndroid Build Coastguard Worker void *GetHeadPtr( GenLinkedOffsetList *pList)
202*48a54d36SAndroid Build Coastguard Worker /* Return a pointer to the head element of a list, or NULL if none. */
203*48a54d36SAndroid Build Coastguard Worker {
204*48a54d36SAndroid Build Coastguard Worker return pList->Head ? ( (char*) (pList) + pList->Head) : NULL;
205*48a54d36SAndroid Build Coastguard Worker }
206*48a54d36SAndroid Build Coastguard Worker
207*48a54d36SAndroid Build Coastguard Worker
GetTailPtr(GenLinkedOffsetList * pList)208*48a54d36SAndroid Build Coastguard Worker void *GetTailPtr( GenLinkedOffsetList *pList)
209*48a54d36SAndroid Build Coastguard Worker /* Return a pointer to the tail element of a list, or NULL if none. */
210*48a54d36SAndroid Build Coastguard Worker {
211*48a54d36SAndroid Build Coastguard Worker return pList->Tail ? ( (char*) (pList) + pList->Tail) : NULL;
212*48a54d36SAndroid Build Coastguard Worker }
213*48a54d36SAndroid Build Coastguard Worker
214*48a54d36SAndroid Build Coastguard Worker
GetOffsetLink(GenLinkedOffsetList * pList,void * elem)215*48a54d36SAndroid Build Coastguard Worker void *GetOffsetLink( GenLinkedOffsetList *pList, void *elem)
216*48a54d36SAndroid Build Coastguard Worker /* Return the link pointer contained within element e for pList, or NULL if it is 0. */
217*48a54d36SAndroid Build Coastguard Worker {
218*48a54d36SAndroid Build Coastguard Worker size_t nextOffset;
219*48a54d36SAndroid Build Coastguard Worker
220*48a54d36SAndroid Build Coastguard Worker nextOffset = GETOFFSET( elem, pList->LinkOffset);
221*48a54d36SAndroid Build Coastguard Worker
222*48a54d36SAndroid Build Coastguard Worker return nextOffset ? (char*) elem + nextOffset : NULL;
223*48a54d36SAndroid Build Coastguard Worker }
224*48a54d36SAndroid Build Coastguard Worker
225*48a54d36SAndroid Build Coastguard Worker
InitLinkedOffsetList(GenLinkedOffsetList * pList,size_t linkOffset)226*48a54d36SAndroid Build Coastguard Worker void InitLinkedOffsetList( GenLinkedOffsetList *pList, size_t linkOffset)
227*48a54d36SAndroid Build Coastguard Worker /* Initialize the block of memory pointed to by pList as a linked list. */
228*48a54d36SAndroid Build Coastguard Worker {
229*48a54d36SAndroid Build Coastguard Worker pList->Head = 0;
230*48a54d36SAndroid Build Coastguard Worker pList->Tail = 0;
231*48a54d36SAndroid Build Coastguard Worker pList->LinkOffset = linkOffset;
232*48a54d36SAndroid Build Coastguard Worker }
233*48a54d36SAndroid Build Coastguard Worker
234*48a54d36SAndroid Build Coastguard Worker
OffsetAddToTail(GenLinkedOffsetList * pList,void * elem)235*48a54d36SAndroid Build Coastguard Worker void OffsetAddToTail( GenLinkedOffsetList *pList, void *elem)
236*48a54d36SAndroid Build Coastguard Worker /* Add a linked list element to the tail of the list. */
237*48a54d36SAndroid Build Coastguard Worker {
238*48a54d36SAndroid Build Coastguard Worker if ( pList->Tail) {
239*48a54d36SAndroid Build Coastguard Worker AssignOffsetLink( GetTailPtr( pList), elem, pList->LinkOffset);
240*48a54d36SAndroid Build Coastguard Worker } else
241*48a54d36SAndroid Build Coastguard Worker pList->Head = (size_t) elem - (size_t) pList;
242*48a54d36SAndroid Build Coastguard Worker AssignOffsetLink( elem, NULL, pList->LinkOffset);
243*48a54d36SAndroid Build Coastguard Worker
244*48a54d36SAndroid Build Coastguard Worker pList->Tail = (size_t) elem - (size_t) pList;
245*48a54d36SAndroid Build Coastguard Worker }
246*48a54d36SAndroid Build Coastguard Worker
247*48a54d36SAndroid Build Coastguard Worker
OffsetAddToHead(GenLinkedOffsetList * pList,void * elem)248*48a54d36SAndroid Build Coastguard Worker void OffsetAddToHead( GenLinkedOffsetList *pList, void *elem)
249*48a54d36SAndroid Build Coastguard Worker /* Add a linked list element to the head of the list. */
250*48a54d36SAndroid Build Coastguard Worker {
251*48a54d36SAndroid Build Coastguard Worker AssignOffsetLink( elem, GetHeadPtr( pList), pList->LinkOffset);
252*48a54d36SAndroid Build Coastguard Worker if ( pList->Tail == 0)
253*48a54d36SAndroid Build Coastguard Worker pList->Tail = (size_t) elem - (size_t) pList;
254*48a54d36SAndroid Build Coastguard Worker
255*48a54d36SAndroid Build Coastguard Worker pList->Head = (size_t) elem - (size_t) pList;
256*48a54d36SAndroid Build Coastguard Worker }
257*48a54d36SAndroid Build Coastguard Worker
258*48a54d36SAndroid Build Coastguard Worker
OffsetRemoveFromList(GenLinkedOffsetList * pList,void * elem)259*48a54d36SAndroid Build Coastguard Worker int OffsetRemoveFromList( GenLinkedOffsetList *pList, void *elem)
260*48a54d36SAndroid Build Coastguard Worker /* Remove a linked list element from the list. Return 0 if it was not found. */
261*48a54d36SAndroid Build Coastguard Worker /* If the element is removed, its link will be set to NULL. */
262*48a54d36SAndroid Build Coastguard Worker {
263*48a54d36SAndroid Build Coastguard Worker void *iElem, *lastElem;
264*48a54d36SAndroid Build Coastguard Worker
265*48a54d36SAndroid Build Coastguard Worker for ( iElem = GetHeadPtr( pList), lastElem = NULL; iElem;
266*48a54d36SAndroid Build Coastguard Worker iElem = GetOffsetLink( pList, iElem))
267*48a54d36SAndroid Build Coastguard Worker {
268*48a54d36SAndroid Build Coastguard Worker if ( iElem == elem) {
269*48a54d36SAndroid Build Coastguard Worker if ( lastElem) { // somewhere past the head
270*48a54d36SAndroid Build Coastguard Worker AssignOffsetLink( lastElem, GetOffsetLink( pList, elem), pList->LinkOffset);
271*48a54d36SAndroid Build Coastguard Worker } else { // at the head
272*48a54d36SAndroid Build Coastguard Worker iElem = GetOffsetLink( pList, elem);
273*48a54d36SAndroid Build Coastguard Worker pList->Head = iElem ? (size_t) iElem - (size_t) pList : 0;
274*48a54d36SAndroid Build Coastguard Worker }
275*48a54d36SAndroid Build Coastguard Worker if ( GetTailPtr( pList) == elem)
276*48a54d36SAndroid Build Coastguard Worker pList->Tail = lastElem ? (size_t) lastElem - (size_t) pList : 0;
277*48a54d36SAndroid Build Coastguard Worker AssignOffsetLink( elem, NULL, pList->LinkOffset); // maybe catch a stale reference bug.
278*48a54d36SAndroid Build Coastguard Worker return 1;
279*48a54d36SAndroid Build Coastguard Worker }
280*48a54d36SAndroid Build Coastguard Worker lastElem = iElem;
281*48a54d36SAndroid Build Coastguard Worker }
282*48a54d36SAndroid Build Coastguard Worker
283*48a54d36SAndroid Build Coastguard Worker return 0;
284*48a54d36SAndroid Build Coastguard Worker }
285*48a54d36SAndroid Build Coastguard Worker
286*48a54d36SAndroid Build Coastguard Worker
OffsetReplaceElem(GenLinkedOffsetList * pList,void * elemInList,void * newElem)287*48a54d36SAndroid Build Coastguard Worker int OffsetReplaceElem( GenLinkedOffsetList *pList, void *elemInList, void *newElem)
288*48a54d36SAndroid Build Coastguard Worker /* Replace an element in the list with a new element, in the same position. */
289*48a54d36SAndroid Build Coastguard Worker {
290*48a54d36SAndroid Build Coastguard Worker void *iElem, *lastElem;
291*48a54d36SAndroid Build Coastguard Worker
292*48a54d36SAndroid Build Coastguard Worker if ( elemInList == NULL || newElem == NULL)
293*48a54d36SAndroid Build Coastguard Worker return 0;
294*48a54d36SAndroid Build Coastguard Worker
295*48a54d36SAndroid Build Coastguard Worker for ( iElem = GetHeadPtr( pList), lastElem = NULL; iElem;
296*48a54d36SAndroid Build Coastguard Worker iElem = GetOffsetLink( pList, iElem))
297*48a54d36SAndroid Build Coastguard Worker {
298*48a54d36SAndroid Build Coastguard Worker if ( iElem == elemInList)
299*48a54d36SAndroid Build Coastguard Worker {
300*48a54d36SAndroid Build Coastguard Worker AssignOffsetLink( newElem, GetOffsetLink( pList, elemInList), pList->LinkOffset);
301*48a54d36SAndroid Build Coastguard Worker if ( lastElem) // somewhere past the head
302*48a54d36SAndroid Build Coastguard Worker {
303*48a54d36SAndroid Build Coastguard Worker AssignOffsetLink( lastElem, newElem, pList->LinkOffset);
304*48a54d36SAndroid Build Coastguard Worker }
305*48a54d36SAndroid Build Coastguard Worker else // at the head
306*48a54d36SAndroid Build Coastguard Worker {
307*48a54d36SAndroid Build Coastguard Worker pList->Head = (size_t) newElem - (size_t) pList;
308*48a54d36SAndroid Build Coastguard Worker }
309*48a54d36SAndroid Build Coastguard Worker if ( GetTailPtr( pList) == elemInList)
310*48a54d36SAndroid Build Coastguard Worker pList->Tail = (size_t) newElem - (size_t) pList;
311*48a54d36SAndroid Build Coastguard Worker return 1;
312*48a54d36SAndroid Build Coastguard Worker }
313*48a54d36SAndroid Build Coastguard Worker lastElem = iElem;
314*48a54d36SAndroid Build Coastguard Worker }
315*48a54d36SAndroid Build Coastguard Worker
316*48a54d36SAndroid Build Coastguard Worker return 0;
317*48a54d36SAndroid Build Coastguard Worker }
318*48a54d36SAndroid Build Coastguard Worker
319*48a54d36SAndroid Build Coastguard Worker
320