home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / security / xinetd / pset.1.1.1 / pset.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-08  |  3.3 KB  |  139 lines

  1. /*
  2.  * (c) Copyright 1992 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 2.5 1992/10/11 20:38:42 panos Exp $
  12.  */
  13.  
  14. typedef void *__pset_pointer ;
  15.  
  16. struct __pset
  17. {
  18.     unsigned alloc_step ;
  19.     __pset_pointer *ptrs ;
  20.     unsigned max ;
  21.     unsigned count ;
  22. } ;
  23.  
  24.  
  25. /*
  26.  * INTERFACE
  27.  */
  28.  
  29. #ifdef __ARGS
  30. #undef __ARGS
  31. #endif
  32.  
  33. #ifdef PROTOTYPES
  34. #  define __ARGS( s )               s
  35. #else
  36. #  define __ARGS( s )               ()
  37. #endif
  38.  
  39. typedef struct __pset *pset_h ;
  40.  
  41. pset_h pset_create __ARGS( ( unsigned start, unsigned step ) ) ;
  42. void pset_destroy __ARGS( ( pset_h ) ) ;
  43.  
  44. __pset_pointer pset_insert __ARGS( ( pset_h, __pset_pointer ) ) ;
  45. void pset_delete __ARGS( ( pset_h, __pset_pointer ) ) ;
  46.  
  47. /*
  48.  * Macros
  49.  */
  50.  
  51. #undef __CONCAT
  52. #ifdef __STDC__
  53. #define __CONCAT(s1,s2)                s1##s2
  54. #else
  55. #undef __SAME
  56. #define __SAME(s)                        s
  57. #define __CONCAT(s1,s2)                __SAME(s1)s2
  58. #endif
  59.  
  60. #define pset_static(name)    \
  61.             struct __pset __CONCAT(name,_pset), * name = & __CONCAT(name,_pset)
  62.  
  63. #define pset_add( pset, ptr )                                               \
  64.       (                                                                 \
  65.          ( (pset)->count < (pset)->max )                                \
  66.             ? (pset)->ptrs[ (pset)->count++ ] = (__pset_pointer) ptr    \
  67.             : ( pset_insert( (pset), (__pset_pointer) ptr )                    \
  68.                         ? (__pset_pointer) (ptr)                                        \
  69.                         : 0                                                                    \
  70.                   )                                                                             \
  71.       )
  72.  
  73. #define pset_remove( pset, ptr )            pset_delete( pset, (__pset_pointer)ptr )
  74.  
  75. #define pset_remove_index( pset, i )                                                \
  76.         {                                                                                        \
  77.             if ( (i) < (pset)->count )                                                    \
  78.                  (pset)->ptrs[ i ] = (pset)->ptrs[ --(pset)->count ] ;        \
  79.         }
  80.  
  81. #define pset_clear( pset )                (pset)->count = 0
  82. #define pset_count( pset )                (pset)->count
  83. #define pset_pointer( pset, i )        (pset)->ptrs[ i ]
  84. #define pset_freeall( pset )                                                            \
  85.         {                                                                                        \
  86.             int i ;                                                                            \
  87.                                                                                                 \
  88.             for ( i = 0 ; i < pset_count( pset ) ; i++ )                            \
  89.                 (void) free( (char *) pset_pointer( pset, i ) ) ;                \
  90.         }
  91.  
  92.  
  93. /*
  94.  * PSET iterators
  95.  * 
  96.  * Note that the iterators do NOT use any knowledge about the internals
  97.  * of pset's.
  98.  */
  99. struct __pset_iterator
  100. {
  101.     pset_h pset ;
  102.     unsigned current ;
  103.     int step ;
  104. } ;
  105.  
  106. typedef struct __pset_iterator *psi_h ;
  107.  
  108.  
  109. #define __psi_current( iter )                                                            \
  110.                         ( (iter)->current < pset_count( (iter)->pset )            \
  111.                             ? pset_pointer( (iter)->pset, (iter)->current )        \
  112.                             : NULL )
  113.  
  114. #define psi_start( iter )                                                            \
  115.                     ( (iter)->current = 0, (iter)->step = 1,                        \
  116.                     __psi_current( iter ) )
  117.  
  118. #define psi_next( iter )                                                             \
  119.                     ( (iter)->current += (iter)->step, (iter)->step = 1,        \
  120.                     __psi_current( iter ) )
  121.  
  122. #define psi_remove( iter )                                                            \
  123.                 {                                                                                \
  124.                     if ( (iter)->current < pset_count( (iter)->pset ) )        \
  125.                     {                                                                            \
  126.                         pset_remove_index( (iter)->pset, (iter)->current ) ;    \
  127.                         (iter)->step = 0 ;                                                \
  128.                     }                                                                            \
  129.                 }
  130.  
  131. #define psi_reset( iter, newpset )        (iter)->pset = (newpset)
  132.  
  133. #define psi_destroy( iter )                free( (char *) iter )
  134.  
  135. psi_h psi_create __ARGS( ( pset_h ) ) ;
  136.  
  137. #endif    /* __PSET_H */
  138.  
  139.