Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libast/hash/hashlib.h
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1985-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* David Korn <[email protected]> *
19
* Phong Vo <[email protected]> *
20
* *
21
***********************************************************************/
22
#pragma prototyped
23
/*
24
* Glenn Fowler
25
* AT&T Research
26
*
27
* hash table library private definitions
28
*/
29
30
#ifndef _HASHLIB_H
31
#define _HASHLIB_H
32
33
#include <ast.h>
34
35
#define hash_info _hash_info_
36
37
typedef void* (*Hash_alloc_f)(size_t);
38
typedef int (*Hash_compare_f)(const char*, const char*, ...);
39
typedef unsigned int (*Hash_hash_f)(const char*, ...);
40
typedef void (*Hash_free_f)(void*);
41
typedef void* (*Hash_region_f)(void*, void*, size_t, int);
42
43
typedef struct /* root local pointers */
44
{
45
Hash_hash_f hash; /* name hash routine */
46
Hash_compare_f compare; /* name comparision routine */
47
Hash_alloc_f alloc; /* value allocation routine */
48
Hash_free_f free; /* value free routine */
49
Hash_region_f region; /* region alloc/free routine */
50
void* handle; /* region handle arg */
51
} Hash_local_t;
52
53
#define _HASH_POSITION_PRIVATE_ \
54
Hash_table_t* tab; /* table pointer */ \
55
int flags; /* scan flags */ \
56
Hash_bucket_t** slot; /* table slot */ \
57
Hash_bucket_t** limit; /* slot limit */
58
59
#define _HASH_LAST_PRIVATE_ \
60
const char* name; /* last lookup name */ \
61
unsigned int hash; /* last lookup hash */
62
63
#define _HASH_ROOT_PRIVATE_ \
64
int namesize; /* fixed name size: 0 => string */ \
65
int meanchain; /* resize mean chain length */ \
66
Hash_local_t* local; /* root local pointers */ \
67
Hash_root_t* next; /* next in list of all roots */ \
68
Hash_table_t* references; /* referencing table list */
69
70
#define _HASH_TABLE_PRIVATE_ \
71
unsigned char frozen; /* table freeze nesting */ \
72
unsigned char bucketsize; /* min bucket size in char*'s */ \
73
Hash_bucket_t** table; /* hash slot table */ \
74
Hash_table_t* next; /* root reference list link */
75
76
#include <hash.h>
77
78
#define HASHMINSIZE (1<<4) /* min table slots (power of 2) */
79
#define HASHMEANCHAIN 2 /* def resize mean chain len */
80
81
#define HASHMOD(t,h) (h &= (t->size - 1))
82
#define HASHVAL(x) ((x)&~HASH_FLAGS)
83
84
#define HASH(r,n,h) if (r->local->hash) h = r->namesize ? (*r->local->hash)(n, r->namesize) : (*r->local->hash)(n);\
85
else\
86
{\
87
register const char* _hash_s1 = n;\
88
h = 0;\
89
if (r->namesize)\
90
{\
91
register const char* _hash_s2 = _hash_s1 + r->namesize;\
92
while (_hash_s1 < _hash_s2) HASHPART(h, *_hash_s1++);\
93
}\
94
else while (*_hash_s1) HASHPART(h, *_hash_s1++);\
95
}
96
97
typedef struct /* library private info */
98
{
99
Hash_root_t* list; /* root table list */
100
} Hash_info_t;
101
102
extern Hash_info_t hash_info;
103
104
#endif
105
106