Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/ncsw/inc/etc/list_ext.h
48375 views
1
/* Copyright (c) 2008-2012 Freescale Semiconductor, Inc
2
* All rights reserved.
3
*
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions are met:
6
* * Redistributions of source code must retain the above copyright
7
* notice, this list of conditions and the following disclaimer.
8
* * Redistributions in binary form must reproduce the above copyright
9
* notice, this list of conditions and the following disclaimer in the
10
* documentation and/or other materials provided with the distribution.
11
* * Neither the name of Freescale Semiconductor nor the
12
* names of its contributors may be used to endorse or promote products
13
* derived from this software without specific prior written permission.
14
*
15
*
16
* ALTERNATIVELY, this software may be distributed under the terms of the
17
* GNU General Public License ("GPL") as published by the Free Software
18
* Foundation, either version 2 of that License or (at your option) any
19
* later version.
20
*
21
* THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
* DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
*/
32
33
34
/**************************************************************************//**
35
36
@File list_ext.h
37
38
@Description External prototypes for list.c
39
*//***************************************************************************/
40
41
#ifndef __LIST_EXT_H
42
#define __LIST_EXT_H
43
44
45
#include "std_ext.h"
46
47
48
/**************************************************************************//**
49
@Group etc_id Utility Library Application Programming Interface
50
51
@Description External routines.
52
53
@{
54
*//***************************************************************************/
55
56
/**************************************************************************//**
57
@Group list_id List
58
59
@Description List module functions,definitions and enums.
60
61
@{
62
*//***************************************************************************/
63
64
/**************************************************************************//**
65
@Description List structure.
66
*//***************************************************************************/
67
typedef struct List
68
{
69
struct List *p_Next; /**< A pointer to the next list object */
70
struct List *p_Prev; /**< A pointer to the previous list object */
71
} t_List;
72
73
74
/**************************************************************************//**
75
@Function NCSW_LIST_FIRST/NCSW_LIST_LAST/NCSW_LIST_NEXT/NCSW_LIST_PREV
76
77
@Description Macro to get first/last/next/previous entry in a list.
78
79
@Param[in] p_List - A pointer to a list.
80
*//***************************************************************************/
81
#define NCSW_LIST_FIRST(p_List) (p_List)->p_Next
82
#define NCSW_LIST_LAST(p_List) (p_List)->p_Prev
83
#define NCSW_LIST_NEXT NCSW_LIST_FIRST
84
#define NCSW_LIST_PREV NCSW_LIST_LAST
85
86
87
/**************************************************************************//**
88
@Function NCSW_LIST_INIT
89
90
@Description Macro for initialization of a list struct.
91
92
@Param[in] lst - The t_List object to initialize.
93
*//***************************************************************************/
94
#define NCSW_LIST_INIT(lst) {&(lst), &(lst)}
95
96
97
/**************************************************************************//**
98
@Function NCSW_LIST
99
100
@Description Macro to declare of a list.
101
102
@Param[in] listName - The list object name.
103
*//***************************************************************************/
104
#define NCSW_LIST(listName) t_List listName = NCSW_LIST_INIT(listName)
105
106
107
/**************************************************************************//**
108
@Function INIT_LIST
109
110
@Description Macro to initialize a list pointer.
111
112
@Param[in] p_List - The list pointer.
113
*//***************************************************************************/
114
#define INIT_LIST(p_List) NCSW_LIST_FIRST(p_List) = NCSW_LIST_LAST(p_List) = (p_List)
115
116
117
/**************************************************************************//**
118
@Function NCSW_LIST_OBJECT
119
120
@Description Macro to get the struct (object) for this entry.
121
122
@Param[in] type - The type of the struct (object) this list is embedded in.
123
@Param[in] member - The name of the t_List object within the struct.
124
125
@Return The structure pointer for this entry.
126
*//***************************************************************************/
127
#define MEMBER_OFFSET(type, member) (PTR_TO_UINT(&((type *)0)->member))
128
#define NCSW_LIST_OBJECT(p_List, type, member) \
129
((type *)((char *)(p_List)-MEMBER_OFFSET(type, member)))
130
131
132
/**************************************************************************//**
133
@Function NCSW_LIST_FOR_EACH
134
135
@Description Macro to iterate over a list.
136
137
@Param[in] p_Pos - A pointer to a list to use as a loop counter.
138
@Param[in] p_Head - A pointer to the head for your list pointer.
139
140
@Cautions You can't delete items with this routine.
141
For deletion use NCSW_LIST_FOR_EACH_SAFE().
142
*//***************************************************************************/
143
#define NCSW_LIST_FOR_EACH(p_Pos, p_Head) \
144
for (p_Pos = NCSW_LIST_FIRST(p_Head); p_Pos != (p_Head); p_Pos = NCSW_LIST_NEXT(p_Pos))
145
146
147
/**************************************************************************//**
148
@Function NCSW_LIST_FOR_EACH_SAFE
149
150
@Description Macro to iterate over a list safe against removal of list entry.
151
152
@Param[in] p_Pos - A pointer to a list to use as a loop counter.
153
@Param[in] p_Tmp - Another pointer to a list to use as temporary storage.
154
@Param[in] p_Head - A pointer to the head for your list pointer.
155
*//***************************************************************************/
156
#define NCSW_LIST_FOR_EACH_SAFE(p_Pos, p_Tmp, p_Head) \
157
for (p_Pos = NCSW_LIST_FIRST(p_Head), p_Tmp = NCSW_LIST_FIRST(p_Pos); \
158
p_Pos != (p_Head); \
159
p_Pos = p_Tmp, p_Tmp = NCSW_LIST_NEXT(p_Pos))
160
161
162
/**************************************************************************//**
163
@Function NCSW_LIST_FOR_EACH_OBJECT_SAFE
164
165
@Description Macro to iterate over list of given type safely.
166
167
@Param[in] p_Pos - A pointer to a list to use as a loop counter.
168
@Param[in] p_Tmp - Another pointer to a list to use as temporary storage.
169
@Param[in] type - The type of the struct this is embedded in.
170
@Param[in] p_Head - A pointer to the head for your list pointer.
171
@Param[in] member - The name of the list_struct within the struct.
172
173
@Cautions You can't delete items with this routine.
174
For deletion use NCSW_LIST_FOR_EACH_SAFE().
175
*//***************************************************************************/
176
#define NCSW_LIST_FOR_EACH_OBJECT_SAFE(p_Pos, p_Tmp, p_Head, type, member) \
177
for (p_Pos = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(p_Head), type, member), \
178
p_Tmp = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(&p_Pos->member), type, member); \
179
&p_Pos->member != (p_Head); \
180
p_Pos = p_Tmp, \
181
p_Tmp = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(&p_Pos->member), type, member))
182
183
/**************************************************************************//**
184
@Function NCSW_LIST_FOR_EACH_OBJECT
185
186
@Description Macro to iterate over list of given type.
187
188
@Param[in] p_Pos - A pointer to a list to use as a loop counter.
189
@Param[in] type - The type of the struct this is embedded in.
190
@Param[in] p_Head - A pointer to the head for your list pointer.
191
@Param[in] member - The name of the list_struct within the struct.
192
193
@Cautions You can't delete items with this routine.
194
For deletion use NCSW_LIST_FOR_EACH_SAFE().
195
*//***************************************************************************/
196
#define NCSW_LIST_FOR_EACH_OBJECT(p_Pos, type, p_Head, member) \
197
for (p_Pos = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(p_Head), type, member); \
198
&p_Pos->member != (p_Head); \
199
p_Pos = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(&(p_Pos->member)), type, member))
200
201
202
/**************************************************************************//**
203
@Function NCSW_LIST_Add
204
205
@Description Add a new entry to a list.
206
207
Insert a new entry after the specified head.
208
This is good for implementing stacks.
209
210
@Param[in] p_New - A pointer to a new list entry to be added.
211
@Param[in] p_Head - A pointer to a list head to add it after.
212
213
@Return none.
214
*//***************************************************************************/
215
static __inline__ void NCSW_LIST_Add(t_List *p_New, t_List *p_Head)
216
{
217
NCSW_LIST_PREV(NCSW_LIST_NEXT(p_Head)) = p_New;
218
NCSW_LIST_NEXT(p_New) = NCSW_LIST_NEXT(p_Head);
219
NCSW_LIST_PREV(p_New) = p_Head;
220
NCSW_LIST_NEXT(p_Head) = p_New;
221
}
222
223
224
/**************************************************************************//**
225
@Function NCSW_LIST_AddToTail
226
227
@Description Add a new entry to a list.
228
229
Insert a new entry before the specified head.
230
This is useful for implementing queues.
231
232
@Param[in] p_New - A pointer to a new list entry to be added.
233
@Param[in] p_Head - A pointer to a list head to add it before.
234
235
@Return none.
236
*//***************************************************************************/
237
static __inline__ void NCSW_LIST_AddToTail(t_List *p_New, t_List *p_Head)
238
{
239
NCSW_LIST_NEXT(NCSW_LIST_PREV(p_Head)) = p_New;
240
NCSW_LIST_PREV(p_New) = NCSW_LIST_PREV(p_Head);
241
NCSW_LIST_NEXT(p_New) = p_Head;
242
NCSW_LIST_PREV(p_Head) = p_New;
243
}
244
245
246
/**************************************************************************//**
247
@Function NCSW_LIST_Del
248
249
@Description Deletes entry from a list.
250
251
@Param[in] p_Entry - A pointer to the element to delete from the list.
252
253
@Return none.
254
255
@Cautions NCSW_LIST_IsEmpty() on entry does not return true after this,
256
the entry is in an undefined state.
257
*//***************************************************************************/
258
static __inline__ void NCSW_LIST_Del(t_List *p_Entry)
259
{
260
NCSW_LIST_PREV(NCSW_LIST_NEXT(p_Entry)) = NCSW_LIST_PREV(p_Entry);
261
NCSW_LIST_NEXT(NCSW_LIST_PREV(p_Entry)) = NCSW_LIST_NEXT(p_Entry);
262
}
263
264
265
/**************************************************************************//**
266
@Function NCSW_LIST_DelAndInit
267
268
@Description Deletes entry from list and reinitialize it.
269
270
@Param[in] p_Entry - A pointer to the element to delete from the list.
271
272
@Return none.
273
*//***************************************************************************/
274
static __inline__ void NCSW_LIST_DelAndInit(t_List *p_Entry)
275
{
276
NCSW_LIST_Del(p_Entry);
277
INIT_LIST(p_Entry);
278
}
279
280
281
/**************************************************************************//**
282
@Function NCSW_LIST_Move
283
284
@Description Delete from one list and add as another's head.
285
286
@Param[in] p_Entry - A pointer to the list entry to move.
287
@Param[in] p_Head - A pointer to the list head that will precede our entry.
288
289
@Return none.
290
*//***************************************************************************/
291
static __inline__ void NCSW_LIST_Move(t_List *p_Entry, t_List *p_Head)
292
{
293
NCSW_LIST_Del(p_Entry);
294
NCSW_LIST_Add(p_Entry, p_Head);
295
}
296
297
298
/**************************************************************************//**
299
@Function NCSW_LIST_MoveToTail
300
301
@Description Delete from one list and add as another's tail.
302
303
@Param[in] p_Entry - A pointer to the entry to move.
304
@Param[in] p_Head - A pointer to the list head that will follow our entry.
305
306
@Return none.
307
*//***************************************************************************/
308
static __inline__ void NCSW_LIST_MoveToTail(t_List *p_Entry, t_List *p_Head)
309
{
310
NCSW_LIST_Del(p_Entry);
311
NCSW_LIST_AddToTail(p_Entry, p_Head);
312
}
313
314
315
/**************************************************************************//**
316
@Function NCSW_LIST_IsEmpty
317
318
@Description Tests whether a list is empty.
319
320
@Param[in] p_List - A pointer to the list to test.
321
322
@Return 1 if the list is empty, 0 otherwise.
323
*//***************************************************************************/
324
static __inline__ int NCSW_LIST_IsEmpty(t_List *p_List)
325
{
326
return (NCSW_LIST_FIRST(p_List) == p_List);
327
}
328
329
330
/**************************************************************************//**
331
@Function NCSW_LIST_Append
332
333
@Description Join two lists.
334
335
@Param[in] p_NewList - A pointer to the new list to add.
336
@Param[in] p_Head - A pointer to the place to add it in the first list.
337
338
@Return none.
339
*//***************************************************************************/
340
void NCSW_LIST_Append(t_List *p_NewList, t_List *p_Head);
341
342
343
/**************************************************************************//**
344
@Function NCSW_LIST_NumOfObjs
345
346
@Description Counts number of objects in the list
347
348
@Param[in] p_List - A pointer to the list which objects are to be counted.
349
350
@Return Number of objects in the list.
351
*//***************************************************************************/
352
int NCSW_LIST_NumOfObjs(t_List *p_List);
353
354
/** @} */ /* end of list_id group */
355
/** @} */ /* end of etc_id group */
356
357
358
#endif /* __LIST_EXT_H */
359
360