10a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*	$NetBSD: genlist.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Id: genlist.h,v 1.2 2004/07/12 20:43:50 ludvigm Exp */
40a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
50a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
60a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
70a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
80a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * All rights reserved.
90a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *
100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Redistribution and use in source and binary forms, with or without
110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * modification, are permitted provided that the following conditions
120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * are met:
130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 1. Redistributions of source code must retain the above copyright
140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    notice, this list of conditions and the following disclaimer.
150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 2. Redistributions in binary form must reproduce the above copyright
160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    notice, this list of conditions and the following disclaimer in the
170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    documentation and/or other materials provided with the distribution.
180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 3. Neither the name of the project nor the names of its contributors
190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    may be used to endorse or promote products derived from this software
200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    without specific prior written permission.
210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *
220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * SUCH DAMAGE.
330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifndef _GENLIST_H
360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define _GENLIST_H
370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/queue.h>
390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* See the bottom of genlist.c for example use. */
410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* This declares 'struct genlist' */
430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih WangTAILQ_HEAD(genlist, genlist_entry);
440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* This is where the data are actually stored. */
460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct genlist_entry {
470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	void *data;
480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	TAILQ_ENTRY(genlist_entry) chain;
490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* This function returns an initialized list head. */
520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct genlist *genlist_init (void);
530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Insert an entry at the beginning/end og the list. */
550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct genlist_entry *genlist_insert (struct genlist *head, void *data);
560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct genlist_entry *genlist_append (struct genlist *head, void *data);
570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Create a function with this prototype for use with genlist_foreach().
590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * See genlist_foreach() description below for details. */
600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangtypedef void *(genlist_func_t)(void *entry, void *arg);
610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Traverse the list and call 'func' for each entry.  As long as func() returns
630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * NULL the list traversal continues, once it returns non-NULL (usually the
640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 'entry' arg), the list traversal exits and the return value is returned
650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * further from genlist_foreach(). Optional 'arg' may be passed to func(), e.g.
660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * for some lookup purposes, etc. */
670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid *genlist_foreach (struct genlist *head, genlist_func_t func, void *arg);
680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Get first entry in list if head is not NULL, otherwise get next
700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * entry based on saved position in list from previous call as stored in buf.
710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * If buf is NULL no position is saved */
720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid *genlist_next (struct genlist *head, struct genlist_entry **buf);
730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Create a function with this prototype for use with genlist_free()
750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * to free any storage associated with genlist_entry.data */
760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangtypedef void (genlist_freedata_t)(void *entry);
770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Free all storage associated with list at head using func to free any
790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * alloc()d data in data field of genlist_entry */
800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid genlist_free (struct genlist *head, genlist_freedata_t func);
810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif /* _GENLIST_H */
83