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