2017-04-25 14:41:48 +02:00
|
|
|
/* hash.h --
|
|
|
|
|
*
|
2020-05-23 23:13:14 +02:00
|
|
|
* *********************************************************************
|
|
|
|
|
* * Copyright (C) 1985, 1990 Regents of the University of California. *
|
|
|
|
|
* * Permission to use, copy, modify, and distribute this *
|
|
|
|
|
* * software and its documentation for any purpose and without *
|
|
|
|
|
* * fee is hereby granted, provided that the above copyright *
|
|
|
|
|
* * notice appear in all copies. The University of California *
|
|
|
|
|
* * makes no representations about the suitability of this *
|
|
|
|
|
* * software for any purpose. It is provided "as is" without *
|
|
|
|
|
* * express or implied warranty. Export of this software outside *
|
|
|
|
|
* * of the United States of America may require an export license. *
|
2017-04-25 14:41:48 +02:00
|
|
|
* *********************************************************************
|
|
|
|
|
*
|
|
|
|
|
* This file contains definitions used by the hash module,
|
|
|
|
|
* which maintains hash tables.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/* rcsid "$Header: /usr/cvsroot/magic-8.0/utils/hash.h,v 1.2 2009/09/10 20:32:55 tim Exp $" */
|
|
|
|
|
|
2024-10-16 08:38:41 +02:00
|
|
|
#ifndef _MAGIC__UTILS__HASH_H
|
|
|
|
|
#define _MAGIC__UTILS__HASH_H
|
2017-04-25 14:41:48 +02:00
|
|
|
|
|
|
|
|
/*---------------------------------------------------------
|
|
|
|
|
* This first stuff should only be used internally
|
|
|
|
|
* in the hash routines.
|
|
|
|
|
*---------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/* The following defines one entry in the hash table. */
|
|
|
|
|
|
|
|
|
|
typedef struct h1
|
|
|
|
|
{
|
|
|
|
|
char *h_pointer; /* Pointer to anything. */
|
|
|
|
|
struct h1 *h_next; /* Next element, zero for end. */
|
|
|
|
|
union
|
|
|
|
|
{
|
2024-10-04 12:19:10 +02:00
|
|
|
const char *h_ptr; /* One-word key value to identify entry. */
|
2017-04-25 14:41:48 +02:00
|
|
|
unsigned h_words[1]; /* N-word key value. Note: the actual
|
|
|
|
|
* size may be longer if necessary to hold
|
|
|
|
|
* the entire key.
|
|
|
|
|
*/
|
|
|
|
|
char h_name[4]; /* Text name of this entry. Note: the
|
|
|
|
|
* actual size may be longer if necessary
|
|
|
|
|
* to hold the whole string. This MUST be
|
|
|
|
|
* the last entry in the structure!!!
|
|
|
|
|
*/
|
|
|
|
|
} h_key;
|
|
|
|
|
} HashEntry;
|
|
|
|
|
|
|
|
|
|
/* A hash table consists of an array of pointers to hash
|
|
|
|
|
* lists:
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
typedef struct h3
|
|
|
|
|
{
|
|
|
|
|
HashEntry **ht_table; /* Pointer to array of pointers. */
|
|
|
|
|
int ht_size; /* Actual size of array. */
|
|
|
|
|
int ht_nEntries; /* Number of entries in the table. */
|
|
|
|
|
int ht_downShift; /* Shift count, used in hashing function. */
|
|
|
|
|
int ht_mask; /* Used to select bits for hashing. */
|
|
|
|
|
int ht_ptrKeys; /* See below */
|
|
|
|
|
|
|
|
|
|
/* Used if ht_ptrKeys == HT_CLIENTKEYS */
|
|
|
|
|
char *(*ht_copyFn)(); /* Used for copying a key value */
|
|
|
|
|
int (*ht_compareFn)(); /* Used for comparing two keys for equality */
|
|
|
|
|
int (*ht_hashFn)(); /* Hash function */
|
|
|
|
|
int (*ht_killFn)(); /* Used to kill an entry */
|
|
|
|
|
} HashTable;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Values for ht_ptrKeys.
|
|
|
|
|
*
|
|
|
|
|
* HT_STRINGKEYS means that keys are NULL-terminated strings stored
|
|
|
|
|
* in the variable-sized array h_key.h_name at the end of a HashEntry.
|
|
|
|
|
*
|
|
|
|
|
* HT_WORDKEYS and HT_CLIENTKEYS both mean that the value is stored
|
|
|
|
|
* in h_key.h_ptr; with HT_WORDKEYS it is treated as a one-word value,
|
|
|
|
|
* while with HT_CLIENTKEYS it is interpreted by user-supplied procedures
|
|
|
|
|
* (and hence it can be a pointer).
|
|
|
|
|
*
|
|
|
|
|
* Finally, values of ht_ptrKeys of HT_STRUCTKEYS or greater mean
|
|
|
|
|
* that the key consists of ht_ptrKeys 32-bit words of data, stored
|
|
|
|
|
* in the variable-sized array h_key.h_words.
|
|
|
|
|
*/
|
|
|
|
|
#define HT_CLIENTKEYS -1
|
|
|
|
|
#define HT_STRINGKEYS 0
|
|
|
|
|
#define HT_WORDKEYS 1
|
|
|
|
|
#define HT_STRUCTKEYS 2
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Default initial size (number of buckets) in a hash table.
|
|
|
|
|
* May be passed to HashInit() or HashInitClient().
|
|
|
|
|
*/
|
|
|
|
|
#define HT_DEFAULTSIZE 32
|
|
|
|
|
|
|
|
|
|
/* The following structure is used by the searching routines
|
|
|
|
|
* to record where we are in the search.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
typedef struct h2
|
|
|
|
|
{
|
|
|
|
|
int hs_nextIndex; /* Next bucket to check (after current). */
|
|
|
|
|
HashEntry * hs_h; /* Next entry to check in current bucket. */
|
|
|
|
|
} HashSearch;
|
|
|
|
|
|
|
|
|
|
/*---------------------------------------------------------
|
|
|
|
|
* The following procedure declarations and macros
|
|
|
|
|
* are the only things that should be needed outside
|
|
|
|
|
* the implementation code.
|
|
|
|
|
*---------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
2020-05-23 23:13:14 +02:00
|
|
|
extern void HashInit(HashTable *, int, int), HashInitClient(), HashStats(), HashKill(),
|
2017-04-25 14:41:48 +02:00
|
|
|
HashFreeKill();
|
2024-10-04 12:19:10 +02:00
|
|
|
extern HashEntry *HashFind(HashTable *, const char *);
|
|
|
|
|
extern HashEntry *HashLookOnly(HashTable *, const char *);
|
|
|
|
|
extern void HashRemove(HashTable *, const char *);
|
2017-04-25 14:41:48 +02:00
|
|
|
extern void HashStartSearch(HashSearch *);
|
|
|
|
|
extern HashEntry *HashNext(HashTable *, HashSearch *);
|
|
|
|
|
|
|
|
|
|
/* char * HashGetValue(h); HashEntry *h; */
|
|
|
|
|
|
|
|
|
|
#define HashGetValue(h) ((h)->h_pointer)
|
|
|
|
|
|
|
|
|
|
/* HashSetValue(h, val); HashEntry *h; char *val; */
|
|
|
|
|
|
|
|
|
|
#define HashSetValue(h, val) ((h)->h_pointer = (char *) (val))
|
|
|
|
|
|
|
|
|
|
/* HashSize(n) returns the number of words in an object of n bytes */
|
|
|
|
|
#define HashSize(n) (((n) + sizeof (unsigned) - 1) / sizeof (unsigned))
|
|
|
|
|
|
|
|
|
|
/* HashGetNumEntries(ht); HashTable *ht ; returns number of entries in table */
|
|
|
|
|
#define HashGetNumEntries(ht) ((ht)->ht_nEntries)
|
|
|
|
|
|
2024-10-16 08:38:41 +02:00
|
|
|
#endif /* _MAGIC__UTILS__HASH_H */
|