1*83ee113eSDavid van Moolenbroek /* $NetBSD: hash.h,v 1.1.1.3 2014/07/12 11:57:57 spz Exp $ */ 2*83ee113eSDavid van Moolenbroek /* hash.h 3*83ee113eSDavid van Moolenbroek 4*83ee113eSDavid van Moolenbroek Definitions for hashing... */ 5*83ee113eSDavid van Moolenbroek 6*83ee113eSDavid van Moolenbroek /* 7*83ee113eSDavid van Moolenbroek * Copyright (c) 2004,2009,2014 by Internet Systems Consortium, Inc. ("ISC") 8*83ee113eSDavid van Moolenbroek * Copyright (c) 1995-2003 by Internet Software Consortium 9*83ee113eSDavid van Moolenbroek * 10*83ee113eSDavid van Moolenbroek * Permission to use, copy, modify, and distribute this software for any 11*83ee113eSDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above 12*83ee113eSDavid van Moolenbroek * copyright notice and this permission notice appear in all copies. 13*83ee113eSDavid van Moolenbroek * 14*83ee113eSDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 15*83ee113eSDavid van Moolenbroek * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 16*83ee113eSDavid van Moolenbroek * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 17*83ee113eSDavid van Moolenbroek * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 18*83ee113eSDavid van Moolenbroek * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 19*83ee113eSDavid van Moolenbroek * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 20*83ee113eSDavid van Moolenbroek * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 21*83ee113eSDavid van Moolenbroek * 22*83ee113eSDavid van Moolenbroek * Internet Systems Consortium, Inc. 23*83ee113eSDavid van Moolenbroek * 950 Charter Street 24*83ee113eSDavid van Moolenbroek * Redwood City, CA 94063 25*83ee113eSDavid van Moolenbroek * <info@isc.org> 26*83ee113eSDavid van Moolenbroek * https://www.isc.org/ 27*83ee113eSDavid van Moolenbroek * 28*83ee113eSDavid van Moolenbroek */ 29*83ee113eSDavid van Moolenbroek 30*83ee113eSDavid van Moolenbroek #ifndef OMAPI_HASH_H 31*83ee113eSDavid van Moolenbroek #define OMAPI_HASH_H 32*83ee113eSDavid van Moolenbroek 33*83ee113eSDavid van Moolenbroek #if !defined (DEFAULT_HASH_SIZE) 34*83ee113eSDavid van Moolenbroek # define DEFAULT_HASH_SIZE 9973 35*83ee113eSDavid van Moolenbroek #endif 36*83ee113eSDavid van Moolenbroek 37*83ee113eSDavid van Moolenbroek #if !defined (KEY_HASH_SIZE) 38*83ee113eSDavid van Moolenbroek # define KEY_HASH_SIZE 1009 39*83ee113eSDavid van Moolenbroek #endif 40*83ee113eSDavid van Moolenbroek 41*83ee113eSDavid van Moolenbroek /* The purpose of the hashed_object_t struct is to not match anything else. */ 42*83ee113eSDavid van Moolenbroek typedef struct { 43*83ee113eSDavid van Moolenbroek int foo; 44*83ee113eSDavid van Moolenbroek } hashed_object_t; 45*83ee113eSDavid van Moolenbroek 46*83ee113eSDavid van Moolenbroek typedef isc_result_t (*hash_foreach_func)(const void *, unsigned, void *); 47*83ee113eSDavid van Moolenbroek typedef int (*hash_reference) (hashed_object_t **, hashed_object_t *, 48*83ee113eSDavid van Moolenbroek const char *, int); 49*83ee113eSDavid van Moolenbroek typedef int (*hash_dereference) (hashed_object_t **, const char *, int); 50*83ee113eSDavid van Moolenbroek 51*83ee113eSDavid van Moolenbroek struct hash_bucket { 52*83ee113eSDavid van Moolenbroek struct hash_bucket *next; 53*83ee113eSDavid van Moolenbroek const unsigned char *name; 54*83ee113eSDavid van Moolenbroek unsigned len; 55*83ee113eSDavid van Moolenbroek hashed_object_t *value; 56*83ee113eSDavid van Moolenbroek }; 57*83ee113eSDavid van Moolenbroek 58*83ee113eSDavid van Moolenbroek typedef int (*hash_comparator_t)(const void *, const void *, size_t); 59*83ee113eSDavid van Moolenbroek 60*83ee113eSDavid van Moolenbroek struct hash_table { 61*83ee113eSDavid van Moolenbroek unsigned hash_count; 62*83ee113eSDavid van Moolenbroek hash_reference referencer; 63*83ee113eSDavid van Moolenbroek hash_dereference dereferencer; 64*83ee113eSDavid van Moolenbroek hash_comparator_t cmp; 65*83ee113eSDavid van Moolenbroek unsigned (*do_hash)(const void *, unsigned, unsigned); 66*83ee113eSDavid van Moolenbroek 67*83ee113eSDavid van Moolenbroek /* This must remain the last entry in this table. */ 68*83ee113eSDavid van Moolenbroek struct hash_bucket *buckets [1]; 69*83ee113eSDavid van Moolenbroek }; 70*83ee113eSDavid van Moolenbroek 71*83ee113eSDavid van Moolenbroek struct named_hash { 72*83ee113eSDavid van Moolenbroek struct named_hash *next; 73*83ee113eSDavid van Moolenbroek const char *name; 74*83ee113eSDavid van Moolenbroek struct hash_table *hash; 75*83ee113eSDavid van Moolenbroek }; 76*83ee113eSDavid van Moolenbroek 77*83ee113eSDavid van Moolenbroek #define HASH_FUNCTIONS_DECL(name, bufarg, type, hashtype) \ 78*83ee113eSDavid van Moolenbroek void name##_hash_add (hashtype *, bufarg, unsigned, type *, \ 79*83ee113eSDavid van Moolenbroek const char *, int); \ 80*83ee113eSDavid van Moolenbroek void name##_hash_delete (hashtype *, bufarg, unsigned, \ 81*83ee113eSDavid van Moolenbroek const char *, int); \ 82*83ee113eSDavid van Moolenbroek int name##_hash_lookup (type **, hashtype *, bufarg, unsigned, \ 83*83ee113eSDavid van Moolenbroek const char *, int); \ 84*83ee113eSDavid van Moolenbroek unsigned char * name##_hash_report(hashtype *); \ 85*83ee113eSDavid van Moolenbroek int name##_hash_foreach (hashtype *, hash_foreach_func); \ 86*83ee113eSDavid van Moolenbroek int name##_new_hash (hashtype **, unsigned, const char *, int); \ 87*83ee113eSDavid van Moolenbroek void name##_free_hash_table (hashtype **, const char *, int); 88*83ee113eSDavid van Moolenbroek 89*83ee113eSDavid van Moolenbroek 90*83ee113eSDavid van Moolenbroek #define HASH_FUNCTIONS(name, bufarg, type, hashtype, ref, deref, hasher) \ 91*83ee113eSDavid van Moolenbroek void name##_hash_add (hashtype *table, \ 92*83ee113eSDavid van Moolenbroek bufarg buf, unsigned len, type *ptr, \ 93*83ee113eSDavid van Moolenbroek const char *file, int line) \ 94*83ee113eSDavid van Moolenbroek { \ 95*83ee113eSDavid van Moolenbroek add_hash ((struct hash_table *)table, buf, \ 96*83ee113eSDavid van Moolenbroek len, (hashed_object_t *)ptr, file, line); \ 97*83ee113eSDavid van Moolenbroek } \ 98*83ee113eSDavid van Moolenbroek \ 99*83ee113eSDavid van Moolenbroek void name##_hash_delete (hashtype *table, bufarg buf, unsigned len, \ 100*83ee113eSDavid van Moolenbroek const char *file, int line) \ 101*83ee113eSDavid van Moolenbroek { \ 102*83ee113eSDavid van Moolenbroek delete_hash_entry ((struct hash_table *)table, buf, len, \ 103*83ee113eSDavid van Moolenbroek file, line); \ 104*83ee113eSDavid van Moolenbroek } \ 105*83ee113eSDavid van Moolenbroek \ 106*83ee113eSDavid van Moolenbroek int name##_hash_lookup (type **ptr, hashtype *table, \ 107*83ee113eSDavid van Moolenbroek bufarg buf, unsigned len, const char *file, int line) \ 108*83ee113eSDavid van Moolenbroek { \ 109*83ee113eSDavid van Moolenbroek return hash_lookup ((hashed_object_t **)ptr, \ 110*83ee113eSDavid van Moolenbroek (struct hash_table *)table, \ 111*83ee113eSDavid van Moolenbroek buf, len, file, line); \ 112*83ee113eSDavid van Moolenbroek } \ 113*83ee113eSDavid van Moolenbroek \ 114*83ee113eSDavid van Moolenbroek unsigned char * name##_hash_report(hashtype *table) \ 115*83ee113eSDavid van Moolenbroek { \ 116*83ee113eSDavid van Moolenbroek return hash_report((struct hash_table *)table); \ 117*83ee113eSDavid van Moolenbroek } \ 118*83ee113eSDavid van Moolenbroek \ 119*83ee113eSDavid van Moolenbroek int name##_hash_foreach (hashtype *table, hash_foreach_func func) \ 120*83ee113eSDavid van Moolenbroek { \ 121*83ee113eSDavid van Moolenbroek return hash_foreach ((struct hash_table *)table, \ 122*83ee113eSDavid van Moolenbroek func); \ 123*83ee113eSDavid van Moolenbroek } \ 124*83ee113eSDavid van Moolenbroek \ 125*83ee113eSDavid van Moolenbroek int name##_new_hash (hashtype **tp, unsigned c, const char *file, int line) \ 126*83ee113eSDavid van Moolenbroek { \ 127*83ee113eSDavid van Moolenbroek return new_hash ((struct hash_table **)tp, \ 128*83ee113eSDavid van Moolenbroek (hash_reference)ref, (hash_dereference)deref, c, \ 129*83ee113eSDavid van Moolenbroek hasher, file, line); \ 130*83ee113eSDavid van Moolenbroek } \ 131*83ee113eSDavid van Moolenbroek \ 132*83ee113eSDavid van Moolenbroek void name##_free_hash_table (hashtype **table, const char *file, int line) \ 133*83ee113eSDavid van Moolenbroek { \ 134*83ee113eSDavid van Moolenbroek free_hash_table ((struct hash_table **)table, file, line); \ 135*83ee113eSDavid van Moolenbroek } 136*83ee113eSDavid van Moolenbroek 137*83ee113eSDavid van Moolenbroek void relinquish_hash_bucket_hunks (void); 138*83ee113eSDavid van Moolenbroek int new_hash_table (struct hash_table **, unsigned, const char *, int); 139*83ee113eSDavid van Moolenbroek void free_hash_table (struct hash_table **, const char *, int); 140*83ee113eSDavid van Moolenbroek struct hash_bucket *new_hash_bucket (const char *, int); 141*83ee113eSDavid van Moolenbroek void free_hash_bucket (struct hash_bucket *, const char *, int); 142*83ee113eSDavid van Moolenbroek int new_hash(struct hash_table **, 143*83ee113eSDavid van Moolenbroek hash_reference, hash_dereference, unsigned, 144*83ee113eSDavid van Moolenbroek unsigned (*do_hash)(const void *, unsigned, unsigned), 145*83ee113eSDavid van Moolenbroek const char *, int); 146*83ee113eSDavid van Moolenbroek unsigned do_string_hash(const void *, unsigned, unsigned); 147*83ee113eSDavid van Moolenbroek unsigned do_case_hash(const void *, unsigned, unsigned); 148*83ee113eSDavid van Moolenbroek unsigned do_id_hash(const void *, unsigned, unsigned); 149*83ee113eSDavid van Moolenbroek unsigned do_number_hash(const void *, unsigned, unsigned); 150*83ee113eSDavid van Moolenbroek unsigned do_ip4_hash(const void *, unsigned, unsigned); 151*83ee113eSDavid van Moolenbroek unsigned char *hash_report(struct hash_table *); 152*83ee113eSDavid van Moolenbroek void add_hash (struct hash_table *, 153*83ee113eSDavid van Moolenbroek const void *, unsigned, hashed_object_t *, 154*83ee113eSDavid van Moolenbroek const char *, int); 155*83ee113eSDavid van Moolenbroek void delete_hash_entry (struct hash_table *, const void *, 156*83ee113eSDavid van Moolenbroek unsigned, const char *, int); 157*83ee113eSDavid van Moolenbroek int hash_lookup (hashed_object_t **, struct hash_table *, 158*83ee113eSDavid van Moolenbroek const void *, unsigned, const char *, int); 159*83ee113eSDavid van Moolenbroek int hash_foreach (struct hash_table *, hash_foreach_func); 160*83ee113eSDavid van Moolenbroek int casecmp (const void *s, const void *t, size_t len); 161*83ee113eSDavid van Moolenbroek 162*83ee113eSDavid van Moolenbroek #endif /* OMAPI_HASH_H */ 163