From 1361eb69ee3841bf74ddfb7e196814becf3a59fc Mon Sep 17 00:00:00 2001 From: espie <> Date: Fri, 2 Mar 2001 13:27:05 +0000 Subject: [PATCH] Add ohash_* functions to libc. Ok'd deraadt@, millert@ --- src/include/Makefile | 5 +-- src/include/ohash.h | 85 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/include/ohash.h diff --git a/src/include/Makefile b/src/include/Makefile index 87257d02..f3142a26 100644 --- a/src/include/Makefile +++ b/src/include/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.88 2000/12/18 16:51:49 brad Exp $ +# $OpenBSD: Makefile,v 1.89 2001/03/02 13:27:04 espie Exp $ # $NetBSD: Makefile,v 1.59 1996/05/15 21:36:43 jtc Exp $ # @(#)Makefile 5.45.1.1 (Berkeley) 5/6/91 @@ -13,7 +13,8 @@ FILES= a.out.h ar.h assert.h bitstring.h blf.h bm.h bsd_auth.h cast.h cpio.h \ fnmatch.h fstab.h fts.h glob.h grp.h ifaddrs.h inttypes.h \ iso646.h kvm.h langinfo.h libgen.h limits.h locale.h login_cap.h \ malloc.h math.h md4.h md5.h memory.h mpool.h ndbm.h netdb.h netgroup.h \ - nlist.h nl_types.h olf_abi.h paths.h poll.h pwd.h ranlib.h re_comp.h \ + nlist.h nl_types.h ohash.h olf_abi.h paths.h poll.h pwd.h \ + ranlib.h re_comp.h \ readpassphrase.h regex.h resolv.h rmd160.h search.h setjmp.h sgtty.h \ sha1.h skipjack.h signal.h stab.h stdbool.h stddef.h stdio.h stdlib.h \ string.h strings.h struct.h sysexits.h tar.h time.h ttyent.h tzfile.h \ diff --git a/src/include/ohash.h b/src/include/ohash.h new file mode 100644 index 00000000..2c6f3aed --- /dev/null +++ b/src/include/ohash.h @@ -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