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
8 #include "config.h"
9 #include "pset.h"
10 #include <stdlib.h>
11
12 #define POINTER __pset_pointer
13
14
15 /*
16 * Remove all NULL pointers from a pset
17 */
pset_compact(register pset_h pset)18 void pset_compact( register pset_h pset )
19 {
20 register unsigned u ;
21
22 for ( u = 0 ; u < pset_count( pset ) ; )
23 {
24 POINTER ptr = pset_pointer( pset, u );
25 if ( ptr != NULL )
26 u++ ;
27 else
28 pset_delete( pset, ptr ) ;
29 }
30
31 /* See if we can reclaim some memory, make sure we are 2 below for some hysteresis */
32 if ((int)( pset->max - pset->alloc_step - 2) > (int)pset_count( pset ))
33 { /* This rounds up to the next unit of steps */
34 POINTER *new_ptrs ;
35 unsigned new_max = ((pset_count( pset ) / pset->alloc_step) + 1)*pset->alloc_step;
36
37 new_ptrs = (POINTER *) realloc(
38 (char *)pset->ptrs, new_max * sizeof( POINTER ) ) ;
39 if ( new_ptrs == NULL )
40 return;
41 pset->max = new_max ;
42 pset->ptrs = new_ptrs ;
43 }
44 }
45
46
47 /*
48 * Apply a function to all pointers of a pset
49 */
pset_apply(register pset_h pset,void (* func)(),register void * arg)50 void pset_apply( register pset_h pset, void (*func)(), register void *arg )
51 {
52 register unsigned u ;
53
54 for ( u = 0 ; u < pset_count( pset ) ; u++ )
55 if ( arg )
56 (*func)( arg, pset_pointer( pset, u ) ) ;
57 else
58 (*func)( pset_pointer( pset, u ) ) ;
59 }
60
61