1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman *                                                                      *
3*b30d1939SAndy Fiddaman *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5*b30d1939SAndy Fiddaman *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
7*b30d1939SAndy Fiddaman *                    by AT&T Intellectual Property                     *
8*b30d1939SAndy Fiddaman *                                                                      *
9*b30d1939SAndy Fiddaman *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*b30d1939SAndy Fiddaman *                                                                      *
13*b30d1939SAndy Fiddaman *              Information and Software Systems Research               *
14*b30d1939SAndy Fiddaman *                            AT&T Research                             *
15*b30d1939SAndy Fiddaman *                           Florham Park NJ                            *
16*b30d1939SAndy Fiddaman *                                                                      *
17*b30d1939SAndy Fiddaman *                 Glenn Fowler <gsf@research.att.com>                  *
18*b30d1939SAndy Fiddaman *                  David Korn <dgk@research.att.com>                   *
19*b30d1939SAndy Fiddaman *                   Phong Vo <kpv@research.att.com>                    *
20*b30d1939SAndy Fiddaman *                                                                      *
21*b30d1939SAndy Fiddaman ***********************************************************************/
22*b30d1939SAndy Fiddaman #ifndef _CDT_H
23*b30d1939SAndy Fiddaman #define _CDT_H		1
24*b30d1939SAndy Fiddaman 
25*b30d1939SAndy Fiddaman /*	Public interface for the dictionary library
26*b30d1939SAndy Fiddaman **
27*b30d1939SAndy Fiddaman **      Written by Kiem-Phong Vo
28*b30d1939SAndy Fiddaman */
29*b30d1939SAndy Fiddaman 
30*b30d1939SAndy Fiddaman #ifndef CDT_VERSION
31*b30d1939SAndy Fiddaman #ifdef _API_ast
32*b30d1939SAndy Fiddaman #define CDT_VERSION		_API_ast
33*b30d1939SAndy Fiddaman #else
34*b30d1939SAndy Fiddaman #define CDT_VERSION		20111111L
35*b30d1939SAndy Fiddaman #endif /*_AST_api*/
36*b30d1939SAndy Fiddaman #endif /*CDT_VERSION*/
37*b30d1939SAndy Fiddaman #ifndef AST_PLUGIN_VERSION
38*b30d1939SAndy Fiddaman #define AST_PLUGIN_VERSION(v)	(v)
39*b30d1939SAndy Fiddaman #endif
40*b30d1939SAndy Fiddaman #define CDT_PLUGIN_VERSION	AST_PLUGIN_VERSION(20111111L)
41*b30d1939SAndy Fiddaman 
42*b30d1939SAndy Fiddaman #if _PACKAGE_ast
43*b30d1939SAndy Fiddaman #include	<ast_std.h>
44*b30d1939SAndy Fiddaman #else
45*b30d1939SAndy Fiddaman #include	<ast_common.h>
46*b30d1939SAndy Fiddaman #include	<string.h>
47*b30d1939SAndy Fiddaman #endif
48*b30d1939SAndy Fiddaman 
49*b30d1939SAndy Fiddaman /* commonly used integers */
50*b30d1939SAndy Fiddaman #define DT_ZERO		((unsigned int)0)  /* all zero bits	*/
51*b30d1939SAndy Fiddaman #define DT_ONES		(~DT_ZERO)	   /* all one bits	*/
52*b30d1939SAndy Fiddaman #define DT_HIBIT	(~(DT_ONES >> 1) ) /* highest 1 bit	*/
53*b30d1939SAndy Fiddaman #define DT_LOBIT	((unsigned int)1)  /* lowest 1 bit	*/
54*b30d1939SAndy Fiddaman #define DT_NBITS	(sizeof(unsigned int)*8) /* #bits	*/
55*b30d1939SAndy Fiddaman 
56*b30d1939SAndy Fiddaman /* type of an integer with the same size as a pointer */
57*b30d1939SAndy Fiddaman #define Dtuint_t	uintptr_t
58*b30d1939SAndy Fiddaman 
59*b30d1939SAndy Fiddaman /* various types used by CDT */
60*b30d1939SAndy Fiddaman typedef struct _dtlink_s	Dtlink_t;
61*b30d1939SAndy Fiddaman typedef struct _dthold_s	Dthold_t;
62*b30d1939SAndy Fiddaman typedef struct _dtdisc_s	Dtdisc_t;
63*b30d1939SAndy Fiddaman typedef struct _dtmethod_s	Dtmethod_t;
64*b30d1939SAndy Fiddaman typedef struct _dtdata_s	Dtdata_t;
65*b30d1939SAndy Fiddaman typedef struct _dtuser_s	Dtuser_t;
66*b30d1939SAndy Fiddaman typedef struct _dt_s		Dt_t;
67*b30d1939SAndy Fiddaman typedef struct _dtstat_s	Dtstat_t;
68*b30d1939SAndy Fiddaman typedef Void_t*			(*Dtsearch_f)_ARG_((Dt_t*,Void_t*,int));
69*b30d1939SAndy Fiddaman typedef Void_t* 		(*Dtmake_f)_ARG_((Dt_t*,Void_t*,Dtdisc_t*));
70*b30d1939SAndy Fiddaman typedef void 			(*Dtfree_f)_ARG_((Dt_t*,Void_t*,Dtdisc_t*));
71*b30d1939SAndy Fiddaman typedef int			(*Dtcompar_f)_ARG_((Dt_t*,Void_t*,Void_t*,Dtdisc_t*));
72*b30d1939SAndy Fiddaman typedef unsigned int		(*Dthash_f)_ARG_((Dt_t*,Void_t*,Dtdisc_t*));
73*b30d1939SAndy Fiddaman typedef Void_t*			(*Dtmemory_f)_ARG_((Dt_t*,Void_t*,size_t,Dtdisc_t*));
74*b30d1939SAndy Fiddaman typedef int			(*Dtevent_f)_ARG_((Dt_t*,int,Void_t*,Dtdisc_t*));
75*b30d1939SAndy Fiddaman typedef int			(*Dttype_f)_ARG_((Dt_t*,int));
76*b30d1939SAndy Fiddaman 
77*b30d1939SAndy Fiddaman struct _dtuser_s /* for application to access and use */
78*b30d1939SAndy Fiddaman {	unsigned int	lock;	/* used by dtapplock	*/
79*b30d1939SAndy Fiddaman 	Void_t*		data;	/* for whatever data	*/
80*b30d1939SAndy Fiddaman };
81*b30d1939SAndy Fiddaman 
82*b30d1939SAndy Fiddaman struct _dtlink_s
83*b30d1939SAndy Fiddaman {
84*b30d1939SAndy Fiddaman #if CDT_VERSION < 20111111L
85*b30d1939SAndy Fiddaman 	Dtlink_t*	right;	/* right child		*/
86*b30d1939SAndy Fiddaman 	union
87*b30d1939SAndy Fiddaman 	{ unsigned int	_hash;	/* hash value		*/
88*b30d1939SAndy Fiddaman 	  Dtlink_t*	_left;	/* left child		*/
89*b30d1939SAndy Fiddaman 	} hl;
90*b30d1939SAndy Fiddaman #else
91*b30d1939SAndy Fiddaman 	union
92*b30d1939SAndy Fiddaman 	{ Dtlink_t*	__rght;	/* right child or next	*/
93*b30d1939SAndy Fiddaman 	  Dtlink_t*	__ptbl;	/* Dtrehash parent tbl	*/
94*b30d1939SAndy Fiddaman 	} rh;
95*b30d1939SAndy Fiddaman 	union
96*b30d1939SAndy Fiddaman 	{ Dtlink_t*	__left;	/* left child or prev	*/
97*b30d1939SAndy Fiddaman 	  unsigned int	__hash;	/* hash value of object	*/
98*b30d1939SAndy Fiddaman 	} lh;
99*b30d1939SAndy Fiddaman #endif
100*b30d1939SAndy Fiddaman };
101*b30d1939SAndy Fiddaman 
102*b30d1939SAndy Fiddaman /* private structure to hold an object */
103*b30d1939SAndy Fiddaman struct _dthold_s
104*b30d1939SAndy Fiddaman {	Dtlink_t	hdr;	/* header to hold obj	*/
105*b30d1939SAndy Fiddaman 	Void_t*		obj;	/* application object	*/
106*b30d1939SAndy Fiddaman };
107*b30d1939SAndy Fiddaman 
108*b30d1939SAndy Fiddaman /* method to manipulate dictionary structure */
109*b30d1939SAndy Fiddaman struct _dtmethod_s
110*b30d1939SAndy Fiddaman {	Dtsearch_f	searchf; /* search function	*/
111*b30d1939SAndy Fiddaman 	unsigned int	type;	 /* type of operation	*/
112*b30d1939SAndy Fiddaman 	int		(*eventf)_ARG_((Dt_t*, int, Void_t*));
113*b30d1939SAndy Fiddaman 	char*		name;	 /* name of method	*/
114*b30d1939SAndy Fiddaman 	char*		description; /* description */
115*b30d1939SAndy Fiddaman };
116*b30d1939SAndy Fiddaman 
117*b30d1939SAndy Fiddaman /* structure to hold methods that manipulate an object */
118*b30d1939SAndy Fiddaman struct _dtdisc_s
119*b30d1939SAndy Fiddaman {	int		key;	/* where the key resides 	*/
120*b30d1939SAndy Fiddaman 	int		size;	/* key size and type		*/
121*b30d1939SAndy Fiddaman 	int		link;	/* offset to Dtlink_t field	*/
122*b30d1939SAndy Fiddaman 	Dtmake_f	makef;	/* object constructor		*/
123*b30d1939SAndy Fiddaman 	Dtfree_f	freef;	/* object destructor		*/
124*b30d1939SAndy Fiddaman 	Dtcompar_f	comparf;/* to compare two objects	*/
125*b30d1939SAndy Fiddaman 	Dthash_f	hashf;	/* to compute hash value 	*/
126*b30d1939SAndy Fiddaman 	Dtmemory_f	memoryf;/* to allocate/free memory	*/
127*b30d1939SAndy Fiddaman 	Dtevent_f	eventf;	/* to process events		*/
128*b30d1939SAndy Fiddaman };
129*b30d1939SAndy Fiddaman 
130*b30d1939SAndy Fiddaman #define DTDISC(dc,ky,sz,lk,mkf,frf,cmpf,hshf,memf,evf) \
131*b30d1939SAndy Fiddaman 	( (dc)->key = (int)(ky), (dc)->size = (int)(sz), (dc)->link = (int)(lk), \
132*b30d1939SAndy Fiddaman 	  (dc)->makef = (mkf), (dc)->freef = (frf), \
133*b30d1939SAndy Fiddaman 	  (dc)->comparf = (cmpf), (dc)->hashf = (hshf), \
134*b30d1939SAndy Fiddaman 	  (dc)->memoryf = (memf), (dc)->eventf = (evf) )
135*b30d1939SAndy Fiddaman 
136*b30d1939SAndy Fiddaman #ifdef offsetof
137*b30d1939SAndy Fiddaman #define DTOFFSET(struct_s, member)	offsetof(struct_s, member)
138*b30d1939SAndy Fiddaman #else
139*b30d1939SAndy Fiddaman #define DTOFFSET(struct_s, member)	((int)(&((struct_s*)0)->member))
140*b30d1939SAndy Fiddaman #endif
141*b30d1939SAndy Fiddaman 
142*b30d1939SAndy Fiddaman /* the dictionary structure itself */
143*b30d1939SAndy Fiddaman struct _dt_s
144*b30d1939SAndy Fiddaman {	Dtsearch_f	searchf;/* search function		*/
145*b30d1939SAndy Fiddaman 	Dtdisc_t*	disc;	/* object type definitition	*/
146*b30d1939SAndy Fiddaman 	Dtdata_t*	data;	/* sharable data		*/
147*b30d1939SAndy Fiddaman 	Dtmemory_f	memoryf;/* for memory allocation	*/
148*b30d1939SAndy Fiddaman 	Dtmethod_t*	meth;	/* storage method		*/
149*b30d1939SAndy Fiddaman 	ssize_t		nview;	/* #parent view dictionaries	*/
150*b30d1939SAndy Fiddaman 	Dt_t*		view;	/* next on viewpath		*/
151*b30d1939SAndy Fiddaman 	Dt_t*		walk;	/* dictionary being walked	*/
152*b30d1939SAndy Fiddaman 	Dtuser_t*	user;	/* for user's usage		*/
153*b30d1939SAndy Fiddaman 	Dttype_f	typef;	/* for binary compatibility	*/
154*b30d1939SAndy Fiddaman };
155*b30d1939SAndy Fiddaman 
156*b30d1939SAndy Fiddaman /* structure to get status of a dictionary */
157*b30d1939SAndy Fiddaman #define DT_MAXRECURSE	1024	/* limit to avoid stack overflow	*/
158*b30d1939SAndy Fiddaman #define DT_MAXSIZE	256	/* limit for size of below arrays	*/
159*b30d1939SAndy Fiddaman struct _dtstat_s
160*b30d1939SAndy Fiddaman {	unsigned int	meth;	/* method type				*/
161*b30d1939SAndy Fiddaman 	ssize_t		size;	/* total # of elements in dictionary	*/
162*b30d1939SAndy Fiddaman 	ssize_t		space;	/* memory usage of data structure	*/
163*b30d1939SAndy Fiddaman 	ssize_t		mlev;	/* max #levels in tree or hash table	*/
164*b30d1939SAndy Fiddaman 	ssize_t		msize;	/* max #defined elts in below arrays	*/
165*b30d1939SAndy Fiddaman 	ssize_t		lsize[DT_MAXSIZE]; /* #objects by level		*/
166*b30d1939SAndy Fiddaman 	ssize_t		tsize[DT_MAXSIZE]; /* #tables by level		*/
167*b30d1939SAndy Fiddaman };
168*b30d1939SAndy Fiddaman 
169*b30d1939SAndy Fiddaman /* supported storage methods */
170*b30d1939SAndy Fiddaman #define DT_SET		0000000001 /* unordered set, unique elements	*/
171*b30d1939SAndy Fiddaman #define DT_BAG		0000000002 /* unordered set, repeated elements	*/
172*b30d1939SAndy Fiddaman #define DT_OSET		0000000004 /* ordered set			*/
173*b30d1939SAndy Fiddaman #define DT_OBAG		0000000010 /* ordered multiset			*/
174*b30d1939SAndy Fiddaman #define DT_LIST		0000000020 /* linked list			*/
175*b30d1939SAndy Fiddaman #define DT_STACK	0000000040 /* stack: insert/delete at top	*/
176*b30d1939SAndy Fiddaman #define DT_QUEUE	0000000100 /* queue: insert top, delete at tail	*/
177*b30d1939SAndy Fiddaman #define DT_DEQUE	0000000200 /* deque: insert top, append at tail	*/
178*b30d1939SAndy Fiddaman #define DT_RHSET	0000000400 /* rhset: sharable unique objects	*/
179*b30d1939SAndy Fiddaman #define DT_RHBAG	0000001000 /* rhbag: sharable repeated objects	*/
180*b30d1939SAndy Fiddaman #define DT_METHODS	0000001777 /* all currently supported methods	*/
181*b30d1939SAndy Fiddaman #define DT_ORDERED	(DT_OSET|DT_OBAG)
182*b30d1939SAndy Fiddaman 
183*b30d1939SAndy Fiddaman /* asserts to dtdisc() to improve performance when changing disciplines */
184*b30d1939SAndy Fiddaman #define DT_SAMECMP	0000000001 /* compare functions are equivalent	*/
185*b30d1939SAndy Fiddaman #define DT_SAMEHASH	0000000002 /* hash functions are equivalent	*/
186*b30d1939SAndy Fiddaman 
187*b30d1939SAndy Fiddaman /* operation types */
188*b30d1939SAndy Fiddaman #define DT_INSERT	0000000001 /* insert object if not found	*/
189*b30d1939SAndy Fiddaman #define DT_DELETE	0000000002 /* delete a matching object if any	*/
190*b30d1939SAndy Fiddaman #define DT_SEARCH	0000000004 /* look for an object		*/
191*b30d1939SAndy Fiddaman #define DT_NEXT		0000000010 /* look for next element		*/
192*b30d1939SAndy Fiddaman #define DT_PREV		0000000020 /* find previous element		*/
193*b30d1939SAndy Fiddaman #define DT_FIRST	0000000200 /* get first object			*/
194*b30d1939SAndy Fiddaman #define DT_LAST		0000000400 /* get last object			*/
195*b30d1939SAndy Fiddaman #define DT_MATCH	0000001000 /* find object matching key		*/
196*b30d1939SAndy Fiddaman #define DT_ATTACH	0000004000 /* attach an object to dictionary	*/
197*b30d1939SAndy Fiddaman #define DT_DETACH	0000010000 /* detach an object from dictionary	*/
198*b30d1939SAndy Fiddaman #define DT_APPEND	0000020000 /* append an object			*/
199*b30d1939SAndy Fiddaman #define DT_ATLEAST	0000040000 /* find the least elt >= object	*/
200*b30d1939SAndy Fiddaman #define DT_ATMOST	0000100000 /* find the biggest elt <= object	*/
201*b30d1939SAndy Fiddaman #define DT_REMOVE	0002000000 /* remove a specific object		*/
202*b30d1939SAndy Fiddaman #define DT_TOANNOUNCE	(DT_INSERT|DT_DELETE|DT_SEARCH|DT_NEXT|DT_PREV|DT_FIRST|DT_LAST|DT_MATCH|DT_ATTACH|DT_DETACH|DT_APPEND|DT_ATLEAST|DT_ATMOST|DT_REMOVE)
203*b30d1939SAndy Fiddaman 
204*b30d1939SAndy Fiddaman #define DT_RELINK	0000002000 /* re-inserting (dtdisc,dtmethod...)	*/
205*b30d1939SAndy Fiddaman #define DT_FLATTEN	0000000040 /* flatten objects into a list	*/
206*b30d1939SAndy Fiddaman #define DT_CLEAR	0000000100 /* clearing all objects		*/
207*b30d1939SAndy Fiddaman #define DT_EXTRACT	0000200000 /* FLATTEN and clear dictionary	*/
208*b30d1939SAndy Fiddaman #define DT_RESTORE	0000400000 /* reinsert a list of elements	*/
209*b30d1939SAndy Fiddaman #define DT_STAT		0001000000 /* get statistics of dictionary	*/
210*b30d1939SAndy Fiddaman #define DT_OPERATIONS	(DT_TOANNOUNCE|DT_RELINK|DT_FLATTEN|DT_CLEAR|DT_EXTRACT|DT_RESTORE|DT_STAT)
211*b30d1939SAndy Fiddaman 
212*b30d1939SAndy Fiddaman /* these bits may combine with the DT_METHODS and DT_OPERATIONS bits */
213*b30d1939SAndy Fiddaman #define DT_INDATA	0010000000 /* Dt_t was allocated with Dtdata_t	*/
214*b30d1939SAndy Fiddaman #define DT_SHARE	0020000000 /* concurrent access mode 		*/
215*b30d1939SAndy Fiddaman #define DT_ANNOUNCE	0040000000 /* announcing a successful operation	*/
216*b30d1939SAndy Fiddaman 				   /* the actual event will be this bit */
217*b30d1939SAndy Fiddaman 				   /* combined with the operation bit	*/
218*b30d1939SAndy Fiddaman #define DT_OPTIMIZE	0100000000 /* optimizing data structure		*/
219*b30d1939SAndy Fiddaman 
220*b30d1939SAndy Fiddaman /* events for discipline and method event-handling functions */
221*b30d1939SAndy Fiddaman #define DT_OPEN		1	/* a dictionary is being opened		*/
222*b30d1939SAndy Fiddaman #define DT_ENDOPEN	5	/* end of dictionary opening		*/
223*b30d1939SAndy Fiddaman #define DT_CLOSE	2	/* a dictionary is being closed		*/
224*b30d1939SAndy Fiddaman #define DT_ENDCLOSE	6	/* end of dictionary closing		*/
225*b30d1939SAndy Fiddaman #define DT_DISC		3	/* discipline is about to be changed	*/
226*b30d1939SAndy Fiddaman #define DT_METH		4	/* method is about to be changed	*/
227*b30d1939SAndy Fiddaman #define DT_HASHSIZE	7	/* initialize hash table size		*/
228*b30d1939SAndy Fiddaman #define DT_ERROR	0xbad	/* announcing an error			*/
229*b30d1939SAndy Fiddaman 
230*b30d1939SAndy Fiddaman _BEGIN_EXTERNS_	/* data structures and functions */
231*b30d1939SAndy Fiddaman #if _BLD_cdt && defined(__EXPORT__)
232*b30d1939SAndy Fiddaman #define extern	__EXPORT__
233*b30d1939SAndy Fiddaman #endif
234*b30d1939SAndy Fiddaman #if !_BLD_cdt && defined(__IMPORT__)
235*b30d1939SAndy Fiddaman #define extern	__IMPORT__
236*b30d1939SAndy Fiddaman #endif
237*b30d1939SAndy Fiddaman 
238*b30d1939SAndy Fiddaman extern Dtmethod_t* 	Dtset;
239*b30d1939SAndy Fiddaman extern Dtmethod_t* 	Dtbag;
240*b30d1939SAndy Fiddaman extern Dtmethod_t* 	Dtoset;
241*b30d1939SAndy Fiddaman extern Dtmethod_t* 	Dtobag;
242*b30d1939SAndy Fiddaman extern Dtmethod_t*	Dtlist;
243*b30d1939SAndy Fiddaman extern Dtmethod_t*	Dtstack;
244*b30d1939SAndy Fiddaman extern Dtmethod_t*	Dtqueue;
245*b30d1939SAndy Fiddaman extern Dtmethod_t*	Dtdeque;
246*b30d1939SAndy Fiddaman 
247*b30d1939SAndy Fiddaman #if _PACKAGE_ast /* dtplugin() for proprietary and non-standard methods -- requires -ldll */
248*b30d1939SAndy Fiddaman 
249*b30d1939SAndy Fiddaman #define dtplugin(name)	((Dtmethod_t*)dllmeth("cdt", name, CDT_PLUGIN_VERSION))
250*b30d1939SAndy Fiddaman 
251*b30d1939SAndy Fiddaman #define Dtrhbag		dtplugin("rehash:Dtrhbag")
252*b30d1939SAndy Fiddaman #define Dtrhset		dtplugin("rehash:Dtrhset")
253*b30d1939SAndy Fiddaman 
254*b30d1939SAndy Fiddaman #else
255*b30d1939SAndy Fiddaman 
256*b30d1939SAndy Fiddaman #if CDTPROPRIETARY
257*b30d1939SAndy Fiddaman 
258*b30d1939SAndy Fiddaman extern Dtmethod_t*	Dtrhset;
259*b30d1939SAndy Fiddaman extern Dtmethod_t*	Dtrhbag;
260*b30d1939SAndy Fiddaman 
261*b30d1939SAndy Fiddaman #endif /*CDTPROPRIETARY*/
262*b30d1939SAndy Fiddaman 
263*b30d1939SAndy Fiddaman #endif /*_PACKAGE_ast*/
264*b30d1939SAndy Fiddaman 
265*b30d1939SAndy Fiddaman #undef extern
266*b30d1939SAndy Fiddaman 
267*b30d1939SAndy Fiddaman #if _BLD_cdt && defined(__EXPORT__)
268*b30d1939SAndy Fiddaman #define extern	__EXPORT__
269*b30d1939SAndy Fiddaman #endif
270*b30d1939SAndy Fiddaman 
271*b30d1939SAndy Fiddaman extern Dt_t*		dtopen _ARG_((Dtdisc_t*, Dtmethod_t*));
272*b30d1939SAndy Fiddaman extern int		dtclose _ARG_((Dt_t*));
273*b30d1939SAndy Fiddaman extern Dt_t*		dtview _ARG_((Dt_t*, Dt_t*));
274*b30d1939SAndy Fiddaman extern Dtdisc_t*	dtdisc _ARG_((Dt_t* dt, Dtdisc_t*, int));
275*b30d1939SAndy Fiddaman extern Dtmethod_t*	dtmethod _ARG_((Dt_t*, Dtmethod_t*));
276*b30d1939SAndy Fiddaman extern int		dtwalk _ARG_((Dt_t*, int(*)(Dt_t*,Void_t*,Void_t*), Void_t*));
277*b30d1939SAndy Fiddaman extern int		dtcustomize _ARG_((Dt_t*, int, int));
278*b30d1939SAndy Fiddaman extern unsigned int	dtstrhash _ARG_((unsigned int, Void_t*, ssize_t));
279*b30d1939SAndy Fiddaman extern int		dtuserlock _ARG_((Dt_t*, unsigned int, int));
280*b30d1939SAndy Fiddaman extern Void_t*		dtuserdata _ARG_((Dt_t*, Void_t*, unsigned int));
281*b30d1939SAndy Fiddaman 
282*b30d1939SAndy Fiddaman /* deal with upward binary compatibility (operation bit translation, etc.) */
283*b30d1939SAndy Fiddaman extern Dt_t*		_dtopen _ARG_((Dtdisc_t*, Dtmethod_t*, unsigned long));
284*b30d1939SAndy Fiddaman #define dtopen(dc,mt)	_dtopen((dc), (mt), CDT_VERSION)
285*b30d1939SAndy Fiddaman 
286*b30d1939SAndy Fiddaman #undef extern
287*b30d1939SAndy Fiddaman 
288*b30d1939SAndy Fiddaman #if _PACKAGE_ast && !defined(_CDTLIB_H)
289*b30d1939SAndy Fiddaman 
290*b30d1939SAndy Fiddaman #if _BLD_dll && defined(__EXPORT__)
291*b30d1939SAndy Fiddaman #define extern	__EXPORT__
292*b30d1939SAndy Fiddaman #endif
293*b30d1939SAndy Fiddaman 
294*b30d1939SAndy Fiddaman extern void*		dllmeth(const char*, const char*, unsigned long);
295*b30d1939SAndy Fiddaman 
296*b30d1939SAndy Fiddaman #undef	extern
297*b30d1939SAndy Fiddaman 
298*b30d1939SAndy Fiddaman #endif
299*b30d1939SAndy Fiddaman 
300*b30d1939SAndy Fiddaman _END_EXTERNS_
301*b30d1939SAndy Fiddaman 
302*b30d1939SAndy Fiddaman /* internal functions for translating among holder, object and key */
303*b30d1939SAndy Fiddaman #define _DT(dt)		((Dt_t*)(dt))
304*b30d1939SAndy Fiddaman 
305*b30d1939SAndy Fiddaman #define _DTLNK(dc,o)	((Dtlink_t*)((char*)(o) + (dc)->link) ) /* get link from obj */
306*b30d1939SAndy Fiddaman 
307*b30d1939SAndy Fiddaman #define _DTO(dc,l)	(Void_t*)((char*)(l) - (dc)->link) /* get object from link */
308*b30d1939SAndy Fiddaman #define _DTOBJ(dc,l)	((dc)->link >= 0 ? _DTO(dc,l) : ((Dthold_t*)(l))->obj )
309*b30d1939SAndy Fiddaman 
310*b30d1939SAndy Fiddaman #define _DTK(dc,o)	((char*)(o) + (dc)->key) /* get key from object */
311*b30d1939SAndy Fiddaman #define _DTKEY(dc,o)	(Void_t*)((dc)->size >= 0 ? _DTK(dc,o) : *((char**)_DTK(dc,o)) )
312*b30d1939SAndy Fiddaman 
313*b30d1939SAndy Fiddaman #define _DTCMP(dt,k1,k2,dc) \
314*b30d1939SAndy Fiddaman 			((dc)->comparf  ? (*(dc)->comparf)((dt), (k1), (k2), (dc)) : \
315*b30d1939SAndy Fiddaman 			 (dc)->size > 0 ? memcmp((Void_t*)(k1), ((Void_t*)k2), (dc)->size) : \
316*b30d1939SAndy Fiddaman 					  strcmp((char*)(k1), ((char*)k2)) )
317*b30d1939SAndy Fiddaman 
318*b30d1939SAndy Fiddaman #define _DTHSH(dt,ky,dc) ((dc)->hashf   ? (*(dc)->hashf)((dt), (ky), (dc)) : \
319*b30d1939SAndy Fiddaman 					  dtstrhash(0, (ky), (dc)->size) )
320*b30d1939SAndy Fiddaman 
321*b30d1939SAndy Fiddaman #define dtvnext(d)	(_DT(d)->view)
322*b30d1939SAndy Fiddaman #define dtvcount(d)	(_DT(d)->nview)
323*b30d1939SAndy Fiddaman #define dtvhere(d)	(_DT(d)->walk)
324*b30d1939SAndy Fiddaman 
325*b30d1939SAndy Fiddaman #define dtlink(d,e)	(((Dtlink_t*)(e))->rh.__rght)
326*b30d1939SAndy Fiddaman #define dtobj(d,e)	_DTOBJ(_DT(d)->disc, (e))
327*b30d1939SAndy Fiddaman 
328*b30d1939SAndy Fiddaman #define dtfirst(d)	(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_FIRST)
329*b30d1939SAndy Fiddaman #define dtnext(d,o)	(*(_DT(d)->searchf))((d),(Void_t*)(o),DT_NEXT)
330*b30d1939SAndy Fiddaman #define dtatleast(d,o)	(*(_DT(d)->searchf))((d),(Void_t*)(o),DT_ATLEAST)
331*b30d1939SAndy Fiddaman #define dtlast(d)	(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_LAST)
332*b30d1939SAndy Fiddaman #define dtprev(d,o)	(*(_DT(d)->searchf))((d),(Void_t*)(o),DT_PREV)
333*b30d1939SAndy Fiddaman #define dtatmost(d,o)	(*(_DT(d)->searchf))((d),(Void_t*)(o),DT_ATMOST)
334*b30d1939SAndy Fiddaman #define dtsearch(d,o)	(*(_DT(d)->searchf))((d),(Void_t*)(o),DT_SEARCH)
335*b30d1939SAndy Fiddaman #define dtmatch(d,o)	(*(_DT(d)->searchf))((d),(Void_t*)(o),DT_MATCH)
336*b30d1939SAndy Fiddaman #define dtinsert(d,o)	(*(_DT(d)->searchf))((d),(Void_t*)(o),DT_INSERT)
337*b30d1939SAndy Fiddaman #define dtappend(d,o)	(*(_DT(d)->searchf))((d),(Void_t*)(o),DT_APPEND)
338*b30d1939SAndy Fiddaman #define dtdelete(d,o)	(*(_DT(d)->searchf))((d),(Void_t*)(o),DT_DELETE)
339*b30d1939SAndy Fiddaman #define dtremove(d,o)	(*(_DT(d)->searchf))((d),(Void_t*)(o),DT_REMOVE)
340*b30d1939SAndy Fiddaman #define dtattach(d,o)	(*(_DT(d)->searchf))((d),(Void_t*)(o),DT_ATTACH)
341*b30d1939SAndy Fiddaman #define dtdetach(d,o)	(*(_DT(d)->searchf))((d),(Void_t*)(o),DT_DETACH)
342*b30d1939SAndy Fiddaman #define dtclear(d)	(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_CLEAR)
343*b30d1939SAndy Fiddaman 
344*b30d1939SAndy Fiddaman #define dtflatten(d)	(Dtlink_t*)(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_FLATTEN)
345*b30d1939SAndy Fiddaman #define dtextract(d)	(Dtlink_t*)(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_EXTRACT)
346*b30d1939SAndy Fiddaman #define dtrestore(d,l)	(Dtlink_t*)(*(_DT(d)->searchf))((d),(Void_t*)(l),DT_RESTORE)
347*b30d1939SAndy Fiddaman 
348*b30d1939SAndy Fiddaman #define dtstat(d,s)	(ssize_t)(*(_DT(d)->searchf))((d),(Void_t*)(s),DT_STAT)
349*b30d1939SAndy Fiddaman #define dtsize(d)	(ssize_t)(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_STAT)
350*b30d1939SAndy Fiddaman 
351*b30d1939SAndy Fiddaman #define DT_PRIME	17109811 /* 2#00000001 00000101 00010011 00110011 */
352*b30d1939SAndy Fiddaman #define dtcharhash(h,c) (((unsigned int)(h) + (unsigned int)(c)) * DT_PRIME )
353*b30d1939SAndy Fiddaman 
354*b30d1939SAndy Fiddaman #endif /* _CDT_H */
355