xref: /aosp_15_r20/external/mdnsresponder/mDNSShared/GenLinkedList.c (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
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