1/* -*- Mode: C; tab-width: 4 -*-
2 *
3 * Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16
17 	File:		GenLinkedList.c
18
19 	Contains:	interface to generic linked lists.
20
21 	Version:	1.0
22 	Tabs:		4 spaces
23
24    Change History (most recent first):
25
26Log: GenLinkedList.h,v $
27Revision 1.3  2006/08/14 23:24:56  cheshire
28Re-licensed mDNSResponder daemon source code under Apache License, Version 2.0
29
30Revision 1.2  2004/02/05 07:41:08  cheshire
31Add Log header
32
33*/
34
35#ifndef __GenLinkedList__
36#define __GenLinkedList__
37
38
39#include <stddef.h>
40
41
42struct	GenLinkedList
43{
44	void		*Head,
45				*Tail;
46	size_t		LinkOffset;
47};
48typedef struct GenLinkedList	GenLinkedList;
49
50
51void		InitLinkedList( GenLinkedList *pList, size_t linkOffset);
52
53void		AddToHead( GenLinkedList *pList, void *elem);
54void		AddToTail( GenLinkedList *pList, void *elem);
55
56int		RemoveFromList( GenLinkedList *pList, void *elem);
57
58int		ReplaceElem( GenLinkedList *pList, void *elemInList, void *newElem);
59
60
61
62struct	GenDoubleLinkedList
63{
64	void		*Head,
65				*Tail;
66	size_t		FwdLinkOffset,
67				BackLinkOffset;
68};
69typedef struct GenDoubleLinkedList	GenDoubleLinkedList;
70
71
72void		InitDoubleLinkedList( GenDoubleLinkedList *pList, size_t fwdLinkOffset,
73									  size_t backLinkOffset);
74
75void		DLLAddToHead( GenDoubleLinkedList *pList, void *elem);
76
77void		DLLRemoveFromList( GenDoubleLinkedList *pList, void *elem);
78
79
80
81/* A GenLinkedOffsetList is like a GenLinkedList that stores the *Next field as a signed */
82/* offset from the address of the beginning of the element, rather than as a pointer. */
83
84struct	GenLinkedOffsetList
85{
86	size_t		Head,
87				Tail;
88	size_t		LinkOffset;
89};
90typedef struct GenLinkedOffsetList	GenLinkedOffsetList;
91
92
93void		InitLinkedOffsetList( GenLinkedOffsetList *pList, size_t linkOffset);
94
95void		*GetHeadPtr( GenLinkedOffsetList *pList);
96void		*GetTailPtr( GenLinkedOffsetList *pList);
97void		*GetOffsetLink( GenLinkedOffsetList *pList, void *elem);
98
99void		OffsetAddToHead( GenLinkedOffsetList *pList, void *elem);
100void		OffsetAddToTail( GenLinkedOffsetList *pList, void *elem);
101
102int		OffsetRemoveFromList( GenLinkedOffsetList *pList, void *elem);
103
104int		OffsetReplaceElem( GenLinkedOffsetList *pList, void *elemInList, void *newElem);
105
106
107#endif //	__GenLinkedList__
108