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