Import upstream 2.3.14
[packages/xinetd.git] / libs / src / pset / pset.h
1 /*
2  * (c) Copyright 1992, 1993 by Panagiotis Tsirigotis
3  * All rights reserved.  The file named COPYRIGHT specifies the terms 
4  * and conditions for redistribution.
5  */
6
7 #ifndef __PSET_H
8 #define __PSET_H
9
10 /*
11  * $Id: pset.h,v 1.2 2003/03/09 19:27:08 steveg Exp $
12  */
13
14 #include <stdlib.h>
15
16 typedef void *__pset_pointer ;
17
18 struct __pset
19 {
20    unsigned alloc_step ;
21    __pset_pointer *ptrs ;   /* void Pointer to a Pointer */
22    unsigned max ;
23    unsigned count ;
24 } ;
25
26
27 /*
28  * INTERFACE
29  */
30
31 typedef struct __pset *pset_h ;
32
33 pset_h pset_create( unsigned alloc_start, unsigned alloc_step );
34 void pset_destroy( pset_h pset );
35
36 void pset_delete( pset_h pset, const __pset_pointer ptr );
37 __pset_pointer pset_add( pset_h pset, const __pset_pointer ptr );
38
39 /* These 2 are in ops.c   */
40 void pset_compact( pset_h pset );
41 void pset_apply( pset_h pset, void (*func)(), void *arg );
42
43 /*
44  * Macros
45  */
46
47 #define pset_remove( pset, ptr )   pset_delete( pset, (__pset_pointer)(ptr) )
48
49 #define pset_remove_index( pset, i )                          \
50       {                                                       \
51          if ( ((unsigned)i) < (pset)->count )                 \
52              pset_delete(pset, (pset)->ptrs[ (unsigned)(i) ]);  \
53       }
54
55 #define pset_clear( pset )           (pset)->count = 0
56 #define pset_count( pset )           (pset)->count
57 #define pset_pointer( pset, i )      (pset)->ptrs[ (unsigned)(i) ]
58
59 #define pset_sort( pset, compfunc )                         \
60       (void) qsort( (char *) &pset_pointer( pset, 0 ),      \
61             pset_count( pset ), sizeof( __pset_pointer ), compfunc )
62
63 /*
64  * PSET iterators
65  *
66  * Note that the iterators do NOT use any knowledge about the internals
67  * of pset's.
68  */
69 struct __pset_iterator
70 {
71    pset_h pset ;
72    unsigned current ;
73    int step ;
74 } ;
75
76 typedef struct __pset_iterator *psi_h ;
77 void psi_remove( psi_h iter );
78
79 #define __psi_current( iter )                             \
80    ( (iter)->current < pset_count( (iter)->pset )         \
81       ? pset_pointer( (iter)->pset, (iter)->current )     \
82       : NULL )
83
84 #define psi_start( iter )                                 \
85       ( (iter)->current = 0, (iter)->step = 1,            \
86                __psi_current( iter ) )
87
88 #define psi_next( iter )                   \
89       ( (iter)->current += (iter)->step, (iter)->step = 1,   \
90                __psi_current( iter ) )
91
92 #define psi_destroy( iter )          free( (char *) iter )
93
94 psi_h psi_create( pset_h pset );
95
96 #endif   /* __PSET_H */