hlst.h
上传用户:tjescc
上传日期:2021-02-23
资源大小:419k
文件大小:7k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2.  *          Copyright (c) mjh-EDV Beratung, 1996-1999
  3.  *     mjh-EDV Beratung - 63263 Neu-Isenburg - Rosenstrasse 12
  4.  *          Tel +49 6102 328279 - Fax +49 6102 328278
  5.  *                Email info@mjh.teddy-net.com
  6.  *
  7.  *       Author: Jordan Hrycaj <jordan@mjh.teddy-net.com>
  8.  *
  9.  *    $Id: hlst.h,v 1.12 2001/03/04 21:26:24 jordan Exp $ 
  10.  *
  11.  *   This library is free software; you can redistribute it and/or
  12.  *   modify it under the terms of the GNU Library General Public
  13.  *   License as published by the Free Software Foundation; either
  14.  *   version 2 of the License, or (at your option) any later version.
  15.  *
  16.  *   This library is distributed in the hope that it will be useful,
  17.  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19.  *   Library General Public License for more details.
  20.  *
  21.  *   You should have received a copy of the GNU Library General Public
  22.  *   License along with this library; if not, write to the Free
  23.  *   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24.  *
  25.  *
  26.  *   HLST - a simple hash list
  27.  */
  28. #ifndef __HLST_H__
  29. #define __HLST_H__
  30. #ifdef ENABLE_RHLST
  31. #define __RHLST_EXPORTS_H__
  32. #include "rhlst.h"
  33. #endif /* ENABLE_RHLST */
  34. #ifdef __HLST_INTERNAL__
  35. typedef 
  36. struct _hsrch { /* walk through the list */
  37.   struct _hlst     *hlist ; /* current hash list, to walk on */
  38.   unsigned      bucket_id ; /* current bucket */
  39.   struct _hashqueue *ntry ; /* pointer to the next entry */
  40.   struct _hsrch     *next ; /* more such entries */
  41. # ifdef ENABLE_RHLST
  42.   void (*clup)(void*)     ; /* for remote list processing */
  43.   void  *clup_state ;
  44. # endif /* ENABLE_RHLST */
  45. } hsrch ;
  46. typedef
  47. struct _hash_defs { /* hash list parameters */
  48.   unsigned  mod ; /* number of buckets */
  49.   unsigned  fac ; /* shift by multiplication */
  50. } hash_defs ;
  51. #ifndef ENABLE_RHLST
  52. typedef struct _rhlst {void* unused;} rlst;
  53. #endif /* ENABLE_RHLST */
  54. typedef 
  55. struct _hlst { /* hash list descriptor */
  56.   struct _sorter *access; /* there might be an index on that list */
  57.   struct _rhlst *raccess; /* extensions */
  58.   int (*sorter_fn)(void*,const char*,unsigned,const char*,unsigned);
  59.   void *sorter_desc ; /* custom sort of the entries */
  60.   void *clup_state ;
  61.   void (*clup) /* call back destructor for entries */
  62.        (void*,void*,char*,unsigned);
  63.   hash_defs       z ; /* hash parameters for this list */
  64.   struct _hsrch *walk ; /* list: walk through the hash list */
  65.   unsigned total_entries ; /* number of entries in the list */
  66.   void *bucket [1] ; /* varable length array of buckets */
  67.   /* varable length, pointer aligned  */
  68. } hlst ;
  69. #else
  70. typedef struct _hlst  {char opaq;} hlst;
  71. typedef struct _hsrch {char opaq;} hsrch;
  72. #endif
  73. #ifdef ENABLE_RHLST
  74. #undef __RHLST_H__
  75. #undef __RHLST_EXPORTS_H__
  76. #include "rhlst.h"
  77. #endif /* ENABLE_RHLST */
  78. /* open/close management */
  79. extern hlst *create_hlst 
  80.   (unsigned estimated_size_hint, 
  81.    /* this function is called when non-empty slots are removed, if the
  82.       list is destroyed, the last call will be destroy(state,0,0,0). Apart
  83.       from the last call, the detroy function will only be called with a
  84.       non NULL item, */
  85.    void (*destroy)(void *state, void* item, char* key, unsigned keylen), 
  86.    void* state) ;
  87. extern hlst *copy_hlst 
  88.   (hlst *to_be_copied,
  89.    /* leave the estimated_size_hint 0 to use the parameters from the
  90.       list to_be_copied */
  91.    unsigned estimated_size_hint, 
  92.    /* The copy() function is called when an entry is to be copied and
  93.       inserted into the copied slot - leave it empty to copy a list with
  94.       keys but without inserted data, only. This function is only used for
  95.       duplicating the list. Upon copy() returning NULL while errno set to
  96.       a non-NULL value, copying is stopped and the partly allocated list
  97.       is removed using destroy_hlst(). In this case, the copy_hlst() 
  98.       function returns NULL while errno is set as passed from the copy() 
  99.       function. */
  100.    void *(*copy) (void *cpstate, void* item, char *key, unsigned keylen),
  101.    void *cpstate,
  102.    /* The destroy() function is called when non-empty slots are removed,
  103.       if the list is destroyed, the last call will be destroy(state,0,0,0) 
  104.       This function is registered, internally to be used later on.Apart
  105.       from the last call, the detroy function will only be called with a
  106.       non NULL item, */
  107.    void (*destroy)(void *state, void* item, char* key, unsigned keylen), 
  108.    void* state) ;
  109. /* global factor to be applied internally to any estimated_size_hint */
  110. extern unsigned compress_hlst_index (unsigned size_hint_percentage);
  111. extern void destroy_hlst (hlst*);
  112. extern void   flush_hlst 
  113.    (hlst*,
  114.     /* can have another destroy function, here, uses the default
  115.        assigned in chreate_hlst, if the destroy argument is NULL */
  116.     void (*destroy)(void*,void*,char*,unsigned), void*state);
  117. /* find an existing slot, len == 0 means: key is ascii string */
  118. extern void** find_hlst (hlst*, const char *key, unsigned len);
  119. /* create a non existing slot, otherwise error
  120.    len == 0 means: key is ascii string */
  121. extern void** make_hlst (hlst*, const char *key, unsigned len);
  122. /* delete slot (-1 == error), len == 0 means: key is ascii string */
  123. extern int delete_hlst (hlst*, const char *key, unsigned len);
  124. /* for a given (void**) ptr value as returned by {find|make}_hlst,
  125.    retrieve the korresponding key and its length */
  126. extern char    *query_key_hlst    (void **);
  127. extern unsigned query_keylen_hlst (void **);
  128. #ifdef ENABLE_RHLST
  129. /* sets/returns a transaction number associated with the entry */
  130. extern int query_tranum_hlst (void **);
  131. extern int   set_tranum_hlst (void **, int);
  132. #endif /* ENABLE_RHLST */
  133. /* returns the number of elements in the argument list (might be NULL) */
  134. extern unsigned query_hlst_size (hlst *);
  135. /* applying a function fn () to all list elements */
  136. extern int for_hlst_do
  137.   (hlst *,
  138.    /* if the argunemt function returns non 0 while the algorithm is running,
  139.       the rest of the items not visited yet are skipped and for_hlst_do ()
  140.       returns with the value passed by this function. */
  141.    int (*fn)(void *state, void *, char *key, unsigned keylen),
  142.    void *state) ;
  143. /* searching step wise through all elements */
  144. extern hsrch* open_hlst_search (hlst*) ;
  145. extern void** next_hlst_search (hsrch*) ;
  146. extern void  close_hlst_search (hsrch*) ;
  147. /* sorter stuff */
  148. extern void   sort_hlst (hlst*);
  149. extern void  **inx_hlst (hlst*,unsigned);
  150. extern void unsort_hlst (hlst*);
  151. /* custom sort */
  152. extern int csort_hlst
  153.   (hlst*,
  154.    /* custom comparison function for qsort */
  155.    int (*)(void *desc,
  156.    const char  *left_key, unsigned  left_klen,
  157.    const char *right_key, unsigned right_klen),
  158.    void *desc);
  159. /* statistics etc. */
  160. extern int  hlst_buckets (hlst*);
  161. extern void hlst_statistics /* statistics, fn may be NULL to use the default */
  162.   (hlst *h, void (*fn) (void*state, unsigned bucket_fill), void *state) ;
  163. #endif /* __HLST_H__ */