mirror of
https://github.com/openappsec/openappsec.git
synced 2025-06-28 16:41:02 +03:00
587 lines
25 KiB
C
587 lines
25 KiB
C
// Copyright (C) 2022 Check Point Software Technologies Ltd. All rights reserved.
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef __KISS_HASH_H__
|
|
#define __KISS_HASH_H__
|
|
|
|
#include "general_adaptor.h"
|
|
|
|
typedef struct kiss_hash *kiss_hash_t;
|
|
|
|
struct kiss_hashent {
|
|
void *key;
|
|
void *val;
|
|
struct kiss_hashent *next;
|
|
};
|
|
|
|
typedef uintptr_t (*hkeyfunc_t)(const void *key, void *info);
|
|
typedef int (*hcmpfunc_t)(const void *key1, const void *key2, void *info);
|
|
typedef void (*freefunc_t)(void *info);
|
|
|
|
// {group: API for KISS_HASH}
|
|
#define H_DESTR(destr, addr) \
|
|
if (destr && (((uintptr_t)(addr)) > 0x10)) (*destr)(addr);
|
|
|
|
// {group: API for KISS_HASH}
|
|
// Description: Create Hash Table. MT-Level: Reentrant
|
|
// Parameters:
|
|
// hsize - hash size
|
|
// keyfunc - key hashing function
|
|
// keycmp - key comparison function
|
|
// info - opaque for use of keyfunc and keycmp functions.
|
|
// Return values:
|
|
// o hash pointer
|
|
// o NULL upon failure
|
|
// See also: kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr, kiss_hash_undo_destr,
|
|
// kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
|
|
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
|
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
|
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
kiss_hash_t kiss_hash_create (size_t hsize, hkeyfunc_t keyfunc, hcmpfunc_t keycmp, void *info);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Create Hash Table with Destructor. MT-Level: Reentrant
|
|
// Parameters:
|
|
// hsize - hash size
|
|
// keyfunc - key hashing function
|
|
// keycmp - key comparison function
|
|
// val_destr - destructor for the values of the hash
|
|
// key_destr - destructor for the keys of the hash
|
|
// info - opaque for use of keyfunc and keycmp functions.
|
|
// Return values:
|
|
// o hash pointer
|
|
// o NULL upon failure
|
|
// See also: kiss_hash_create, kiss_hash_set_destr, kiss_hash_dodestr, kiss_hash_undo_destr, kiss_hash_nelements,
|
|
// iss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert, kiss_hash_delete, kiss_hash_destroy,
|
|
// kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
|
|
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
kiss_hash_t
|
|
kiss_hash_create_with_destr (
|
|
size_t hsize,
|
|
hkeyfunc_t keyfunc,
|
|
hcmpfunc_t keycmp,
|
|
freefunc_t val_destr,
|
|
freefunc_t key_destr,
|
|
void *info
|
|
);
|
|
|
|
#define kiss_hash_create(hsize, hkeyfunc, hcmpfunc, info) \
|
|
_kiss_hash_create (hsize, hkeyfunc, hcmpfunc, info, __FILE__, __LINE__)
|
|
|
|
#define kiss_hash_create_with_destr(hsize, hkeyfunc, hcmpfunc, freefunc1, freefunc2, info) \
|
|
_kiss_hash_create_with_destr (hsize, hkeyfunc, hcmpfunc, freefunc1, freefunc2, info, __FILE__, __LINE__)
|
|
|
|
kiss_hash_t
|
|
_kiss_hash_create_with_ksleep(size_t hsize, hkeyfunc_t, hcmpfunc_t, void *info, const char *file, int line);
|
|
|
|
#define kiss_hash_create_with_ksleep(hsize, hkeyfunc, hcmpfunc, info) \
|
|
_kiss_hash_create_with_ksleep (hsize, hkeyfunc, hcmpfunc, info, __FILE__, __LINE__)
|
|
|
|
|
|
// {group: API for HASH}
|
|
// Description: Debug single hash. MT-Level: Reentrant
|
|
//This function calculates and prints the following statistics:
|
|
//o hash pointer
|
|
//o file name and line number where kiss_hash_create or kiss_hash_create_with_destr was called
|
|
//o number of elements in kiss_hash
|
|
//o number of slots in hash - hash size
|
|
//o size in bytes of memory occupied by hash maintenance structures
|
|
//o slot utilzation - percentage of hash slots used to store elements
|
|
//o average number of lookups - average length of lists of elements
|
|
// Parameters:
|
|
// hash - pointer to hash
|
|
// Return values:
|
|
// size in bytes of memory occupied by hash maintenance structures.
|
|
// See also: hash_create, hash_create_with_destr, hash_set_destr, hash_dodestr, hash_undo_destr,
|
|
// hash_nelements, hash_findaddr, hash_lookup, hash_lookkey, hash_insert, hash_delete, hash_destroy,
|
|
// hash_find_hashent, hash_insert_at, hash_strvalue, hash_strcmp, hash_intvalue, hash_bytevalue,
|
|
// hash_bytecmp, hash_debug_all
|
|
int kiss_hash_debug(kiss_hash_t hp);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Debug single hash. MT-Level: Safe
|
|
//Iterates a list of all hash tables craeted in the current process and
|
|
//for each hash calls function hash_debug. In addition the total
|
|
//memory usage of hash maintenance structures is printed.
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
|
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
|
// kiss_hash_insert, kiss_hash_delete, kiss_hash_destroy,
|
|
// kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
|
|
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug
|
|
void kiss_hash_debug_all();
|
|
|
|
// {group: API for kiss_hash}
|
|
kiss_hash_t _kiss_hash_create (size_t hsize, hkeyfunc_t, hcmpfunc_t, void *info, const char *file, int line);
|
|
|
|
// {group: API for HASH}
|
|
kiss_hash_t _kiss_hash_create_with_destr (size_t hsize, hkeyfunc_t, hcmpfunc_t, freefunc_t, freefunc_t,
|
|
void *info, const char *file, int line);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Set destructor for hash elements. MT-Level: ] Reentrant
|
|
//Keys and values detsructors are called for every hash key-value pair when the hash is destroyed.
|
|
// Parameters:
|
|
// hp - hash
|
|
// val_destr - destructor for the values of the hash
|
|
// key_destr - destructor for the keys of the hash
|
|
// Return values:
|
|
// hash pointer
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_dodestr, kiss_hash_undo_destr,
|
|
// kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
|
|
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
|
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
|
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
kiss_hash_t kiss_hash_set_destr (kiss_hash_t hp, freefunc_t val_destr, freefunc_t key_destr);
|
|
|
|
// {group: API for kiss_hash}
|
|
// Description: Enable hash element detsruction. MT-Level: Reentrant
|
|
//Hash is created with destruction of elements disabled by default.
|
|
//This function enables destruction upon a call to kiss_hash_destroy.
|
|
//Meaning, the hash will automaticly call destructors when an entry gets
|
|
//deleted from the hash. Usualy this is not the case !
|
|
// Parameters:
|
|
// hp - hash
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_undo_destr,
|
|
// kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
|
|
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
|
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
|
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
void kiss_hash_dodestr (kiss_hash_t hp);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Disable hash element detsruction. MT-Level: Reentrant
|
|
// Parameters:
|
|
// hp - hash
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
|
// kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
|
|
// kiss_hash_delete, kiss_hash_destroy,
|
|
// kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
|
|
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
void kiss_hash_undo_destr (kiss_hash_t hp);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Number of hash elements. MT-Level: Reentrant
|
|
// Parameters:
|
|
// hash - hash table
|
|
// Return values:
|
|
// number of elements
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
|
// kiss_hash_undo_destr, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
|
|
// kiss_hash_delete, kiss_hash_destroy,
|
|
// kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
|
|
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_kiss_hash_debug, kiss_hash_debug_all
|
|
int kiss_hash_nelements (kiss_hash_t hash);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Hash size. MT-Level: Reentrant
|
|
// Parameters:
|
|
// hash - hash table
|
|
// Return values:
|
|
// Size of hash
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
|
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
|
// kiss_hash_insert, kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_insert_at,
|
|
// kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
|
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
int kiss_hash_get_size (kiss_hash_t hash);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Return address of the pointer to the value in the hash table.
|
|
// Parameters:
|
|
// hp - hash pointer
|
|
// key - hash key
|
|
// Return values:
|
|
// hash entry
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
|
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
|
|
// kiss_hash_delete, kiss_hash_destroy,
|
|
// kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
|
|
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
void **kiss_hash_findaddr (kiss_hash_t hp, const void *key);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Lookup hash value. MT-Level: Reentrant
|
|
// Parameters:
|
|
// hp - hash pointer
|
|
// key - hash key
|
|
// Return values:
|
|
// o hash value
|
|
// o NULL upon failure
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
|
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookkey, kiss_hash_insert,
|
|
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
|
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
|
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
void *kiss_hash_lookup (kiss_hash_t hp, const void *key);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Lookup hash key. MT-Level: Reentrant
|
|
//Returns the key pointer as stored in the hash table.
|
|
// Parameters:
|
|
// hp - hash pointer
|
|
// key - hash key that hash a value equal to that of the key stored in the hash.
|
|
// Return values:
|
|
// o hash key
|
|
// o NULL upon failure
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
|
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_insert,
|
|
// kiss_hash_delete, kiss_hash_destroy,kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
|
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
|
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
void *kiss_hash_lookkey (kiss_hash_t hp, const void *key);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Insert hash element. MT-Level: Reentrant
|
|
// Parameters:
|
|
// hp - hash pointer
|
|
// key - hash key
|
|
// val - hash val
|
|
// Return values:
|
|
// >0 - success
|
|
// 0 - upon failure
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
|
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
|
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
|
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
|
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
int kiss_hash_insert (kiss_hash_t hp, void *key, void *val);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Delete hash element. MT-Level: Reentrant
|
|
//Delete hash element and return a value for the key.
|
|
// Parameters:
|
|
// hp - hash pointer
|
|
// key - hash key
|
|
// Return values:
|
|
// o hash val
|
|
// o NULL upon failure
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
|
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
|
// kiss_hash_insert, kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
|
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
|
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
void *kiss_hash_delete (kiss_hash_t hash, const void *key);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Destroy hash. MT-Level: Reentrant
|
|
//If detsructor functions were defined in the call to kiss_hash_with_create_destr or kiss_hash_set_destr
|
|
//function kiss_hash_dodestr must be called to enable element detsruction.
|
|
// Parameters:
|
|
// hp - hash pointer
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
|
// kiss_hash_undo_destr,kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
|
// kiss_hash_insert, kiss_hash_delete, kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
|
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug,
|
|
// kiss_hash_debug_all
|
|
void kiss_hash_destroy (kiss_hash_t hp);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Find hash entry. MT-Level: Reentrant
|
|
//Used as an efficient but somewhat ugly interface for find/insert operation.
|
|
//What it does is to return an adrress of a pointer to a hashent structure containing the key/val pair if found.
|
|
//If not it returns the address of the pointer in which we can append the new val/pair
|
|
//thus avoiding an unnceccessary repeated search.
|
|
//We can check if key was found by checking whether the pointer is zero or not.
|
|
//This function is usually used with kiss_hash_insert_at.
|
|
// Parameters:
|
|
// hp - hash pointer
|
|
// key - hash key
|
|
// Return values:
|
|
// hash entry
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
|
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
|
// kiss_hash_insert, kiss_hash_delete, kiss_hash_destroy, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp,
|
|
// kiss_hash_intvalue, kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
struct kiss_hashent ** kiss_hash_find_hashent(kiss_hash_t hp, const void *key);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Insert hash element at specified position. MT-Level: Reentrant
|
|
//This function should be used together with kiss_hash_find_hashent to insert
|
|
//the value in case it was not found at the hash.
|
|
// Parameters:
|
|
// hp - hash pointer
|
|
// key - hash key
|
|
// val - hash val
|
|
// hloc -
|
|
// Return values:
|
|
// o 0 upon failure
|
|
// o number of hash elements after insertion in case of success.
|
|
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
|
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
|
// kiss_hash_insert, kiss_hash_delete,
|
|
// kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
|
|
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
|
int kiss_hash_insert_at (kiss_hash_t hp, void *key, void *val, struct kiss_hashent**hloc);
|
|
|
|
|
|
#define kiss_hash_strcreate(sz) \
|
|
kiss_hash_create(sz, (hkeyfunc_t)kiss_hash_strvalue, (hcmpfunc_t)kiss_hash_strcmp, NULL)
|
|
|
|
#define kiss_hash_intcreate(sz) \
|
|
kiss_hash_create(sz, (hkeyfunc_t)kiss_hash_intvalue, (hcmpfunc_t)kiss_hash_intcmp, NULL)
|
|
|
|
#define kiss_hash_bytecreate(n, esz) \
|
|
kiss_hash_create(n, (hkeyfunc_t)kiss_hash_bytevalue, (hcmpfunc_t)kiss_hash_bytecmp, (void *)esz)
|
|
|
|
// The following provide hash table data type interface,
|
|
// These functions can be provided by the user,
|
|
// The default provided functions provide string hash
|
|
|
|
// {group: API for HASH}
|
|
// Description: Hashing fuction for string hash.
|
|
//This function is used by kiss_hash_strcreate().
|
|
// Parameters:
|
|
// vs - key
|
|
// info - opaque
|
|
// Return values:
|
|
// value of the hash function.
|
|
uintptr_t kiss_hash_strvalue (const void *vs, void *info);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Comparison fuction for string hash.
|
|
//This function is used by kiss_hash_strcreate().
|
|
// Parameters:
|
|
// vk1 - key
|
|
// vk2 - key
|
|
// info - opaque
|
|
// Return values:
|
|
// 0 - keys are equal
|
|
// !0 - keys are different
|
|
int kiss_hash_strcmp (const void *vk1, const void *vk2, void *info);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Hashing fuction for integer hash.
|
|
//This function is used by kiss_hash_intcreate().
|
|
// Parameters:
|
|
// v - key
|
|
// info - opaque
|
|
// Return values:
|
|
// value of the hash function.
|
|
uintptr_t kiss_hash_intvalue (const void* v, void *info);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Comparison fuction for integer hash.
|
|
//This function is used by kiss_hash_intcreate().
|
|
// Parameters:
|
|
// vv1 - key
|
|
// vv2 - key
|
|
// info - opaque
|
|
// Return values:
|
|
// 0 - keys are equal
|
|
// !0 - keys are different
|
|
int kiss_hash_intcmp (const void* vv1, const void* vv2, void *info);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Hashing fuction for byte hash.
|
|
//This function is used by kiss_hash_bytecreate().
|
|
// Parameters:
|
|
// data - key
|
|
// info - opaque
|
|
// Return values:
|
|
// value of the hash function.
|
|
uintptr_t kiss_hash_bytevalue (const void *data, void *info);
|
|
|
|
// {group: API for HASH}
|
|
// Description: Comparison fuction for byte hash.
|
|
//This function is used by kiss_hash_bytecreate().
|
|
// Parameters:
|
|
// d1 - key
|
|
// d2 - key
|
|
// info - opaque
|
|
// Return values:
|
|
// 0 - keys are equal
|
|
// !0 - keys are different
|
|
int kiss_hash_bytecmp (const void *d1, const void *d2, void *info);
|
|
|
|
// {group: API for HASH ITERATOR}
|
|
typedef struct kiss_hash_iter *kiss_hash_iterator;
|
|
|
|
// {group: API for HASH ITERATOR}
|
|
// Description: Create hash iterator. MT-Level: Reentrant
|
|
// Parameters:
|
|
// hp - hash
|
|
// Return values:
|
|
// o iterator object
|
|
// o NULL upon failure
|
|
// See also:
|
|
// kiss_hash_iterator_next, kiss_hash_iterator_next_key, kiss_hash_iterator_destroy
|
|
kiss_hash_iterator kiss_hash_iterator_create (kiss_hash_t hp);
|
|
|
|
// {group: API for HASH ITERATOR}
|
|
// Description: Return next hash value. MT-Level: Reentrant
|
|
// Parameters:
|
|
// hit - hash iterator
|
|
// Return values:
|
|
// o next hash value
|
|
// o NULL upon failure
|
|
// See also:
|
|
// kiss_hash_iterator_create, kiss_hash_iterator_next_key, kiss_hash_iterator_destroy
|
|
void *kiss_hash_iterator_next (kiss_hash_iterator hit);
|
|
|
|
// {group: API for HASH ITERATOR}
|
|
// Description: Return next hash key. MT-Level: Reentrant
|
|
// Parameters:
|
|
// hit - hash iterator
|
|
// Return values:
|
|
// o next hash key
|
|
// o NULL upon failure
|
|
// See also:
|
|
// kiss_hash_iterator_create, kiss_hash_iterator_next, kiss_hash_iterator_destroy
|
|
void *kiss_hash_iterator_next_key (kiss_hash_iterator hit);
|
|
|
|
// {group: API for HASH ITERATOR}
|
|
// Description: Destroy hash iterator. MT-Level: Reentrant
|
|
// Parameters:
|
|
// hit - hash iterator
|
|
// See also:
|
|
// kiss_hash_iterator_create, kiss_hash_iterator_next, kiss_hash_iterator_next_key
|
|
void kiss_hash_iterator_destroy (kiss_hash_iterator hit);
|
|
|
|
// {group: API for ITERATOR}
|
|
int kiss_hash_iterator_next_ent(kiss_hash_iterator hit);
|
|
|
|
// {group: API for ITERATOR}
|
|
void * kiss_hash_iterator_get_key(kiss_hash_iterator hit);
|
|
|
|
// {group: API for ITERATOR}
|
|
void * kiss_hash_iterator_get_val(kiss_hash_iterator hit);
|
|
|
|
// {group: API for ITERATOR}
|
|
struct kiss_hashent * kiss_hash_iterator_get_hashent(kiss_hash_iterator hit);
|
|
|
|
// {group: API for ITERATOR}
|
|
int kiss_hash_iterator_equal(kiss_hash_iterator hit1, kiss_hash_iterator hit2);
|
|
|
|
// {group: API for ITERATOR}
|
|
kiss_hash_iterator kiss_hash_iterator_copy(kiss_hash_iterator hit);
|
|
|
|
// {group: API for ITERATOR}
|
|
void kiss_hash_iterator_free(kiss_hash_iterator hit);
|
|
|
|
// {group: API for ITERATOR}
|
|
void kiss_hash_iterator_set_begin(kiss_hash_iterator hit);
|
|
|
|
// {group: API for ITERATOR}
|
|
void kiss_hash_iterator_set_end(kiss_hash_iterator hit);
|
|
|
|
// {group: API for HASH}
|
|
kiss_hash_iterator kiss_hash_find_hashent_new(kiss_hash_t hp, const void *key);
|
|
|
|
// {group: API for HASH ITERATOR}
|
|
void kiss_hash_delete_by_iter(kiss_hash_iterator hit);
|
|
|
|
// - - - - - - - - - - - - - - -
|
|
// Hash resize mechanism
|
|
// - - - - - - - - - - - - - - -
|
|
|
|
// {group: API for HASH RESIZE}
|
|
// Determine if hash size can increase, decrease or both.
|
|
typedef enum {
|
|
KISS_HASH_SIZE_STATIC = 0, // hash size is kept fixed
|
|
KISS_HASH_SIZE_INCREASE = 1,
|
|
KISS_HASH_SIZE_DECREASE = 2,
|
|
KISS_HASH_SIZE_INC_DEC = 3
|
|
} KissHashResizeDirection;
|
|
|
|
// {group: API for HASH RESIZE}
|
|
typedef enum {
|
|
KISS_HASH_RESIZE_METHOD_UNKNOWN = 0,
|
|
KISS_HASH_RESIZE_BY_FACTOR = 1
|
|
} KissHashResizeMethod;
|
|
|
|
// {group: API for HASH RESIZE}
|
|
// Default maximal hash size:
|
|
// Hash size will not increase beyond this value unless stated o/w by the application
|
|
#define DEFAULT_KISS_HASH_SIZE (1<<17)
|
|
|
|
// {group: API for HASH RESIZE}
|
|
// Default value for hash factorial resizing
|
|
#define DEFAULT_KISS_HASH_RESIZE_FACTOR_VALUE 4
|
|
// {group: API for HASH RESIZE}
|
|
// Default value for hash factorial resizing trigger ratio
|
|
#define DEFAULT_KISS_HASH_RESIZE_FACTOR_TRIG_RATIO 2
|
|
|
|
// {group: API for HASH RESIZE}
|
|
// Resize application callback: This callback will be invoked at every successful resize operation.
|
|
typedef int (* HashResizeCb_t) (kiss_hash_t hp, void *app_info);
|
|
|
|
|
|
// Hash resize mode object & accsess API.
|
|
// Used for setting resize parameters hash.
|
|
|
|
// {group: API for HASH RESIZE}
|
|
typedef struct _KissHashResizeMode KissHashResizeMode;
|
|
|
|
// {group: API for HASH RESIZE}
|
|
int KissHashResizeMode_create(KissHashResizeMode **resize_mode);
|
|
|
|
// {group: API for HASH RESIZE}
|
|
void KissHashResizeMode_destroy(KissHashResizeMode *resize_mode);
|
|
|
|
// {group: API for HASH RESIZE}
|
|
int KissHashResizeMode_set_method(
|
|
KissHashResizeMode *resize_mode,
|
|
KissHashResizeMethod method,
|
|
u_int value,
|
|
u_int trigger_ratio);
|
|
|
|
// {group: API for HASH RESIZE}
|
|
int KissHashResizeMode_get_method(
|
|
const KissHashResizeMode *resize_mode,
|
|
KissHashResizeMethod *method,
|
|
u_int *value,
|
|
u_int *trigger_ratio);
|
|
|
|
// {group: API for HASH RESIZE}
|
|
int KissHashResizeMode_set_direction(KissHashResizeMode *resize_mode, KissHashResizeDirection direction);
|
|
|
|
// {group: API for HASH RESIZE}
|
|
int KissHashResizeMode_get_direction(const KissHashResizeMode *resize_mode, KissHashResizeDirection *direction);
|
|
|
|
// {group: API for HASH RESIZE}
|
|
int KissHashResizeMode_set_max_size(KissHashResizeMode *resize_mode, u_int max_size);
|
|
|
|
// {group: API for HASH RESIZE}
|
|
int KissHashResizeMode_get_max_size(const KissHashResizeMode *resize_mode, u_int *max_size);
|
|
|
|
// {group: API for HASH RESIZE}
|
|
int kiss_hash_set_resize_cb(kiss_hash_t hp, HashResizeCb_t resize_callback);
|
|
|
|
// {group: API for HASH RESIZE}
|
|
// Description: Set hash dynamic size parameters.
|
|
// Parameters:
|
|
// hp - [in] pointer to hash table
|
|
// resize_mode - [in] should be created and set using the access API to the KissHashResizeMode object.
|
|
// After using the set API, this object can be destroyed.
|
|
//
|
|
int kiss_hash_set_dynamic_size(kiss_hash_t hp, const KissHashResizeMode *resize_mode);
|
|
|
|
// {group: API for HASH RESIZE}
|
|
// Description: Get hash dynamic size parameters.
|
|
// Parameters:
|
|
// hp - [in] pointer to hash table
|
|
// resize_mode - [out] a read-only parameter that should not be changed by the application.
|
|
int kiss_hash_get_dynamic_size(kiss_hash_t hp, const KissHashResizeMode **resize_mode);
|
|
|
|
// {group: API for HASH RESIZE}
|
|
// Description: This API will cause an immediate resizing of hash
|
|
// table, according to the parameters, given in the input
|
|
// KissHashResizeMode object (if NULL, the resize will be done
|
|
// according to the parameters as last set by the application).
|
|
//
|
|
// Note that the KissHashResizeMode object parameters are
|
|
// not kept on the hash handle for future resize oprations.
|
|
int kiss_hash_trigger_resize(kiss_hash_t hp, const KissHashResizeMode *resize_mode);
|
|
|
|
#endif // __KISS_HASH_H__
|