|
Packit |
992a25 |
/***********************************************************************
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
* This software is part of the ast package *
|
|
Packit |
992a25 |
* Copyright (c) 1985-2011 AT&T Intellectual Property *
|
|
Packit |
992a25 |
* and is licensed under the *
|
|
Packit |
992a25 |
* Eclipse Public License, Version 1.0 *
|
|
Packit |
992a25 |
* by AT&T Intellectual Property *
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
* A copy of the License is available at *
|
|
Packit |
992a25 |
* http://www.eclipse.org/org/documents/epl-v10.html *
|
|
Packit |
992a25 |
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
* Information and Software Systems Research *
|
|
Packit |
992a25 |
* AT&T Research *
|
|
Packit |
992a25 |
* Florham Park NJ *
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
* Glenn Fowler <gsf@research.att.com> *
|
|
Packit |
992a25 |
* David Korn <dgk@research.att.com> *
|
|
Packit |
992a25 |
* Phong Vo <kpv@research.att.com> *
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
***********************************************************************/
|
|
Packit |
992a25 |
#ifndef _CDT_H
|
|
Packit |
992a25 |
#define _CDT_H 1
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* Public interface for the dictionary library
|
|
Packit |
992a25 |
**
|
|
Packit |
992a25 |
** Written by Kiem-Phong Vo
|
|
Packit |
992a25 |
*/
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#ifndef CDT_VERSION
|
|
Packit |
992a25 |
#ifdef _API_ast
|
|
Packit |
992a25 |
#define CDT_VERSION _API_ast
|
|
Packit |
992a25 |
#else
|
|
Packit |
992a25 |
#define CDT_VERSION 20111111L
|
|
Packit |
992a25 |
#endif /*_AST_api*/
|
|
Packit |
992a25 |
#endif /*CDT_VERSION*/
|
|
Packit |
992a25 |
#ifndef AST_PLUGIN_VERSION
|
|
Packit |
992a25 |
#define AST_PLUGIN_VERSION(v) (v)
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
#define CDT_PLUGIN_VERSION AST_PLUGIN_VERSION(20111111L)
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#if _PACKAGE_ast
|
|
Packit |
992a25 |
#include <ast_std.h>
|
|
Packit |
992a25 |
#else
|
|
Packit |
992a25 |
#include <ast_common.h>
|
|
Packit |
992a25 |
#include <string.h>
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* commonly used integers */
|
|
Packit |
992a25 |
#define DT_ZERO ((unsigned int)0) /* all zero bits */
|
|
Packit |
992a25 |
#define DT_ONES (~DT_ZERO) /* all one bits */
|
|
Packit |
992a25 |
#define DT_HIBIT (~(DT_ONES >> 1) ) /* highest 1 bit */
|
|
Packit |
992a25 |
#define DT_LOBIT ((unsigned int)1) /* lowest 1 bit */
|
|
Packit |
992a25 |
#define DT_NBITS (sizeof(unsigned int)*8) /* #bits */
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* type of an integer with the same size as a pointer */
|
|
Packit |
992a25 |
#define Dtuint_t uintptr_t
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* various types used by CDT */
|
|
Packit |
992a25 |
typedef struct _dtlink_s Dtlink_t;
|
|
Packit |
992a25 |
typedef struct _dthold_s Dthold_t;
|
|
Packit |
992a25 |
typedef struct _dtdisc_s Dtdisc_t;
|
|
Packit |
992a25 |
typedef struct _dtmethod_s Dtmethod_t;
|
|
Packit |
992a25 |
typedef struct _dtdata_s Dtdata_t;
|
|
Packit |
992a25 |
typedef struct _dtuser_s Dtuser_t;
|
|
Packit |
992a25 |
typedef struct _dt_s Dt_t;
|
|
Packit |
992a25 |
typedef struct _dtstat_s Dtstat_t;
|
|
Packit |
992a25 |
typedef Void_t* (*Dtsearch_f)_ARG_((Dt_t*,Void_t*,int));
|
|
Packit |
992a25 |
typedef Void_t* (*Dtmake_f)_ARG_((Dt_t*,Void_t*,Dtdisc_t*));
|
|
Packit |
992a25 |
typedef void (*Dtfree_f)_ARG_((Dt_t*,Void_t*,Dtdisc_t*));
|
|
Packit |
992a25 |
typedef int (*Dtcompar_f)_ARG_((Dt_t*,Void_t*,Void_t*,Dtdisc_t*));
|
|
Packit |
992a25 |
typedef unsigned int (*Dthash_f)_ARG_((Dt_t*,Void_t*,Dtdisc_t*));
|
|
Packit |
992a25 |
typedef Void_t* (*Dtmemory_f)_ARG_((Dt_t*,Void_t*,size_t,Dtdisc_t*));
|
|
Packit |
992a25 |
typedef int (*Dtevent_f)_ARG_((Dt_t*,int,Void_t*,Dtdisc_t*));
|
|
Packit |
992a25 |
typedef int (*Dttype_f)_ARG_((Dt_t*,int));
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
struct _dtuser_s /* for application to access and use */
|
|
Packit |
992a25 |
{ unsigned int lock; /* used by dtapplock */
|
|
Packit |
992a25 |
Void_t* data; /* for whatever data */
|
|
Packit |
992a25 |
};
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
struct _dtlink_s
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
#if CDT_VERSION < 20111111L
|
|
Packit |
992a25 |
Dtlink_t* right; /* right child */
|
|
Packit |
992a25 |
union
|
|
Packit |
992a25 |
{ unsigned int _hash; /* hash value */
|
|
Packit |
992a25 |
Dtlink_t* _left; /* left child */
|
|
Packit |
992a25 |
} hl;
|
|
Packit |
992a25 |
#else
|
|
Packit |
992a25 |
union
|
|
Packit |
992a25 |
{ Dtlink_t* __rght; /* right child or next */
|
|
Packit |
992a25 |
Dtlink_t* __ptbl; /* Dtrehash parent tbl */
|
|
Packit |
992a25 |
} rh;
|
|
Packit |
992a25 |
union
|
|
Packit |
992a25 |
{ Dtlink_t* __left; /* left child or prev */
|
|
Packit |
992a25 |
unsigned int __hash; /* hash value of object */
|
|
Packit |
992a25 |
} lh;
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
};
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* private structure to hold an object */
|
|
Packit |
992a25 |
struct _dthold_s
|
|
Packit |
992a25 |
{ Dtlink_t hdr; /* header to hold obj */
|
|
Packit |
992a25 |
Void_t* obj; /* application object */
|
|
Packit |
992a25 |
};
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* method to manipulate dictionary structure */
|
|
Packit |
992a25 |
struct _dtmethod_s
|
|
Packit |
992a25 |
{ Dtsearch_f searchf; /* search function */
|
|
Packit |
992a25 |
unsigned int type; /* type of operation */
|
|
Packit |
992a25 |
int (*eventf)_ARG_((Dt_t*, int, Void_t*));
|
|
Packit |
992a25 |
char* name; /* name of method */
|
|
Packit |
992a25 |
char* description; /* description */
|
|
Packit |
992a25 |
};
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* structure to hold methods that manipulate an object */
|
|
Packit |
992a25 |
struct _dtdisc_s
|
|
Packit |
992a25 |
{ int key; /* where the key resides */
|
|
Packit |
992a25 |
int size; /* key size and type */
|
|
Packit |
992a25 |
int link; /* offset to Dtlink_t field */
|
|
Packit |
992a25 |
Dtmake_f makef; /* object constructor */
|
|
Packit |
992a25 |
Dtfree_f freef; /* object destructor */
|
|
Packit |
992a25 |
Dtcompar_f comparf;/* to compare two objects */
|
|
Packit |
992a25 |
Dthash_f hashf; /* to compute hash value */
|
|
Packit |
992a25 |
Dtmemory_f memoryf;/* to allocate/free memory */
|
|
Packit |
992a25 |
Dtevent_f eventf; /* to process events */
|
|
Packit |
992a25 |
};
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define DTDISC(dc,ky,sz,lk,mkf,frf,cmpf,hshf,memf,evf) \
|
|
Packit |
992a25 |
( (dc)->key = (int)(ky), (dc)->size = (int)(sz), (dc)->link = (int)(lk), \
|
|
Packit |
992a25 |
(dc)->makef = (mkf), (dc)->freef = (frf), \
|
|
Packit |
992a25 |
(dc)->comparf = (cmpf), (dc)->hashf = (hshf), \
|
|
Packit |
992a25 |
(dc)->memoryf = (memf), (dc)->eventf = (evf) )
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#ifdef offsetof
|
|
Packit |
992a25 |
#define DTOFFSET(struct_s, member) offsetof(struct_s, member)
|
|
Packit |
992a25 |
#else
|
|
Packit |
992a25 |
#define DTOFFSET(struct_s, member) ((int)(&((struct_s*)0)->member))
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* the dictionary structure itself */
|
|
Packit |
992a25 |
struct _dt_s
|
|
Packit |
992a25 |
{ Dtsearch_f searchf;/* search function */
|
|
Packit |
992a25 |
Dtdisc_t* disc; /* object type definitition */
|
|
Packit |
992a25 |
Dtdata_t* data; /* sharable data */
|
|
Packit |
992a25 |
Dtmemory_f memoryf;/* for memory allocation */
|
|
Packit |
992a25 |
Dtmethod_t* meth; /* storage method */
|
|
Packit |
992a25 |
ssize_t nview; /* #parent view dictionaries */
|
|
Packit |
992a25 |
Dt_t* view; /* next on viewpath */
|
|
Packit |
992a25 |
Dt_t* walk; /* dictionary being walked */
|
|
Packit |
992a25 |
Dtuser_t* user; /* for user's usage */
|
|
Packit |
992a25 |
Dttype_f typef; /* for binary compatibility */
|
|
Packit |
992a25 |
};
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* structure to get status of a dictionary */
|
|
Packit |
992a25 |
#define DT_MAXRECURSE 1024 /* limit to avoid stack overflow */
|
|
Packit |
992a25 |
#define DT_MAXSIZE 256 /* limit for size of below arrays */
|
|
Packit |
992a25 |
struct _dtstat_s
|
|
Packit |
992a25 |
{ unsigned int meth; /* method type */
|
|
Packit |
992a25 |
ssize_t size; /* total # of elements in dictionary */
|
|
Packit |
992a25 |
ssize_t space; /* memory usage of data structure */
|
|
Packit |
992a25 |
ssize_t mlev; /* max #levels in tree or hash table */
|
|
Packit |
992a25 |
ssize_t msize; /* max #defined elts in below arrays */
|
|
Packit |
992a25 |
ssize_t lsize[DT_MAXSIZE]; /* #objects by level */
|
|
Packit |
992a25 |
ssize_t tsize[DT_MAXSIZE]; /* #tables by level */
|
|
Packit |
992a25 |
};
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* supported storage methods */
|
|
Packit |
992a25 |
#define DT_SET 0000000001 /* unordered set, unique elements */
|
|
Packit |
992a25 |
#define DT_BAG 0000000002 /* unordered set, repeated elements */
|
|
Packit |
992a25 |
#define DT_OSET 0000000004 /* ordered set */
|
|
Packit |
992a25 |
#define DT_OBAG 0000000010 /* ordered multiset */
|
|
Packit |
992a25 |
#define DT_LIST 0000000020 /* linked list */
|
|
Packit |
992a25 |
#define DT_STACK 0000000040 /* stack: insert/delete at top */
|
|
Packit |
992a25 |
#define DT_QUEUE 0000000100 /* queue: insert top, delete at tail */
|
|
Packit |
992a25 |
#define DT_DEQUE 0000000200 /* deque: insert top, append at tail */
|
|
Packit |
992a25 |
#define DT_RHSET 0000000400 /* rhset: sharable unique objects */
|
|
Packit |
992a25 |
#define DT_RHBAG 0000001000 /* rhbag: sharable repeated objects */
|
|
Packit |
992a25 |
#define DT_METHODS 0000001777 /* all currently supported methods */
|
|
Packit |
992a25 |
#define DT_ORDERED (DT_OSET|DT_OBAG)
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* asserts to dtdisc() to improve performance when changing disciplines */
|
|
Packit |
992a25 |
#define DT_SAMECMP 0000000001 /* compare functions are equivalent */
|
|
Packit |
992a25 |
#define DT_SAMEHASH 0000000002 /* hash functions are equivalent */
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* operation types */
|
|
Packit |
992a25 |
#define DT_INSERT 0000000001 /* insert object if not found */
|
|
Packit |
992a25 |
#define DT_DELETE 0000000002 /* delete a matching object if any */
|
|
Packit |
992a25 |
#define DT_SEARCH 0000000004 /* look for an object */
|
|
Packit |
992a25 |
#define DT_NEXT 0000000010 /* look for next element */
|
|
Packit |
992a25 |
#define DT_PREV 0000000020 /* find previous element */
|
|
Packit |
992a25 |
#define DT_FIRST 0000000200 /* get first object */
|
|
Packit |
992a25 |
#define DT_LAST 0000000400 /* get last object */
|
|
Packit |
992a25 |
#define DT_MATCH 0000001000 /* find object matching key */
|
|
Packit |
992a25 |
#define DT_ATTACH 0000004000 /* attach an object to dictionary */
|
|
Packit |
992a25 |
#define DT_DETACH 0000010000 /* detach an object from dictionary */
|
|
Packit |
992a25 |
#define DT_APPEND 0000020000 /* append an object */
|
|
Packit |
992a25 |
#define DT_ATLEAST 0000040000 /* find the least elt >= object */
|
|
Packit |
992a25 |
#define DT_ATMOST 0000100000 /* find the biggest elt <= object */
|
|
Packit |
992a25 |
#define DT_REMOVE 0002000000 /* remove a specific object */
|
|
Packit |
992a25 |
#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)
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define DT_RELINK 0000002000 /* re-inserting (dtdisc,dtmethod...) */
|
|
Packit |
992a25 |
#define DT_FLATTEN 0000000040 /* flatten objects into a list */
|
|
Packit |
992a25 |
#define DT_CLEAR 0000000100 /* clearing all objects */
|
|
Packit |
992a25 |
#define DT_EXTRACT 0000200000 /* FLATTEN and clear dictionary */
|
|
Packit |
992a25 |
#define DT_RESTORE 0000400000 /* reinsert a list of elements */
|
|
Packit |
992a25 |
#define DT_STAT 0001000000 /* get statistics of dictionary */
|
|
Packit |
992a25 |
#define DT_OPERATIONS (DT_TOANNOUNCE|DT_RELINK|DT_FLATTEN|DT_CLEAR|DT_EXTRACT|DT_RESTORE|DT_STAT)
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* these bits may combine with the DT_METHODS and DT_OPERATIONS bits */
|
|
Packit |
992a25 |
#define DT_INDATA 0010000000 /* Dt_t was allocated with Dtdata_t */
|
|
Packit |
992a25 |
#define DT_SHARE 0020000000 /* concurrent access mode */
|
|
Packit |
992a25 |
#define DT_ANNOUNCE 0040000000 /* announcing a successful operation */
|
|
Packit |
992a25 |
/* the actual event will be this bit */
|
|
Packit |
992a25 |
/* combined with the operation bit */
|
|
Packit |
992a25 |
#define DT_OPTIMIZE 0100000000 /* optimizing data structure */
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* events for discipline and method event-handling functions */
|
|
Packit |
992a25 |
#define DT_OPEN 1 /* a dictionary is being opened */
|
|
Packit |
992a25 |
#define DT_ENDOPEN 5 /* end of dictionary opening */
|
|
Packit |
992a25 |
#define DT_CLOSE 2 /* a dictionary is being closed */
|
|
Packit |
992a25 |
#define DT_ENDCLOSE 6 /* end of dictionary closing */
|
|
Packit |
992a25 |
#define DT_DISC 3 /* discipline is about to be changed */
|
|
Packit |
992a25 |
#define DT_METH 4 /* method is about to be changed */
|
|
Packit |
992a25 |
#define DT_HASHSIZE 7 /* initialize hash table size */
|
|
Packit |
992a25 |
#define DT_ERROR 0xbad /* announcing an error */
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
_BEGIN_EXTERNS_ /* data structures and functions */
|
|
Packit |
992a25 |
#if _BLD_cdt && defined(__EXPORT__)
|
|
Packit |
992a25 |
#define extern __EXPORT__
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
#if !_BLD_cdt && defined(__IMPORT__)
|
|
Packit |
992a25 |
#define extern __IMPORT__
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
extern Dtmethod_t* Dtset;
|
|
Packit |
992a25 |
extern Dtmethod_t* Dtbag;
|
|
Packit |
992a25 |
extern Dtmethod_t* Dtoset;
|
|
Packit |
992a25 |
extern Dtmethod_t* Dtobag;
|
|
Packit |
992a25 |
extern Dtmethod_t* Dtlist;
|
|
Packit |
992a25 |
extern Dtmethod_t* Dtstack;
|
|
Packit |
992a25 |
extern Dtmethod_t* Dtqueue;
|
|
Packit |
992a25 |
extern Dtmethod_t* Dtdeque;
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#if _PACKAGE_ast /* dtplugin() for proprietary and non-standard methods -- requires -ldll */
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define dtplugin(name) ((Dtmethod_t*)dllmeth("cdt", name, CDT_PLUGIN_VERSION))
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define Dtrhbag dtplugin("rehash:Dtrhbag")
|
|
Packit |
992a25 |
#define Dtrhset dtplugin("rehash:Dtrhset")
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#else
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#if CDTPROPRIETARY
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
extern Dtmethod_t* Dtrhset;
|
|
Packit |
992a25 |
extern Dtmethod_t* Dtrhbag;
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#endif /*CDTPROPRIETARY*/
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#endif /*_PACKAGE_ast*/
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#undef extern
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#if _BLD_cdt && defined(__EXPORT__)
|
|
Packit |
992a25 |
#define extern __EXPORT__
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
extern Dt_t* dtopen _ARG_((Dtdisc_t*, Dtmethod_t*));
|
|
Packit |
992a25 |
extern int dtclose _ARG_((Dt_t*));
|
|
Packit |
992a25 |
extern Dt_t* dtview _ARG_((Dt_t*, Dt_t*));
|
|
Packit |
992a25 |
extern Dtdisc_t* dtdisc _ARG_((Dt_t* dt, Dtdisc_t*, int));
|
|
Packit |
992a25 |
extern Dtmethod_t* dtmethod _ARG_((Dt_t*, Dtmethod_t*));
|
|
Packit |
992a25 |
extern int dtwalk _ARG_((Dt_t*, int(*)(Dt_t*,Void_t*,Void_t*), Void_t*));
|
|
Packit |
992a25 |
extern int dtcustomize _ARG_((Dt_t*, int, int));
|
|
Packit |
992a25 |
extern unsigned int dtstrhash _ARG_((unsigned int, Void_t*, ssize_t));
|
|
Packit |
992a25 |
extern int dtuserlock _ARG_((Dt_t*, unsigned int, int));
|
|
Packit |
992a25 |
extern Void_t* dtuserdata _ARG_((Dt_t*, Void_t*, unsigned int));
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* deal with upward binary compatibility (operation bit translation, etc.) */
|
|
Packit |
992a25 |
extern Dt_t* _dtopen _ARG_((Dtdisc_t*, Dtmethod_t*, unsigned long));
|
|
Packit |
992a25 |
#define dtopen(dc,mt) _dtopen((dc), (mt), CDT_VERSION)
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#undef extern
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#if _PACKAGE_ast && !defined(_CDTLIB_H)
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#if _BLD_dll && defined(__EXPORT__)
|
|
Packit |
992a25 |
#define extern __EXPORT__
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
extern void* dllmeth(const char*, const char*, unsigned long);
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#undef extern
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
_END_EXTERNS_
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/* internal functions for translating among holder, object and key */
|
|
Packit |
992a25 |
#define _DT(dt) ((Dt_t*)(dt))
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define _DTLNK(dc,o) ((Dtlink_t*)((char*)(o) + (dc)->link) ) /* get link from obj */
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define _DTO(dc,l) (Void_t*)((char*)(l) - (dc)->link) /* get object from link */
|
|
Packit |
992a25 |
#define _DTOBJ(dc,l) ((dc)->link >= 0 ? _DTO(dc,l) : ((Dthold_t*)(l))->obj )
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define _DTK(dc,o) ((char*)(o) + (dc)->key) /* get key from object */
|
|
Packit |
992a25 |
#define _DTKEY(dc,o) (Void_t*)((dc)->size >= 0 ? _DTK(dc,o) : *((char**)_DTK(dc,o)) )
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define _DTCMP(dt,k1,k2,dc) \
|
|
Packit |
992a25 |
((dc)->comparf ? (*(dc)->comparf)((dt), (k1), (k2), (dc)) : \
|
|
Packit |
992a25 |
(dc)->size > 0 ? memcmp((Void_t*)(k1), ((Void_t*)k2), (dc)->size) : \
|
|
Packit |
992a25 |
strcmp((char*)(k1), ((char*)k2)) )
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define _DTHSH(dt,ky,dc) ((dc)->hashf ? (*(dc)->hashf)((dt), (ky), (dc)) : \
|
|
Packit |
992a25 |
dtstrhash(0, (ky), (dc)->size) )
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define dtvnext(d) (_DT(d)->view)
|
|
Packit |
992a25 |
#define dtvcount(d) (_DT(d)->nview)
|
|
Packit |
992a25 |
#define dtvhere(d) (_DT(d)->walk)
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define dtlink(d,e) (((Dtlink_t*)(e))->rh.__rght)
|
|
Packit |
992a25 |
#define dtobj(d,e) _DTOBJ(_DT(d)->disc, (e))
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define dtfirst(d) (*(_DT(d)->searchf))((d),(Void_t*)(0),DT_FIRST)
|
|
Packit |
992a25 |
#define dtnext(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_NEXT)
|
|
Packit |
992a25 |
#define dtatleast(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_ATLEAST)
|
|
Packit |
992a25 |
#define dtlast(d) (*(_DT(d)->searchf))((d),(Void_t*)(0),DT_LAST)
|
|
Packit |
992a25 |
#define dtprev(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_PREV)
|
|
Packit |
992a25 |
#define dtatmost(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_ATMOST)
|
|
Packit |
992a25 |
#define dtsearch(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_SEARCH)
|
|
Packit |
992a25 |
#define dtmatch(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_MATCH)
|
|
Packit |
992a25 |
#define dtinsert(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_INSERT)
|
|
Packit |
992a25 |
#define dtappend(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_APPEND)
|
|
Packit |
992a25 |
#define dtdelete(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_DELETE)
|
|
Packit |
992a25 |
#define dtremove(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_REMOVE)
|
|
Packit |
992a25 |
#define dtattach(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_ATTACH)
|
|
Packit |
992a25 |
#define dtdetach(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_DETACH)
|
|
Packit |
992a25 |
#define dtclear(d) (*(_DT(d)->searchf))((d),(Void_t*)(0),DT_CLEAR)
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define dtflatten(d) (Dtlink_t*)(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_FLATTEN)
|
|
Packit |
992a25 |
#define dtextract(d) (Dtlink_t*)(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_EXTRACT)
|
|
Packit |
992a25 |
#define dtrestore(d,l) (Dtlink_t*)(*(_DT(d)->searchf))((d),(Void_t*)(l),DT_RESTORE)
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define dtstat(d,s) (ssize_t)(*(_DT(d)->searchf))((d),(Void_t*)(s),DT_STAT)
|
|
Packit |
992a25 |
#define dtsize(d) (ssize_t)(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_STAT)
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define DT_PRIME 17109811 /* 2#00000001 00000101 00010011 00110011 */
|
|
Packit |
992a25 |
#define dtcharhash(h,c) (((unsigned int)(h) + (unsigned int)(c)) * DT_PRIME )
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#endif /* _CDT_H */
|