1/* -*- Mode: c++ -*- 2 * xotclObjectData.c 3 * 4 * Extended Object Tcl (XOTcl) 5 * 6 * Copyright (C) 1999-2008 Gustaf Neumann, Uwe Zdun 7 * 8 * 9 * xotclObjectData.c -- 10 * 11 * XOTcl Object Data, needs XOTCL_OBJECTDATA to be compiled in 12 * 13 */ 14 15#include "xotclInt.h" 16 17#ifdef XOTCL_OBJECTDATA 18extern void 19XOTclFreeObjectData(XOTclClass* cl) { 20 if (cl->opt && cl->opt->objectdata) { 21 Tcl_DeleteHashTable(cl->opt->objectdata); 22 ckfree((char*)cl->opt->objectdata); 23 cl->opt->objectdata = 0; 24 } 25} 26extern void 27XOTclSetObjectData(XOTclObject* obj, XOTclClass* cl, ClientData data) { 28 Tcl_HashEntry *hPtr; 29 int nw; 30 31 XOTclRequireClassOpt(cl); 32 33 if (!cl->opt->objectdata) { 34 cl->opt->objectdata = (Tcl_HashTable*)ckalloc(sizeof(Tcl_HashTable)); 35 Tcl_InitHashTable(cl->opt->objectdata, TCL_ONE_WORD_KEYS); 36 } 37 hPtr = Tcl_CreateHashEntry(cl->opt->objectdata, (char*)obj, &nw); 38 Tcl_SetHashValue(hPtr, data); 39} 40 41extern int 42XOTclGetObjectData(XOTclObject* obj, XOTclClass* cl, ClientData* data) { 43 Tcl_HashEntry *hPtr; 44 if (!cl->opt || !cl->opt->objectdata) 45 return 0; 46 hPtr = Tcl_FindHashEntry(cl->opt->objectdata, (char*)obj); 47 if (data) *data = hPtr ? Tcl_GetHashValue(hPtr) : 0; 48 return hPtr != 0; 49} 50 51extern int 52XOTclUnsetObjectData(XOTclObject* obj, XOTclClass* cl) { 53 Tcl_HashEntry *hPtr; 54 55 if (!cl->opt || !cl->opt->objectdata) 56 return 0; 57 hPtr = Tcl_FindHashEntry(cl->opt->objectdata, (char*)obj); 58 if (hPtr) Tcl_DeleteHashEntry(hPtr); 59 return hPtr != 0; 60} 61#endif 62