summaryrefslogtreecommitdiff
path: root/usr/src/lib/libast/sparcv9/include/ast/hash.h
blob: 0023ea06f5f797de97f1d320a200335755217a2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213

/* : : generated by proto : : */
/***********************************************************************
*                                                                      *
*               This software is part of the ast package               *
*          Copyright (c) 1985-2010 AT&T Intellectual Property          *
*                      and is licensed under the                       *
*                  Common Public License, Version 1.0                  *
*                    by AT&T Intellectual Property                     *
*                                                                      *
*                A copy of the License is available at                 *
*            http://www.opensource.org/licenses/cpl1.0.txt             *
*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
*                                                                      *
*              Information and Software Systems Research               *
*                            AT&T Research                             *
*                           Florham Park NJ                            *
*                                                                      *
*                 Glenn Fowler <gsf@research.att.com>                  *
*                  David Korn <dgk@research.att.com>                   *
*                   Phong Vo <kpv@research.att.com>                    *
*                                                                      *
***********************************************************************/
                  
/*
 * Glenn Fowler
 * AT&T Research
 *
 * hash table library interface definitions
 *
 * NOTE: new code should use the more general <cdt.h>
 */

#ifndef _HASH_H
#if !defined(__PROTO__)
#include <prototyped.h>
#endif
#if !defined(__LINKAGE__)
#define __LINKAGE__		/* 2004-08-11 transition */
#endif

#define _HASH_H

#define HASH_ALLOCATE	(1L<<0)		/* allocate new key names	*/
#define HASH_FIXED	(1L<<1)		/* fixed table size		*/
#define HASH_HASHED	(1L<<6)		/* key names already hashed	*/
#define HASH_RESIZE	(1L<<2)		/* table has been resized	*/
#define HASH_SCANNING	(1L<<3)		/* currently scanning scope	*/
#define HASH_SCOPE	(1L<<4)		/* push scope / create in bot	*/
#define HASH_STATIC	(1L<<5)		/* static table allocation	*/

#define HASH_CREATE	(1L<<8)		/* create bucket if not found	*/
#define HASH_DELETE	(1L<<9)		/* delete bucket if found	*/
#define HASH_LOOKUP	0		/* default op			*/
#define HASH_RENAME	(1L<<7)		/* rename bucket if found	*/

#define HASH_BUCKET	(1L<<11)	/* name is installed bucket	*/
#define HASH_INSTALL	(1L<<12)	/* install allocated bucket	*/
#define HASH_NOSCOPE	(1L<<13)	/* top scope only		*/
#define HASH_OPAQUE	(1L<<14)	/* opaque bucket		*/
#define HASH_VALUE	(1L<<15)	/* value bucket field used	*/

#define HASH_SIZE(n)	(((long)(n))<<16)  /* fixed bucket size		*/
#define HASH_SIZEOF(f)	((((long)(f))>>16)&0xffff) /* extract size	*/

#define HASH_DELETED	((unsigned long)1<<(8*sizeof(int)-1)) /* deleted placeholder	*/
#define HASH_KEEP	(1L<<(8*sizeof(int)-2))	/* no free on bucket	*/
#define HASH_HIDDEN	(1L<<(8*sizeof(int)-3))	/* hidden by scope	*/
#define HASH_HIDES	(1L<<(8*sizeof(int)-4))	/* hides lower scope	*/
#define HASH_OPAQUED	(1L<<(8*sizeof(int)-5))	/* opaqued placeholder	*/
#define HASH_FREENAME	(1L<<(8*sizeof(int)-6))	/* free bucket name	*/

#define HASH_RESET	(HASH_RESIZE|HASH_SCOPE|HASH_STATIC|HASH_VALUE)
#define HASH_INTERNAL	(HASH_BUCKET|HASH_RESIZE|HASH_SCANNING|HASH_STATIC)
#define HASH_FLAGS	(HASH_DELETED|HASH_FREENAME|HASH_HIDDEN|HASH_HIDES|HASH_KEEP|HASH_OPAQUED)

#define HASH_alloc		1
#define HASH_clear		2
#define HASH_compare		3
#define HASH_free		4
#define HASH_hash		5
#define HASH_meanchain		6
#define HASH_name		7
#define HASH_namesize		8
#define HASH_set		9
#define HASH_size		10
#define HASH_table		11
#define HASH_va_list		12

#define HASH_bucketsize		13

#define HASH_region		14

#include <hashpart.h>

#define hashclear(t,f)		((t)->flags &= ~((f) & ~HASH_INTERNAL))
#define hashcover(b)		(((b)->hash&HASH_HIDES)?(Hash_bucket_t*)((b)->name):(Hash_bucket_t*)0)
#define hashdel(t,n)		hashlook(t, (char*)(n), HASH_DELETE, (char*)0)
#define hashget(t,n)		hashlook(t, (char*)(n), HASH_LOOKUP|HASH_VALUE, (char*)0)
#define hashgetbucket(s)	((Hash_bucket_t*)((s)-((sizeof(Hash_bucket_t)+sizeof(char*)-1)/sizeof(char*))*sizeof(char*)))
#define hashkeep(b)		((b)->hash|=HASH_KEEP)
#define hashname(b)		((((b)->hash&HASH_HIDES)?((Hash_bucket_t*)((b)->name)):(b))->name)
#define hashput(t,n,v)		hashlook(t, (char*)(n), HASH_CREATE|HASH_VALUE, (char*)(v))
#define hashref(t,n)		hashlook(t, (char*)(n), HASH_LOOKUP|HASH_INTERNAL|HASH_VALUE, (char*)0)
#define hashscope(t)		((t)->scope)
#define hashset(t,f)		((t)->flags |= ((f) & ~HASH_INTERNAL))

/*
 * DEPRECATED renames for compatibility
 */

#define Hashbin_t		Hash_bucket_t
#define HASHBUCKET		Hash_bucket_t
#define Hashhdr_t 		Hash_header_t
#define HASHHEADER 		Hash_header_t
#define Hashpos_t 		Hash_position_t
#define HASHPOSITION 		Hash_position_t
#define Hashtab_t		Hash_table_t
#define HASHTABLE		Hash_table_t

#define vhashalloc		hashvalloc
#define hashvalloc(t,a)		hashalloc(t,HASH_va_list,a,0)

/*
 * the #define's avoid union tags
 */

typedef struct Hash_bucket Hash_bucket_t;
typedef struct Hash_root Hash_root_t;
typedef struct Hash_table Hash_table_t;

#define HASH_HEADER			/* common bucket header		*/ \
	Hash_bucket_t*	next;		/* next in collision chain	*/ \
	unsigned int	hash;		/* hash flags and value		*/ \
	char*		name		/* key name			*/

#define HASH_DEFAULT			/* HASH_VALUE bucket elements	*/ \
	char*		value		/* key value			*/

typedef struct				/* bucket header		*/
{
	HASH_HEADER;
} Hash_header_t;

struct Hash_bucket			/* prototype bucket		*/
{
	HASH_HEADER;
	HASH_DEFAULT;
};

typedef struct				/* hash scan bucket position	*/
{
	Hash_bucket_t*	bucket;		/* bucket			*/
#ifdef _HASH_POSITION_PRIVATE_
	_HASH_POSITION_PRIVATE_
#endif
} Hash_position_t;

typedef struct				/* last lookup cache		*/
{
	Hash_table_t*	table;		/* last lookup table		*/
	Hash_bucket_t*	bucket;		/* last lookup bucket		*/
#ifdef _HASH_LAST_PRIVATE_
	_HASH_LAST_PRIVATE_
#endif
} Hash_last_t;

struct Hash_root			/* root hash table information	*/
{
	int		accesses;	/* number of accesses		*/
	int		collisions;	/* number of collisions		*/
	int		flags;		/* flags: see HASH_[A-Z]*	*/
	Hash_last_t	last;		/* last lookup cache		*/
	__V_*		context;	/* user defined context		*/
#ifdef _HASH_ROOT_PRIVATE_
	_HASH_ROOT_PRIVATE_
#endif
};

struct Hash_table			/* hash table information	*/
{
	Hash_root_t*	root;		/* root hash table information	*/
	int		size;		/* table size			*/
	int		buckets;	/* active bucket count		*/
	char*		name;		/* table name			*/
	Hash_table_t*	scope;		/* scope covered table		*/
	short		flags;		/* flags: see HASH_[A-Z]*	*/
#ifdef _HASH_TABLE_PRIVATE_
	_HASH_TABLE_PRIVATE_
#endif
};

#if _BLD_ast && defined(__EXPORT__)
#undef __MANGLE__
#define __MANGLE__ __LINKAGE__		__EXPORT__
#endif

extern __MANGLE__ Hash_table_t*	hashalloc __PROTO__((Hash_table_t*, ...));
extern __MANGLE__ void		hashdone __PROTO__((Hash_position_t*));
extern __MANGLE__ void		hashdump __PROTO__((Hash_table_t*, int));
extern __MANGLE__ Hash_table_t*	hashfree __PROTO__((Hash_table_t*));
extern __MANGLE__ Hash_bucket_t*	hashlast __PROTO__((Hash_table_t*));
extern __MANGLE__ char*		hashlook __PROTO__((Hash_table_t*, const char*, long, const char*));
extern __MANGLE__ Hash_bucket_t*	hashnext __PROTO__((Hash_position_t*));
extern __MANGLE__ Hash_position_t*	hashscan __PROTO__((Hash_table_t*, int));
extern __MANGLE__ void		hashsize __PROTO__((Hash_table_t*, int));
extern __MANGLE__ Hash_table_t*	hashview __PROTO__((Hash_table_t*, Hash_table_t*));
extern __MANGLE__ int		hashwalk __PROTO__((Hash_table_t*, int, int (*)(const char*, char*, __V_*), __V_*));

#undef __MANGLE__
#define __MANGLE__ __LINKAGE__

#endif