/*********************************************************************** * * * This software is part of the ast package * * Copyright (c) 1985-2011 AT&T Intellectual Property * * Copyright (c) 2020-2021 Contributors to ksh 93u+m * * and is licensed under the * * Eclipse Public License, Version 1.0 * * by AT&T Intellectual Property * * * * A copy of the License is available at * * http://www.eclipse.org/org/documents/epl-v10.html * * (with md5 checksum b35adb5213ca9657e911e9befb180842) * * * * Information and Software Systems Research * * AT&T Research * * Florham Park NJ * * * * Glenn Fowler * * David Korn * * Phong Vo * * * ***********************************************************************/ #ifndef _CDTLIB_H #define _CDTLIB_H 1 /* cdt library/method implementation header ** this header is exported to the method libraries ** Written by Kiem-Phong Vo (5/25/96) */ #if _PACKAGE_ast #include #if !_BLD_cdt #include #endif #endif #include #include #include #include "debug.h" /* shorthand notations */ #define NIL(t) ((t)0) #define reg register /* min #bits for a hash table. (1<name + n)) \ return cdt_lib_##m.methods[i]; \ return 0; \ } \ unsigned long plugin_version(void) { return CDT_PLUGIN_VERSION; } #endif /* _BLD_cdt */ /* these macros lock/unlock dictionaries. DTRETURN substitutes for "return" */ #define DTSETLOCK(dt) (((dt)->data->type&DT_SHARE) ? asolock(&(dt)->data->lock,1,ASO_LOCK) : 0 ) #define DTCLRLOCK(dt) (((dt)->data->type&DT_SHARE) ? asolock(&(dt)->data->lock,1,ASO_UNLOCK) : 0 ) #define DTRETURN(ob,rv) do { (ob) = (rv); goto dt_return; } while(0) #define DTERROR(dt, mesg) (!((dt)->disc && (dt)->disc->eventf) ? 0 : \ (*(dt)->disc->eventf)((dt),DT_ERROR,(void*)(mesg),(dt)->disc) ) /* announce completion of an operation of type (ty) on some object (ob) in dictionary (dt) */ #define DTANNOUNCE(dt,ob,ty) ( ((ob) && ((ty)&DT_TOANNOUNCE) && ((dt)->data->type&DT_ANNOUNCE) && \ (dt)->disc && (dt)->disc->eventf ) ? \ (*(dt)->disc->eventf)((dt), DT_ANNOUNCE|(ty), (ob), (dt)->disc) : 0 ) /* map bits for upward compatibility */ #define DTTYPE(dt,ty) ((dt)->typef ? (*(dt)->typef)((dt), (ty)) : (ty) ) /* shorthands for fields in Dtlink_t. ** note that __hash is used as a hash value ** or as the position in the parent table. */ #define _left lh.__left #define _hash lh.__hash #define _ppos lh.__hash #define _rght rh.__rght #define _ptbl rh.__ptbl /* tree rotation/linking functions */ #define rrotate(x,y) ((x)->_left = (y)->_rght, (y)->_rght = (x)) #define lrotate(x,y) ((x)->_rght = (y)->_left, (y)->_left = (x)) #define rlink(r,x) ((r) = (r)->_left = (x) ) #define llink(l,x) ((l) = (l)->_rght = (x) ) #define RROTATE(x,y) (rrotate(x,y), (x) = (y)) #define LROTATE(x,y) (lrotate(x,y), (x) = (y)) #define RRSHIFT(x,t) ((t) = (x)->_left->_left, (x)->_left->_left = (t)->_rght, \ (t)->_rght = (x), (x) = (t) ) #define LLSHIFT(x,t) ((t) = (x)->_rght->_rght, (x)->_rght->_rght = (t)->_left, \ (t)->_left = (x), (x) = (t) ) #if _BLD_cdt && defined(__EXPORT__) #define extern __EXPORT__ #endif extern Dtlink_t* _dtmake(Dt_t*, void*, int); extern void _dtfree(Dt_t*, Dtlink_t*, int); extern int _dtlock(Dt_t*, int); #undef extern #if !_PACKAGE_ast extern void* malloc(size_t); extern void* realloc(void*, size_t); extern void free(void*); #endif #endif /* _CDTLIB_H */