#include "xgl.h"
#define SYM(ptr, name) { (void **) &(ptr), (name) }
typedef struct _xglHashFunc {
xglHashTablePtr (*NewHashTable) (void);
void (*DeleteHashTable) (xglHashTablePtr pTable);
void *(*HashLookup) (const xglHashTablePtr pTable,
unsigned int key);
void (*HashInsert) (xglHashTablePtr pTable,
unsigned int key,
void *data);
void (*HashRemove) (xglHashTablePtr pTable,
unsigned int key);
unsigned int (*HashFirstEntry) (xglHashTablePtr pTable);
unsigned int (*HashNextEntry) (const xglHashTablePtr pTable,
unsigned int key);
unsigned int (*HashFindFreeKeyBlock) (xglHashTablePtr pTable,
unsigned int numKeys);
} xglHashFuncRec;
static xglHashFuncRec __hashFunc;
static void *hashHandle = 0;
Bool
xglLoadHashFuncs (void *handle)
{
#ifdef XGL_MODULAR
xglSymbolRec sym[] = {
SYM (__hashFunc.NewHashTable, "_mesa_NewHashTable"),
SYM (__hashFunc.DeleteHashTable, "_mesa_DeleteHashTable"),
SYM (__hashFunc.HashLookup, "_mesa_HashLookup"),
SYM (__hashFunc.HashInsert, "_mesa_HashInsert"),
SYM (__hashFunc.HashRemove, "_mesa_HashRemove"),
SYM (__hashFunc.HashFirstEntry, "_mesa_HashFirstEntry"),
SYM (__hashFunc.HashNextEntry, "_mesa_HashNextEntry"),
SYM (__hashFunc.HashFindFreeKeyBlock, "_mesa_HashFindFreeKeyBlock")
};
if (!xglLookupSymbols (handle, sym, sizeof (sym) / sizeof (sym[0])))
return FALSE;
hashHandle = handle;
return TRUE;
#else
return FALSE;
#endif
}
xglHashTablePtr
xglNewHashTable (void)
{
if (!hashHandle)
return 0;
return (*__hashFunc.NewHashTable) ();
}
void
xglDeleteHashTable (xglHashTablePtr pTable)
{
(*__hashFunc.DeleteHashTable) (pTable);
}
void *
xglHashLookup (const xglHashTablePtr pTable,
unsigned int key)
{
return (*__hashFunc.HashLookup) (pTable, key);
}
void
xglHashInsert (xglHashTablePtr pTable,
unsigned int key,
void *data)
{
(*__hashFunc.HashInsert) (pTable, key, data);
}
void
xglHashRemove (xglHashTablePtr pTable,
unsigned int key)
{
(*__hashFunc.HashRemove) (pTable, key);
}
unsigned int
xglHashFirstEntry (xglHashTablePtr pTable)
{
return (*__hashFunc.HashFirstEntry) (pTable);
}
unsigned int
xglHashNextEntry (const xglHashTablePtr pTable,
unsigned int key)
{
return (*__hashFunc.HashNextEntry) (pTable, key);
}
unsigned int
xglHashFindFreeKeyBlock (xglHashTablePtr pTable,
unsigned int numKeys)
{
return (*__hashFunc.HashFindFreeKeyBlock) (pTable, numKeys);
}