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