Home | History | Annotate | Line # | Download | only in make
lst.h revision 1.1.1.2
      1      1.1  cgd /*
      2  1.1.1.2  tls  * Copyright (c) 1988, 1989, 1990, 1993
      3  1.1.1.2  tls  *	The Regents of the University of California.  All rights reserved.
      4      1.1  cgd  * Copyright (c) 1989 by Berkeley Softworks
      5      1.1  cgd  * All rights reserved.
      6      1.1  cgd  *
      7      1.1  cgd  * This code is derived from software contributed to Berkeley by
      8      1.1  cgd  * Adam de Boor.
      9      1.1  cgd  *
     10      1.1  cgd  * Redistribution and use in source and binary forms, with or without
     11      1.1  cgd  * modification, are permitted provided that the following conditions
     12      1.1  cgd  * are met:
     13      1.1  cgd  * 1. Redistributions of source code must retain the above copyright
     14      1.1  cgd  *    notice, this list of conditions and the following disclaimer.
     15      1.1  cgd  * 2. Redistributions in binary form must reproduce the above copyright
     16      1.1  cgd  *    notice, this list of conditions and the following disclaimer in the
     17      1.1  cgd  *    documentation and/or other materials provided with the distribution.
     18      1.1  cgd  * 3. All advertising materials mentioning features or use of this software
     19      1.1  cgd  *    must display the following acknowledgement:
     20      1.1  cgd  *	This product includes software developed by the University of
     21      1.1  cgd  *	California, Berkeley and its contributors.
     22      1.1  cgd  * 4. Neither the name of the University nor the names of its contributors
     23      1.1  cgd  *    may be used to endorse or promote products derived from this software
     24      1.1  cgd  *    without specific prior written permission.
     25      1.1  cgd  *
     26      1.1  cgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     27      1.1  cgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     28      1.1  cgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     29      1.1  cgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     30      1.1  cgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     31      1.1  cgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     32      1.1  cgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     33      1.1  cgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     34      1.1  cgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     35      1.1  cgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     36      1.1  cgd  * SUCH DAMAGE.
     37      1.1  cgd  *
     38  1.1.1.2  tls  *	@(#)lst.h	8.2 (Berkeley) 4/28/95
     39      1.1  cgd  */
     40      1.1  cgd 
     41      1.1  cgd /*-
     42      1.1  cgd  * lst.h --
     43      1.1  cgd  *	Header for using the list library
     44      1.1  cgd  */
     45      1.1  cgd #ifndef _LST_H_
     46      1.1  cgd #define _LST_H_
     47      1.1  cgd 
     48      1.1  cgd #include	<sprite.h>
     49  1.1.1.2  tls #if __STDC__
     50  1.1.1.2  tls #include	<stdlib.h>
     51  1.1.1.2  tls #endif
     52      1.1  cgd 
     53      1.1  cgd /*
     54      1.1  cgd  * basic typedef. This is what the Lst_ functions handle
     55      1.1  cgd  */
     56      1.1  cgd 
     57      1.1  cgd typedef	struct	Lst	*Lst;
     58      1.1  cgd typedef	struct	LstNode	*LstNode;
     59      1.1  cgd 
     60      1.1  cgd #define	NILLST		((Lst) NIL)
     61      1.1  cgd #define	NILLNODE	((LstNode) NIL)
     62      1.1  cgd 
     63      1.1  cgd /*
     64      1.1  cgd  * NOFREE can be used as the freeProc to Lst_Destroy when the elements are
     65      1.1  cgd  *	not to be freed.
     66      1.1  cgd  * NOCOPY performs similarly when given as the copyProc to Lst_Duplicate.
     67      1.1  cgd  */
     68  1.1.1.2  tls #define NOFREE		((void (*) __P((ClientData))) 0)
     69  1.1.1.2  tls #define NOCOPY		((ClientData (*) __P((ClientData))) 0)
     70      1.1  cgd 
     71      1.1  cgd #define LST_CONCNEW	0   /* create new LstNode's when using Lst_Concat */
     72      1.1  cgd #define LST_CONCLINK	1   /* relink LstNode's when using Lst_Concat */
     73      1.1  cgd 
     74      1.1  cgd /*
     75      1.1  cgd  * Creation/destruction functions
     76      1.1  cgd  */
     77  1.1.1.2  tls /* Create a new list */
     78  1.1.1.2  tls Lst		Lst_Init __P((Boolean));
     79  1.1.1.2  tls /* Duplicate an existing list */
     80  1.1.1.2  tls Lst		Lst_Duplicate __P((Lst, ClientData (*)(ClientData)));
     81  1.1.1.2  tls /* Destroy an old one */
     82  1.1.1.2  tls void		Lst_Destroy __P((Lst, void (*)(ClientData)));
     83  1.1.1.2  tls /* True if list is empty */
     84  1.1.1.2  tls Boolean		Lst_IsEmpty __P((Lst));
     85      1.1  cgd 
     86      1.1  cgd /*
     87      1.1  cgd  * Functions to modify a list
     88      1.1  cgd  */
     89  1.1.1.2  tls /* Insert an element before another */
     90  1.1.1.2  tls ReturnStatus	Lst_Insert __P((Lst, LstNode, ClientData));
     91  1.1.1.2  tls /* Insert an element after another */
     92  1.1.1.2  tls ReturnStatus	Lst_Append __P((Lst, LstNode, ClientData));
     93  1.1.1.2  tls /* Place an element at the front of a lst. */
     94  1.1.1.2  tls ReturnStatus	Lst_AtFront __P((Lst, ClientData));
     95  1.1.1.2  tls /* Place an element at the end of a lst. */
     96  1.1.1.2  tls ReturnStatus	Lst_AtEnd __P((Lst, ClientData));
     97  1.1.1.2  tls /* Remove an element */
     98  1.1.1.2  tls ReturnStatus	Lst_Remove __P((Lst, LstNode));
     99  1.1.1.2  tls /* Replace a node with a new value */
    100  1.1.1.2  tls ReturnStatus	Lst_Replace __P((LstNode, ClientData));
    101  1.1.1.2  tls /* Concatenate two lists */
    102  1.1.1.2  tls ReturnStatus	Lst_Concat __P((Lst, Lst, int));
    103      1.1  cgd 
    104      1.1  cgd /*
    105      1.1  cgd  * Node-specific functions
    106      1.1  cgd  */
    107  1.1.1.2  tls /* Return first element in list */
    108  1.1.1.2  tls LstNode		Lst_First __P((Lst));
    109  1.1.1.2  tls /* Return last element in list */
    110  1.1.1.2  tls LstNode		Lst_Last __P((Lst));
    111  1.1.1.2  tls /* Return successor to given element */
    112  1.1.1.2  tls LstNode		Lst_Succ __P((LstNode));
    113  1.1.1.2  tls /* Get datum from LstNode */
    114  1.1.1.2  tls ClientData	Lst_Datum __P((LstNode));
    115      1.1  cgd 
    116      1.1  cgd /*
    117      1.1  cgd  * Functions for entire lists
    118      1.1  cgd  */
    119  1.1.1.2  tls /* Find an element in a list */
    120  1.1.1.2  tls LstNode		Lst_Find __P((Lst, ClientData,
    121  1.1.1.2  tls 			      int (*)(ClientData, ClientData)));
    122  1.1.1.2  tls /* Find an element starting from somewhere */
    123  1.1.1.2  tls LstNode		Lst_FindFrom __P((Lst, LstNode, ClientData,
    124  1.1.1.2  tls 				  int (*cProc)(ClientData, ClientData)));
    125  1.1.1.2  tls /*
    126  1.1.1.2  tls  * See if the given datum is on the list. Returns the LstNode containing
    127  1.1.1.2  tls  * the datum
    128  1.1.1.2  tls  */
    129  1.1.1.2  tls LstNode		Lst_Member __P((Lst, ClientData));
    130  1.1.1.2  tls /* Apply a function to all elements of a lst */
    131  1.1.1.2  tls void		Lst_ForEach __P((Lst, int (*)(ClientData, ClientData),
    132  1.1.1.2  tls 				 ClientData));
    133  1.1.1.2  tls /*
    134  1.1.1.2  tls  * Apply a function to all elements of a lst starting from a certain point.
    135  1.1.1.2  tls  * If the list is circular, the application will wrap around to the
    136  1.1.1.2  tls  * beginning of the list again.
    137  1.1.1.2  tls  */
    138  1.1.1.2  tls void		Lst_ForEachFrom __P((Lst, LstNode,
    139  1.1.1.2  tls 				     int (*)(ClientData, ClientData),
    140  1.1.1.2  tls 				     ClientData));
    141      1.1  cgd /*
    142      1.1  cgd  * these functions are for dealing with a list as a table, of sorts.
    143      1.1  cgd  * An idea of the "current element" is kept and used by all the functions
    144      1.1  cgd  * between Lst_Open() and Lst_Close().
    145      1.1  cgd  */
    146  1.1.1.2  tls /* Open the list */
    147  1.1.1.2  tls ReturnStatus	Lst_Open __P((Lst));
    148  1.1.1.2  tls /* Next element please */
    149  1.1.1.2  tls LstNode		Lst_Next __P((Lst));
    150  1.1.1.2  tls /* Done yet? */
    151  1.1.1.2  tls Boolean		Lst_IsAtEnd __P((Lst));
    152  1.1.1.2  tls /* Finish table access */
    153  1.1.1.2  tls void		Lst_Close __P((Lst));
    154      1.1  cgd 
    155      1.1  cgd /*
    156      1.1  cgd  * for using the list as a queue
    157      1.1  cgd  */
    158  1.1.1.2  tls /* Place an element at tail of queue */
    159  1.1.1.2  tls ReturnStatus	Lst_EnQueue __P((Lst, ClientData));
    160  1.1.1.2  tls /* Remove an element from head of queue */
    161  1.1.1.2  tls ClientData	Lst_DeQueue __P((Lst));
    162      1.1  cgd 
    163  1.1.1.2  tls #endif /* _LST_H_ */
    164