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 _CDTLIB_H
23*b30d1939SAndy Fiddaman #define _CDTLIB_H	1
24*b30d1939SAndy Fiddaman 
25*b30d1939SAndy Fiddaman /*	cdt library/method implementation header
26*b30d1939SAndy Fiddaman **	this header is exported to the method libraries
27*b30d1939SAndy Fiddaman **	Written by Kiem-Phong Vo (5/25/96)
28*b30d1939SAndy Fiddaman */
29*b30d1939SAndy Fiddaman 
30*b30d1939SAndy Fiddaman #if _PACKAGE_ast
31*b30d1939SAndy Fiddaman #include	<ast.h>
32*b30d1939SAndy Fiddaman #if !_BLD_cdt
33*b30d1939SAndy Fiddaman #include	<dlldefs.h>
34*b30d1939SAndy Fiddaman #endif
35*b30d1939SAndy Fiddaman #endif
36*b30d1939SAndy Fiddaman 
37*b30d1939SAndy Fiddaman #include	<cdt.h>
38*b30d1939SAndy Fiddaman #include	<unistd.h>
39*b30d1939SAndy Fiddaman #include	<aso.h>
40*b30d1939SAndy Fiddaman 
41*b30d1939SAndy Fiddaman #include	"debug.h"
42*b30d1939SAndy Fiddaman 
43*b30d1939SAndy Fiddaman /* short-hand notations */
44*b30d1939SAndy Fiddaman #define NIL(t)	((t)0)
45*b30d1939SAndy Fiddaman #define reg	register
46*b30d1939SAndy Fiddaman 
47*b30d1939SAndy Fiddaman /* min #bits for a hash table. (1<<this) is table size */
48*b30d1939SAndy Fiddaman #define DT_HTABLE	10
49*b30d1939SAndy Fiddaman 
50*b30d1939SAndy Fiddaman /* convenient types */
51*b30d1939SAndy Fiddaman #if !defined(uint)
52*b30d1939SAndy Fiddaman #define uint	unsigned int
53*b30d1939SAndy Fiddaman #endif
54*b30d1939SAndy Fiddaman #if !defined(uchar)
55*b30d1939SAndy Fiddaman #define uchar	unsigned char
56*b30d1939SAndy Fiddaman #endif
57*b30d1939SAndy Fiddaman 
58*b30d1939SAndy Fiddaman /* This struct holds private method data created on DT_OPEN */
59*b30d1939SAndy Fiddaman struct _dtdata_s
60*b30d1939SAndy Fiddaman {	unsigned int	lock;	/* general dictionary lock	*/
61*b30d1939SAndy Fiddaman 	Dtuser_t	user;	/* application's data		*/
62*b30d1939SAndy Fiddaman 	unsigned int	type;	/* method type, control flags	*/
63*b30d1939SAndy Fiddaman 	ssize_t		size;	/* number of objects		*/
64*b30d1939SAndy Fiddaman 	Dt_t		dict;	/* when DT_INDATA is requested	*/
65*b30d1939SAndy Fiddaman };
66*b30d1939SAndy Fiddaman 
67*b30d1939SAndy Fiddaman /* this structure holds the plugin information */
68*b30d1939SAndy Fiddaman typedef struct _dtlib_s
69*b30d1939SAndy Fiddaman {
70*b30d1939SAndy Fiddaman 	char*		name;		/* short name */
71*b30d1939SAndy Fiddaman 	char*		description;	/* short description */
72*b30d1939SAndy Fiddaman 	char*		release;	/* release info */
73*b30d1939SAndy Fiddaman 	char*		prefix;		/* name prefix */
74*b30d1939SAndy Fiddaman 	Dtmethod_t**	methods;	/* method list */
75*b30d1939SAndy Fiddaman } Dtlib_t;
76*b30d1939SAndy Fiddaman 
77*b30d1939SAndy Fiddaman #if _BLD_cdt
78*b30d1939SAndy Fiddaman 
79*b30d1939SAndy Fiddaman #if defined(__STDC__)
80*b30d1939SAndy Fiddaman #define CDTLIB(m)	__DEFINE__(Dtmethod_t*,m,&_##m);
81*b30d1939SAndy Fiddaman #else
82*b30d1939SAndy Fiddaman #define CDTLIB(m)	__DEFINE__(Dtmethod_t*,m,&_/**/m);
83*b30d1939SAndy Fiddaman #endif
84*b30d1939SAndy Fiddaman 
85*b30d1939SAndy Fiddaman #else
86*b30d1939SAndy Fiddaman 
87*b30d1939SAndy Fiddaman #if defined(__STDC__)
88*b30d1939SAndy Fiddaman #define CDTLIB(m) \
89*b30d1939SAndy Fiddaman 	void* cdt_lib(const char* name, Dtdisc_t* disc, const char* type) \
90*b30d1939SAndy Fiddaman 	{ \
91*b30d1939SAndy Fiddaman 		int	i; \
92*b30d1939SAndy Fiddaman 		int	n; \
93*b30d1939SAndy Fiddaman 		if (!type) \
94*b30d1939SAndy Fiddaman 			return &cdt_lib_##m; \
95*b30d1939SAndy Fiddaman 		n = strlen(cdt_lib_##m.prefix); \
96*b30d1939SAndy Fiddaman 		if (!strncmp(type, cdt_lib_##m.prefix, n)) \
97*b30d1939SAndy Fiddaman 			type += n; \
98*b30d1939SAndy Fiddaman 		for (i = 0; cdt_lib_##m.methods[i]; i++) \
99*b30d1939SAndy Fiddaman 			if (!strcmp(type, cdt_lib_##m.methods[i]->name + n)) \
100*b30d1939SAndy Fiddaman 				return cdt_lib_##m.methods[i]; \
101*b30d1939SAndy Fiddaman 		return 0; \
102*b30d1939SAndy Fiddaman 	} \
103*b30d1939SAndy Fiddaman 	unsigned long plugin_version(void) { return CDT_PLUGIN_VERSION; }
104*b30d1939SAndy Fiddaman #else
105*b30d1939SAndy Fiddaman #define CDTLIB(m) \
106*b30d1939SAndy Fiddaman 	void* cdt_lib(name, disc, type) const char* name; Dtdisc_t* disc; const char* type; \
107*b30d1939SAndy Fiddaman 	{ \
108*b30d1939SAndy Fiddaman 		int	i; \
109*b30d1939SAndy Fiddaman 		int	n; \
110*b30d1939SAndy Fiddaman 		if (!type) \
111*b30d1939SAndy Fiddaman 			return &cdt_lib_/**/m; \
112*b30d1939SAndy Fiddaman 		n = strlen(cdt_lib_/**/m.prefix); \
113*b30d1939SAndy Fiddaman 		if (!strncmp(type, cdt_lib_/**/m.prefix, n)) \
114*b30d1939SAndy Fiddaman 			type += n; \
115*b30d1939SAndy Fiddaman 		for (i = 0; cdt_lib_/**/m.methods[i]; i++) \
116*b30d1939SAndy Fiddaman 			if (!strcmp(type, cdt_lib_/**/m.methods[i]->name + n)) \
117*b30d1939SAndy Fiddaman 				return cdt_lib_/**/m.methods[i]; \
118*b30d1939SAndy Fiddaman 		return 0; \
119*b30d1939SAndy Fiddaman 	} \
120*b30d1939SAndy Fiddaman 	unsigned long plugin_version() { return CDT_PLUGIN_VERSION; }
121*b30d1939SAndy Fiddaman #endif
122*b30d1939SAndy Fiddaman 
123*b30d1939SAndy Fiddaman #endif /* _BLD_cdt */
124*b30d1939SAndy Fiddaman 
125*b30d1939SAndy Fiddaman /* these macros lock/unlock dictionaries. DTRETURN substitutes for "return" */
126*b30d1939SAndy Fiddaman #define DTSETLOCK(dt)		(((dt)->data->type&DT_SHARE) ? asolock(&(dt)->data->lock,1,ASO_SPINLOCK) : 0 )
127*b30d1939SAndy Fiddaman #define DTCLRLOCK(dt)		(((dt)->data->type&DT_SHARE) ? asolock(&(dt)->data->lock,1,ASO_UNLOCK) : 0 )
128*b30d1939SAndy Fiddaman #define DTRETURN(ob,rv)		do { (ob) = (rv); goto dt_return; } while(0)
129*b30d1939SAndy Fiddaman #define DTERROR(dt, mesg) 	(!((dt)->disc && (dt)->disc->eventf) ? 0 : \
130*b30d1939SAndy Fiddaman 				  (*(dt)->disc->eventf)((dt),DT_ERROR,(Void_t*)(mesg),(dt)->disc) )
131*b30d1939SAndy Fiddaman 
132*b30d1939SAndy Fiddaman /* announce completion of an operation of type (ty) on some object (ob) in dictionary (dt) */
133*b30d1939SAndy Fiddaman #define DTANNOUNCE(dt,ob,ty)	( ((ob) && ((ty)&DT_TOANNOUNCE) && ((dt)->data->type&DT_ANNOUNCE) && \
134*b30d1939SAndy Fiddaman 				   (dt)->disc && (dt)->disc->eventf ) ? \
135*b30d1939SAndy Fiddaman 					(*(dt)->disc->eventf)((dt), DT_ANNOUNCE|(ty), (ob), (dt)->disc) : 0 )
136*b30d1939SAndy Fiddaman 
137*b30d1939SAndy Fiddaman /* map bits for upward compabitibility */
138*b30d1939SAndy Fiddaman #define DTTYPE(dt,ty)		((dt)->typef ? (*(dt)->typef)((dt), (ty)) : (ty) )
139*b30d1939SAndy Fiddaman 
140*b30d1939SAndy Fiddaman /* short-hands for fields in Dtlink_t.
141*b30d1939SAndy Fiddaman ** note that __hash is used as a hash value
142*b30d1939SAndy Fiddaman ** or as the position in the parent table.
143*b30d1939SAndy Fiddaman */
144*b30d1939SAndy Fiddaman #define _left	lh.__left
145*b30d1939SAndy Fiddaman #define _hash	lh.__hash
146*b30d1939SAndy Fiddaman #define _ppos	lh.__hash
147*b30d1939SAndy Fiddaman 
148*b30d1939SAndy Fiddaman #define _rght	rh.__rght
149*b30d1939SAndy Fiddaman #define _ptbl	rh.__ptbl
150*b30d1939SAndy Fiddaman 
151*b30d1939SAndy Fiddaman /* tree rotation/linking functions */
152*b30d1939SAndy Fiddaman #define rrotate(x,y)	((x)->_left = (y)->_rght, (y)->_rght = (x))
153*b30d1939SAndy Fiddaman #define lrotate(x,y)	((x)->_rght = (y)->_left, (y)->_left = (x))
154*b30d1939SAndy Fiddaman #define rlink(r,x)	((r) = (r)->_left = (x) )
155*b30d1939SAndy Fiddaman #define llink(l,x)	((l) = (l)->_rght = (x) )
156*b30d1939SAndy Fiddaman 
157*b30d1939SAndy Fiddaman #define RROTATE(x,y)	(rrotate(x,y), (x) = (y))
158*b30d1939SAndy Fiddaman #define LROTATE(x,y)	(lrotate(x,y), (x) = (y))
159*b30d1939SAndy Fiddaman #define RRSHIFT(x,t)	((t) = (x)->_left->_left, (x)->_left->_left = (t)->_rght, \
160*b30d1939SAndy Fiddaman 			 (t)->_rght = (x), (x) = (t) )
161*b30d1939SAndy Fiddaman #define LLSHIFT(x,t)	((t) = (x)->_rght->_rght, (x)->_rght->_rght = (t)->_left, \
162*b30d1939SAndy Fiddaman 			 (t)->_left = (x), (x) = (t) )
163*b30d1939SAndy Fiddaman 
164*b30d1939SAndy Fiddaman _BEGIN_EXTERNS_
165*b30d1939SAndy Fiddaman 
166*b30d1939SAndy Fiddaman #if _BLD_cdt && defined(__EXPORT__)
167*b30d1939SAndy Fiddaman #define extern	__EXPORT__
168*b30d1939SAndy Fiddaman #endif
169*b30d1939SAndy Fiddaman 
170*b30d1939SAndy Fiddaman extern Dtlink_t*	_dtmake _ARG_((Dt_t*, Void_t*, int));
171*b30d1939SAndy Fiddaman extern void		_dtfree _ARG_((Dt_t*, Dtlink_t*, int));
172*b30d1939SAndy Fiddaman extern int		_dtlock _ARG_((Dt_t*, int));
173*b30d1939SAndy Fiddaman 
174*b30d1939SAndy Fiddaman #undef	extern
175*b30d1939SAndy Fiddaman 
176*b30d1939SAndy Fiddaman #if !_PACKAGE_ast
177*b30d1939SAndy Fiddaman extern Void_t*		malloc _ARG_((size_t));
178*b30d1939SAndy Fiddaman extern Void_t*		realloc _ARG_((Void_t*, size_t));
179*b30d1939SAndy Fiddaman extern void		free _ARG_((Void_t*));
180*b30d1939SAndy Fiddaman #endif
181*b30d1939SAndy Fiddaman _END_EXTERNS_
182*b30d1939SAndy Fiddaman 
183*b30d1939SAndy Fiddaman #endif /* _CDTLIB_H */
184