George Peter Staplin: In a Tk project I needed to expose data structures and pointers to Tcl. The usual approach to do this is via a hash table with keys. I believe this is known as an opaque pointer. Some people have also suggested custom Tcl_Obj types. I found that for my needs I could do it via a much simpler method.
See mem_to_obj for the function that is used to store a structure/pointer in a ByteArray.
I use the following code in my project by #include'ing it:
/* REVISION 289 */
#include <string.h>
#ifndef OBJ_TO_MEM_C
#define OBJ_TO_MEM_C
inline int
obj_to_mem ( Tcl_Interp *interp, Tcl_Obj *obj, void *mem, size_t s, char *type_str ) {
int len;
unsigned char *bytes;
bytes = Tcl_GetByteArrayFromObj (obj, &len);
if (s != len) {
Tcl_SetResult (interp, "object size is invalid for a ", TCL_STATIC);
Tcl_AppendResult (interp, type_str, NULL);
return TCL_ERROR;
}
memcpy ((unsigned char *)mem, bytes, s);
return TCL_OK;
}
#endif /* OBJ_TO_MEM_C */Here is an example use:
Drawable d; GC gc; if (TCL_OK != obj_to_mem (interp, objv[1], &d, sizeof (Drawable), "Drawable")) return TCL_ERROR; if (TCL_OK != obj_to_mem (interp, objv[2], &gc, sizeof (GC), "GC")) return TCL_ERROR;
See also mem_to_obj