|
@ -0,0 +1,85 @@ |
|
|
|
|
|
#ifndef OHASH_H |
|
|
|
|
|
#define OHASH_H |
|
|
|
|
|
/* $OpenBSD: ohash.h,v 1.1 2001/03/02 13:27:05 espie Exp $ */ |
|
|
|
|
|
/* ex:ts=8 sw=4: |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
|
* Copyright (c) 1999 Marc Espie. |
|
|
|
|
|
* |
|
|
|
|
|
* Code written for the OpenBSD project. |
|
|
|
|
|
* |
|
|
|
|
|
* Redistribution and use in source and binary forms, with or without |
|
|
|
|
|
* modification, are permitted provided that the following conditions |
|
|
|
|
|
* are met: |
|
|
|
|
|
* 1. Redistributions of source code must retain the above copyright |
|
|
|
|
|
* notice, this list of conditions and the following disclaimer. |
|
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright |
|
|
|
|
|
* notice, this list of conditions and the following disclaimer in the |
|
|
|
|
|
* documentation and/or other materials provided with the distribution. |
|
|
|
|
|
* |
|
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS |
|
|
|
|
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
|
|
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBSD |
|
|
|
|
|
* PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
|
|
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
|
|
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/* Open hashing support. |
|
|
|
|
|
* Open hashing was chosen because it is much lighter than other hash |
|
|
|
|
|
* techniques, and more efficient in most cases. |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
struct ohash_info { |
|
|
|
|
|
ptrdiff_t key_offset; |
|
|
|
|
|
void *data; /* user data */ |
|
|
|
|
|
void *(*halloc) __P((size_t, void *)); |
|
|
|
|
|
void (*hfree) __P((void *, size_t, void *)); |
|
|
|
|
|
void *(*alloc) __P((size_t, void *)); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
struct _ohash_record; |
|
|
|
|
|
|
|
|
|
|
|
struct ohash { |
|
|
|
|
|
struct _ohash_record *t; |
|
|
|
|
|
struct ohash_info info; |
|
|
|
|
|
unsigned int size; |
|
|
|
|
|
unsigned int total; |
|
|
|
|
|
unsigned int deleted; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/* For this to be tweakable, we use small primitives, and leave part of the |
|
|
|
|
|
* logic to the client application. e.g., hashing is left to the client |
|
|
|
|
|
* application. We also provide a simple table entry lookup that yields |
|
|
|
|
|
* a hashing table index (opaque) to be used in find/insert/remove. |
|
|
|
|
|
* The keys are stored at a known position in the client data. |
|
|
|
|
|
*/ |
|
|
|
|
|
__BEGIN_DECLS |
|
|
|
|
|
void ohash_init __P((struct ohash *, unsigned, struct ohash_info *)); |
|
|
|
|
|
void ohash_delete __P((struct ohash *)); |
|
|
|
|
|
|
|
|
|
|
|
unsigned int ohash_lookup_string __P((struct ohash *, const char *, u_int32_t)); |
|
|
|
|
|
unsigned int ohash_lookup_interval __P((struct ohash *, const char *, \ |
|
|
|
|
|
const char *, u_int32_t)); |
|
|
|
|
|
unsigned int ohash_lookup_memory __P((struct ohash *, const char *, \ |
|
|
|
|
|
size_t, u_int32_t)); |
|
|
|
|
|
void *ohash_find __P((struct ohash *, unsigned int)); |
|
|
|
|
|
void *ohash_remove __P((struct ohash *, unsigned int)); |
|
|
|
|
|
void *ohash_insert __P((struct ohash *, unsigned int, void *)); |
|
|
|
|
|
void *ohash_first __P((struct ohash *, unsigned int *)); |
|
|
|
|
|
void *ohash_next __P((struct ohash *, unsigned int *)); |
|
|
|
|
|
unsigned int ohash_entries __P((struct ohash *)); |
|
|
|
|
|
|
|
|
|
|
|
void *ohash_create_entry __P((struct ohash_info *, const char *, const char **)); |
|
|
|
|
|
u_int32_t ohash_interval __P((const char *, const char **)); |
|
|
|
|
|
|
|
|
|
|
|
unsigned int ohash_qlookupi __P((struct ohash *, const char *, const char **)); |
|
|
|
|
|
unsigned int ohash_qlookup __P((struct ohash *, const char *)); |
|
|
|
|
|
__END_DECLS |
|
|
|
|
|
#endif |