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